写点什么

Go 学习笔记之 结构体

发布于: 25 分钟前
Go 学习笔记之 结构体

结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。


用结构体的经典案例是处理公司的员工信息,每个员工信息包含一个唯一的员工编号、员工的名字、家庭住址、出生日期、工作岗位、薪资、上级领导等等。

下面声明了一个叫 Employee 的命名的结构体类型,并且声明了一个 Employee 类型的变量 dilbert:

type Employee struct {    ID        int    Name      string    Address   string    DoB       time.Time    Position  string    Salary    int    ManagerID int}
var dilbert Employee
复制代码

dilbert 结构体变量的成员可以通过点操作符访问:

dilbert.Salary -= 5000 // demoted, for writing too few lines of code
复制代码

或者是对成员取地址,然后通过指针访问:

position := &dilbert.Position*position = "Senior " + *position // promoted, for outsourcing to Elbonia
复制代码

默认值

结构体类型的零值是每个成员都是零值。通常会将零值作为最合理的默认值。

如果结构体没有任何成员的话就是空结构体,写作 struct{}。它的大小为 0,也不包含任何信息,但是有时候依然是有价值的。

seen := make(map[string]struct{}) // set of strings
复制代码

字面值

结构体值也可以用结构体字面值表示,结构体字面值可以指定每个成员的值。

type Point struct{ X, Y int }
p := Point{1, 2}
复制代码

如果要在函数内部修改结构体成员的话,用指针传入是必须的;因为在 Go 语言中,所有的函数参数都是值拷贝传入的,函数参数将不再是函数调用时的原始变量。

func AwardAnnualRaise(e *Employee) {    e.Salary = e.Salary * 105 / 100}
复制代码

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

pp := &Point{1, 2}
复制代码

它和下面的语句是等价的

pp := new(Point)*pp = Point{1, 2}
复制代码

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

发布于: 25 分钟前阅读数: 2
用户头像

坚持分享接地气儿的架构技术文章! 2018.02.26 加入

同名微信公众号「架构精进之路」,专注软件架构研究,技术学习与职业成长!坚持原创总结、沉淀和分享,希望能带给大家一些引导和启发,感谢各位的支持(关注、点赞、分享)!

评论

发布
暂无评论
Go 学习笔记之 结构体