Go语言面向对象编程 Go语言的面相对象和主流语言有很大的不同,如Go 语言里是不支持继承,Go语言的接口实现也不太一样 1. 数据和行为的封装 数据的封装 定义一个结构体 type Employee
Go语言面向对象编程
Go语言的面相对象和主流语言有很大的不同,如Go 语言里是不支持继承,Go语言的接口实现也不太一样
1. 数据和行为的封装
type Employee struct {
Id string Name string Age string}
func TestStruck (
t *testing.T) {
//初始化一个结构体 e :
= Employee{
"1",
"李比",
"20"}
e1 :
= Employee{
Id:
"2",
Age:
"23"}
//使用new关键字返回一个指向这个结构体的指针,相当于使用了取地址符"&" e2 :
= new(
Employee)
e2.Age = "30"}
PS:使用new关键字会返回结构体的指针、使用.就可以直接访问指针指向的结构体内的元素
- 行为(方法)的定义在这个例子里,我们任然使用上面已经定义好了的结构体。定义一个结构体的行为只要在这个函数前面
type Employee struct {
Id string Name string Age string}
//使用这种方法定义的行为在使用自己(this)的时候会进行值的复制func (
e Employee)
getString()
string {
return e.Id+","+e.Name+","+e.Age}
//使用指针传入的话就会避免内存拷贝func (
e *Employee)
getStringPtr()
string {
return e.Id+","+e.Name+","+e.Age}
2. 接口
//=========接口定义==========type Programmer interface {
writeCode()
string}
//=========接口实现==========type GoProgrammer struct { }
func (
g *GoProgrammer)
writeCode()
string {
return "fmt.println(\"hello world\")"}
可以看见,Go语言的接口实现完全没有看见依赖。实现接口的结构体只需要拥有和接口一样函数名和函数签名的函数就可以认为他实现了接口
因为接口的实现是非入侵性的,Go可以实现先定义实例,后面再去提出公共部分
func TestInterface(
t *testing.T) {
var programmer Programmer programmer = new(
GoProgrammer)
t.Log(
programmer.writeCode())}
3. 扩展与复用
用于Go不支持继承,因此Go语言的扩展也变成了Go语言里争议最大的部分
//======父类 宠物类======type Pat struct {}
func (
p *Pat)
speak() {
fmt.Println(
"...")}
func (
p *Pat)
speakTo(
host string) {
p.speak()
fmt.Println(
host)}
//======子类 狗