## 1 概述 结构体是由成员构成的复合类型。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。 结构体成员,也可称之为成员变量,字段,属性。属性要满足唯一性。 结构体的概念在软件工程上旧的术语叫 ADT(抽象数据类型:Abstract Data Type) 数据层面,结构体是自定义数据类型,可以理解成是由一系列具有相同或不同类型的数据构成的数据集合。因此结构体也被称之为抽象数据类型(ADT,Abstract Data Type)。 在Go语言中,结构体承担着面向对象语言中类的作用。 Go语言中,结构体本身仅用来定义属性。还可以通过接收器函数来定义方法,使用内嵌结构体来定义继承。这样使用结构体相关操作Go语言就可以实现OOP面向对象编程了。 我们先看结构体相关语法,再看OOP相关的。 <!-- more --> ## 2 定义语法 ``` type identifier struct { field1 type1 field2 type2 ... } // 或者 同一类型的字段,可以定义在一行 type identifier struct { field1, field2 int } ``` ## 3 实例化 Go语言提供了以下几种方法实例化: ``` // T表示结构体标识符,v结构体变量 var v T v := T{} // var v = T{} v := new(T) v := &T{} // var v = &T{} ``` 以上方法中,`var v T ` 和 `v := T{} // var v = T{}` 会返回结构体变量,而 `v := new(T)` 和 `v := &T{} // var v = &T{}` 会返回结构体指针。 ## 4 值类型 注意,结构体是**值类型**,不是引用类型。因此使用不同方式实例化的,在赋值时效果时不一样的,需要注意。 `var v T ` 和 `v := T{} // var v = T{}` 值传递。 `v := new(T)` 和 `v := &T{} // var v = &T{}` 引用地址传递。 Go语言会对结构体类型指针做自解析。也就是说,即使获得的是结构体指针,也不需要使用 `*v` 的语法。 ``` v := &T{} // 直接使用v.语法即可。自动解析了 *v v.field // 相当于,也可以这么用 (*v).field ``` ## 5 初始化属性 使用类似于键值对的语法初始化结构体属性,但此处的键指的是结构体内字段: ``` v := T{ field1: value1, field2: value2, … } ``` 如果我们初始化*全部*的结构体字段,可以按照定义*顺序*仅仅使用数据部分即可完成初始化: ``` // 要满足全部字段,按照定义顺序 v := T{ value1, value2, value3, } ``` ## 6 `.` 成员访问运算符点号 要访问结构体成员,需要使用点号 `.` 操作符,格式为: ``` v.field // 获取 fmt.Println(v.field) // 设置 v.field = new-value ``` ## 7 匿名结构体 匿名结构体没有类型名称,只有字段和类型定义,无须通过type关键字定义就可以直接使用。匿名结构体的初始化写法由结构体定义和键值对初始化两部分组成。如下所示: ``` v := struct { field1 type1 field2 type2 }{ field1: value1, field2: value2, } ``` 注意,匿名结构体,必须要同时初始化,不能仅仅定义匿名结构体。 当需要使用一个临时结构体类型时,可以使用匿名结构体。 第一部分完!后续部分为 构造函数,方法,继承 与OOP相关的内容。 原文出自:[小韩说课](http://www.hellokang.net/go/go-struct-i/) 微信关注:小韩说课 ![小韩说课](http://www.hellokang.net/images/wechat_subscription.jpg)