apple developer account:golang | Go语言入门教程——结构体初始化与继续

admin 3个月前 (07-13) 科技 45 0

本文始发于小我私家民众号:TechFlow,原创不易,求个关注


今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部门。

在上一篇文章当中我们一起学习了怎么建立一个结构体,以及怎么给结构体界说函数,另有函数接收者的使用。今天我们来学习一下结构体自己的一些使用方式。

初始化

在golang当中结构体初始化的方式有四种

new关键字

我们可以通过new关键字来建立一个结构体的实例,这种方式和其他语言对照类似,这样会获得一个空结构体指针,当中所有的字段所有填充它类型对应的零值。好比int就对应0,float对应0.0,若是是其他结构体则对应nil。

type Point struct {
 x int
 y int
}

func main() {
 var p *Point = new(Point)
 fmt.Print(p)
}

从这段代码当中我们可以看到,new函数返回的是一个结构体指针,而不是结构体的值。一样平常我们很少用new关键字,而是直接通过结构体加花括号的方式来初始化。

结构体名称

相比于使用new关键字,我们更常用的是通过结构体名称加上花括号的方式来举行初始化。

若是我们不再花括号当中填写参数的话,那么同样会获得一个填充了零值的结构体。结构体当中的所有属性都会被赋予这个类型对应的零值。

type Point struct {
 x int
 y int
}

func main() {
    p := Point{}
 fmt.Print(p)
}

若是我们想要初始化一个结构体的指针,我们只需要在结构体名称之前加上取地址符&即可。以是建立一个结构体指针可以这样:

func main() {
    p := &Point{}
 fmt.Print(p)
}

golang当中取地址符和声明指针的关键字和C语言是一样的,对于熟悉C语言的同砚来说,这应该并不难题。

我们在花括号当中填充参数,这些参数会根据顺序填充到结构体的属性当中。为了防止混淆,我们也可以在值之前加上它对应的属性名称。

func main() {
    p := &Point{0, 0}
    k := &Point{x: 0, y: 10}
 fmt.Print(p)
}

继续

许多人不喜欢golang的主要原因就是以为golang阉割了面向对象的许多功效之后,导致开发的时刻束手束脚,总以为不太利便。其中为人诟病得对照厉害的就是继续,以为golang当中没有继续,写有依赖的结构体的时刻异常蛋疼。

我之前一度也这么以为,最近仔细研究了其中的道道之后,发现我错了,golang当中也是有继续的,不外它实现的方式和我们一样平常明白上的不太一样,有一些出其不意。以是我们拿正统的眼光去看它总会以为它不三不四,那里不太对劲。这种感受有点像是武侠小说里王谢正直看歪路左派的感受,但歪路左派并不代表就不行,也有能打的。

在我们正常的映像当中,我们实现继续就应该是标明当前这个类的父类是哪个类,这样底层编译器自动将父类的属性和方式都拷贝一份到子类当中来。加上private、public等关键词约束,来控制一下什么方式和属性可以被继续什么不可以就完美了。

我们用Python举个例子,Python当中对于继续的界说已经异常简练了,实现起来大概是这样的:

class A:
    pass

class B(A):
    pass

直接在类名的后面就加上继续的信息,实际上绝大多数主流语言也都是这么干的。但golang不是,它做了一件什么事呢?它将父类作为变量界说在了子类的内里,严酷说起来这已经不是继续了,算是一种新鲜的组合,但它起到的功效类似于继续。

我光说明白起来很累,我们来看个例子,好比我们当下有一个父类(结构体),它有两个结构体方式:

type Father struct {
    Name string
}

func(entity Father) Hello() {...}
func(entity Father) World() {...}

现在我们要建立一个它的子类,需要把Father这个结构体填进去,酿成其中一个成员变量

type Child struct {
    Father
    ...
}

那有了这么一个看起来很新鲜的子类之后,我们怎么挪用父类的方式呢?

谜底是直接挪用

child := Child{}
child.Hello()

根据我们的明白,由于父类是子类当中的一个成员,以是我们想要挪用父类的方式,应该写成child.Father.Hello()才对。但实际上golang替我们做了相关的优化,我们直接挪用方式,也可以找到父类当中的方式。

若是我们要改写父类的方式也不难题,我们可以这样操作:

func (entity Child) World() {
    entity.Father.World()
    ...
}

云云,父类当中的World方式就被Child改写了,这样就完成了继续当中对父类函数的改写。

总结

到这里,关于golang当中结构体初始化与继续的先容就竣事了。不知道人人看完这篇有什么样的感受,我最大的感受是似乎没有第一次看到它的时刻那么难以接受了XD。

听说这个设计和C++当中的虚基类的观点异常靠近,然则虚基类异常难以明白(好比我就没能明白),以至于许多C++工程师会自动忽略它的存在。相比之下,golang的这种设计要容易明白得多。虽然看起来贫苦,然则明白起来也并不难题。

今天的文章到这里就竣事了,若是喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。

本文使用 mdnice 排版

,

欧博allbet网址

欢迎进入欧博allbet网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:apple developer account:golang | Go语言入门教程——结构体初始化与继续

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:439
  • 页面总数:0
  • 分类总数:8
  • 标签总数:900
  • 评论总数:123
  • 浏览总数:3178