golang碎片整理之结构体

  

什么是结构体?

  

结构体(结构)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似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构造函数

  

去语言的结构体没有构造函数,我们可以自己实现,例如,下方的代码就实现了一个人的构造函数。因为结构是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。

golang碎片整理之结构体