创建结构体

var

Golang 中的结构体和 C++ 中的差别不大,下面是一个例子

1
2
3
4
5
6
7
8
9
10
11
type Employee struct {
ID int
Name string
Address string
DoB time.Time
Position string
Salary int
ManagerID int
}

var dilbert Employee

一个最显著的区别就是在 C/C++ 中,访问指针成员必须用 -> ,但是 Go 中可以像访问普通变量一样使用点操作符 .

而且在使用结构体指针的时候,不必使用 (*p).x ,直接使用 p.x 即可,Go 会帮你处理的

而且如果你想在函数中修改结构体的话,必须传入指针

使用大写表示可导出也可以算是一个 Go 特色

扯远了,来看下一个创建方式

字面值

1
2
3
type Point struct{ X, Y int }

p := Point{1, 2}

这是只按顺序给出值的写法,不常用,只在简单或成员排练比较规则的时候才可能用

下面的方式才是最常用的

1
2
3
4
5
6
type Point struct{ X, Y int }

p := Point{
X: 1,
Y: 2,
}

因为结构体通常通过指针处理,可以用下面的写法来创建并初始化一个结构体变量,并返回结构体的地址

1
pp := &Point{1, 2}

它和下面的语句是等价的

1
2
pp := new(Point)
*pp = Point{1, 2}

不过 &Point{1, 2} 写法可以直接在表达式中使用,比如一个函数调用

比较结构体

如果结构体中所有的成员都是可以比较的,那么它就可以使用 == 或是 != 来比较

凭借这一点,你可以构造可比较的结构体来作为 map 的键

匿名结构体