如果说最纯粹的面向对象语言,我觉得是Java无疑。而且Java语言的面向对象也是很直观,很容易理解的。class是基础,其他都是要写在class里的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、?Golang没有类(class)。
Golang中并没有明确的面向对象的说法,不能算是一种面向对象的语言。因为:
-
Golang只支持封装,不支持继承和多态
-
Golang只有struct,没有class
-
Golang并没有构造函数和析构函数的概念,这和Go语言的内存回收机制有关系。
对于析构函数,Go提供了defer的关键字,它只要在函数内部实现,等到函数运行结束时便会被自动调用。defer有点像析构函数,但是却不是,因为它的作用范围是函数级别。(后续会整理defer )
当然Go也可以采取其他手段模拟构造函数和析构函数,不过笔者觉得最好不这么做,既然Go特意这么设计,就不希望如此实现。
实在要扯上的话,可以将struct比作其它语言中的class。
类声明
这样就声明了一个类,其中没有public、protected、private的的声明。
golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。
func (r ReceiverType) funcName(parameters) (results)
类方法声明
或者
和其它语言不一样,golang声明方法和普通方法一致,只是在func后增加了poem Poem这样的声明。加和没有加*的区别在于一个是传递指针对象,一个是传递值对象。
二、编写People接口和结构体代码如下(示例):
package main
import "fmt"
//接口定义:人的功能
type PeopleFer interface {
//说
Say()
//讲中文
SayChinese()
//跑
Run()
//跳
Jump()
}
// 结构体声明: 人
type People struct {
Name string "名字"
Age int "年龄"
Sex string "性别"
BloodType string "血型"
}
// 接受者 人,实现say ( p *People 指针接收着 )
func (p *People) Say() {
fmt.Printf("%v 可以说话 say \n", p.Name)
}
// 接受者 人,实现say ( p People 值接收着 )
func (p People) SayChinese() {
fmt.Printf("%v 可以说中文 say \n", p.Name)
}
// 接受者 人,实现Run
func (p *People) Run() {
fmt.Printf("%v 可以跑 run\n", p.Name)
}
// 接受者 人,实现Jump
func (p *People) Jump() {
fmt.Printf("%v 可以跳 jump\n", p.Name)
}
// 实现方法,参数 接口,返回接口
func Impl(x PeopleFer) PeopleFer {
fmt.Print("Impl() 实现方法,参数 接口,返回接口 \n")
return x
}
func main() {
var zSan = People{"张三", 20, "男", "O型"}
fmt.Println(zSan)
//指针接收者
var zSanImpl = Impl(&zSan)
zSanImpl.Say()
zSanImpl.Run()
zSanImpl.Jump()
//值接受者
zSanImpl.SayChinese()
fmt.Println("------------------------------------------------")
zSan = People{"李四", 12, "女", "A型"}
fmt.Println(zSan)
zSanImpl = Impl(&zSan)
zSanImpl.Say()
zSanImpl.Run()
zSanImpl.Jump()
zSanImpl.SayChinese()
}
代码运行输出(如下):