结构体的定义很简单:
type Vertex struct {
X, Y float64
}
可以理解为多个变量的集合。
结构体的使用:
1、直接使用:
v := Vertex{1, 2}
或
var v = Vertex{1, 2}
2、通过new关键字:
v := new(Vertex)
3、通过指针访问:
v := &Vertex{1, 2}
为结构体添加方法:
package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} v.Scale(5) fmt.Println(v, v.Abs()) }
给结构体添加方法,就是在定义方法的时候在func和方法名之间加一个括号,加入该结构体的指针引用(也可以是值引用)。
这里值得注意的是指针引用和值引用的区别:
指针引用可以对结构体内部数据进行修改,而值引用不可以,如下面的例子:
package main import ( "fmt" ) type Vertex struct { X, Y int } //值引用 func (v Vertex) show() { v.X = 1 } //指针引用 func (v *Vertex) show1() { v.X = 1 } func main() { v := &Vertex{3, 4} v.show() fmt.Println(v.X) //输出:3 v.show1() fmt.Println(v.X) //输出:1 }
可以看出若在结构体的方法定义时没有使用指针引用,是无法改变结构体的成员变量值的。
总结:golang是非面向对象语言,对于写java比较多的我还是有点难以接受的,可能C系同学更易接受吧。若非要比较,也可以说go语言中的结构体类似java中的类,但是很明显缺少继承多态等等OO的特性。
另外,go中的指针相比较于C系语言似乎是阉割版的,即只有在变量声明时会使用到,并不会涉及到指针操作,虽然觉得奇怪但是这样还是降低了语言难度哈。
有疑问加站长微信联系(非本文作者)