本文共 2816 字,大约阅读时间需要 9 分钟。
结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础。
结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type)。在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样。因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位。type Coordinate struct { X,Y float32}
上述代码定义了一个名为Coordinate的结构体,里面包括了两个float32的变量X,Y。该结构体可用于描述一个平面坐标。
在go语言中,对象方法在结构体定义的外部添加
type Coordinate struct { X,Y float32}func (coo *Coordinate) GetCoordinate() { fmt.Printf("(%.2f, %.2f)\n", coo.X, coo.Y) return }
其中,func关键字后面的(coo *Coordinate),表示该函数传入一个指向Coordinate的指针,可通过指针变量coo来操作结构体的值。
package mainimport ("fmt")func main(){p0 := Coordinate{1,2}p0.GetCoordinate()}
输出:(1.00, 2.00),其中X=1,Y=2
2.按照自定义字段顺序进行初始化
package mainimport ( "fmt")func main(){ p0 := Coordinate{Y:1, X:2} p0.GetCoordinate()}
输出:(2.00,1.00),其中X=2,Y=1
3.通过new函数创建
package mainimport ( "fmt")func main(){ p0 := new(Coordinate) P0.X=1 p0.Y=2 p0.GetCoordinate()}
其中p0 := new(Coordinate)等价于以下写法
p3 := &Coordinate{X:1,Y:2}p3 := &Coordinate{1,2}比较三种创建方式,其中,第一种和第二种,p0均为一个类型为Coordinate的实例,而第三种p0为一个指向Coordinate的指针,相当于 var p0 *Coordinate = new(Coordinate)刚才说了,添加一个对象方法,可以通过func (t *T) functionname() 来创建,其中t是一个指针变量。我们也可以通过值拷贝的方法,添加一个对象方法,语法为 func(t T) functionname()
package mainimport ( "fmt")type Coordinate struct { X, Y float32}func (coo *Coordinate) GetCoordinate() { fmt.Printf("(%.2f,%.2f)\n", coo.X, coo.Y) return}//值拷贝对象方法func (coo Coordinate) SetPosition01(a float32,b float32) { coo.X = a coo.Y = b}//指针变量对象方法func (coo *Coordinate) SetPosition02(a float32,b float32) { coo.X = a coo.Y = b}func main(){ p0 := Coordinate{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方法,发生了值拷贝,即使在方法内改变了coo的值,外部的p0的值没有被改变。而SetPosition02方法中,coo为指向p0地址的指针,由于是通过指针变量修改了X,Y的值,所以调用完毕后,外部p0的值会被修改为(0,0)
package mainimport ( "fmt")func main(){ p_3d := struct { X,Y,Z float32 }{1,2,3} fmt.Println("------输出p_3d--------") fmt.Printf("%v\n%T\n",p_3d, p_3d)}
输出为:
-------输出p_3d-------{1 2 3}struct { X float32; Y float32; Z float32 }
Go语言的结构体没有构造函数,我们可以自己实现。 例如,下方的代码就实现了一个person的构造函数。 因为struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。
func newPerson(name, city string, age int8) *person { return &person{ name: name, city: city, age: age, }}
调用构造函数
p9 := newPerson("张三", "沙河", 90)fmt.Printf("%#v\n", p9) //&main.person{name:"张三", city:"沙河", age:90}转载于:https://blog.51cto.com/13766835/2388863