【Go】语法基础之结构体

结构体的定义很简单:

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系语言似乎是阉割版的,即只有在变量声明时会使用到,并不会涉及到指针操作,虽然觉得奇怪但是这样还是降低了语言难度哈。