什么是结构体?
结构体(结构)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的类,是golang面向对象编程的基础。
结构体的概念在软件工程上的旧术语是ADT(抽象数据类型:抽象的日期类型)。在c++它也是存在,并且名字也是结构体,在面向对象的编程语言中,跟一个无方法的轻量级类一样,因为在去语言中没有类的概念,所以在去中结构体有着很重要的地位。
如何定义一个结构体
<代码>类型协调结构{ X, Y float32 }代码>
上述代码定义了一个名为坐标的结构体,里面包括了两个float32的变量X, y该结构体可用于描述一个平面坐标。
添加对象方法
在去语言中,对象方法在结构体定义的外部添加
<代码>类型协调结构{ X, Y float32 } func(首席运营官*协调)GetCoordinate () { fmt.Printf (“(%。2 f % .2f) \ n”,首席运营官。X, coo.Y) 返回 } 代码>
其中,func关键字后面的(首席运营官*协调),表示该函数传入一个指向坐标的指针,可通过指针变量首席运营官来操作结构体的值。
几种结构体的初始化
-
<李>按照原始字段顺序通过创建结构体
<代码>包主要 导入( “fmt” ) 函数main () { 协调p0:={1,2} p0.GetCoordinate () }代码>
输出:(1.00,2.00),其中X=1, Y=2
李>2。按照自定义字段顺序进行初始化
<代码>包主要 导入( “fmt” ) 函数main () { p0:=协调{Y: 1, X: 2} p0.GetCoordinate () }代码>
输出:(2.00,1.00),其中X=2, Y=1
3。通过新函数创建
<代码>包主要 导入( “fmt” ) 函数main () { p0:=new(协调) P0.X=1 p0.Y=2 p0.GetCoordinate () }代码>
其中p0:=new(坐标)等价于以下写法
p3:=,协调{X: 1, Y: 2}
p3:=,协调{1,2}
比较三种创建方式,其中,第一种和第二种,p0均为一个类型为坐标的实例,而第三种p0为一个指向坐标的指针,相当于var p0 *协调=new(坐标)
添加值拷贝的对象方法
刚才说了,添加一个对象方法,可以通过func (t * t) functionname()来创建,其中t是一个指针变量。我们也可以通过值拷贝的方法,添加一个对象方法,语法为func (t t) functionname ()
<代码>包主要 导入( “fmt” ) 协调型结构{ X, Y float32 } func(首席运营官*协调)GetCoordinate () { fmt.Printf (“(% .2f, % .2f) \ n”,首席运营官。X, coo.Y) 返回 }//值拷贝对象方法 func(首席运营官协调)SetPosition01 (float32 b float32) { 首席运营官。X=一个 首席运营官。Y=b }//指针变量对象方法 func(首席运营官*协调)SetPosition02 (float32 b float32) { 首席运营官。X=一个 首席运营官。Y=b } 函数main () { 协调p0:={1,2} fmt.Print (“SetPosition02调用前:“) p0.GetCoordinate () p0。SetPosition02 (0, 0) fmt.Print (“SetPosition02调用后:“) p0.GetCoordinate () }代码>
输出:
SetPosition01调用前:(1.00,2.00)
SetPosition01调用后:(1.00,2.00)
SetPosition02调用前:(1.00,2.00)
SetPosition02调用后:(0.00,0.00)
从程序输出中可以看的出,调用SetPosition01方法,发生了值拷贝,即使在方法内改变了首席运营官的值,外部的p0的值没有被改变。而SetPosition02方法中,首席运营官为指向p0地址的指针,由于是通过指针变量修改了X, Y的值,所以调用完毕后,外部p0的值会被修改为(0,0)
匿名结构体
<代码>包主要 导入( “fmt” ) 函数main () { p_3d:=struct { X, Y, Z float32 }{1,2,3} fmt.Println(“- - - - - -输出p_3d - - - - - - - - - -”) fmt。Printf (" % v T \ n \ n %”, p_3d, p_3d) }代码>
输出为:
<代码> - - - - - - -输出p_3d - - - - - - - {1 2 3} 结构体{X float32;Y float32;Z float32} 代码>
golang构造函数
去语言的结构体没有构造函数,我们可以自己实现,例如,下方的代码就实现了一个人的构造函数。因为结构是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。