目录
结构体
go中的结构体,就相当于面向对象的类。
一、什么是结构体?
结构体是用户定义的类型,表示一系列属性的集合。
(Python中的类:一系列属性和方法的集合。)
有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。
例如,一个职员有 firstName
、lastName
和 age
三个属性,而把这些属性组合在一个结构体 employee
中就很合理。
二、结构体的声明
语法:
type 结构体的名字 struct {
属性 类型
属性 类型
。。。
}
三、创建结构体
1、创建有名结构体
type Person struct {
name string
age int
gender int
}
func main() {
var p = Person{}
// p:=Person{}
}
2、结构体初始化
2.1 按位置传参
type Person struct {
name string
age int
gender int
}
func main() {
var p Person = Person{"donner",19,1}
fmt.Println(p)
}
{donner 19 1}
2.2 按关键字传
可以乱序,可以少传。
type Person struct {
name string
age int
gender int
}
func main() {
var p Person = Person{gender:1,name:"donner"}
fmt.Println(p)
}
{donner 0 1}
3、创建匿名结构体
没有名字的结构体。需要定义在函数内部。不需要type关键字。
只是用一次,可以把一堆属性封装到对象中。
语法:
var 变量名 = struct {
属性 类型
属性 类型
。。。
}{初始化传参}
范例:
func main() {
var obj = struct {
name string
age int
gender int
}{name:"noname"}
fmt.Println(obj)
}
{noname 0 0}
四、结构体的类型
结构体是值类型。
结构体的类型名就是结构体的名称。
type Person struct {
name string
age int
gender int
}
func main() {
var p = Person{}
//p:=Person{}
fmt.Printf("%T", p) // main.Person
}
五、结构体的默认值、
结构体的默认值就是包含属性默认值的结构体。
结构体属性的默认值就是属性类型的默认值。
type Person struct {
name string
age int
gender int
}
func main() {
var p = Person{}
p.name = "donner"
fmt.Println(p)
}
{donner 0 0}
六、访问结构体的字段
通过点点点就可以访问。
type Person struct {
name string
age int
gender int
}
func main() {
var p Person = Person{gender:1,name:"donner"}
fmt.Println(p.name) // donner
}
七、结构体的指针
var p Person = Person{gender:1,name:"donner"}
var pPointer *Person=&p
fmt.Println(pPointer) // &{donner 0 1}
fmt.Println(*pPointer) // {donner 0 1}
八、匿名字段
只有类型,没有名字的字段。
但是默认匿名字段的类型名就是匿名字段的名称。
同一个类型的匿名字段只能出现一次。
type Person2 struct {
string
int
}
// 按位置
var p = Person2{"name",18}
fmt.Println(p)
// 按关键字(类型就是关键字)
var p = Person2{int:18,string:"name"}
fmt.Println(p)
// 获取匿名字段的属性
var p = Person2{int:18,string:"name"}
fmt.Println(p.int) // 18
九、嵌套结构体
结构体嵌套结构体,即为结构体中的某个字段也是结构体。
type Hobby struct {
hobbyName string
hobbyTime string
}
type Person3 struct {
name string
age int
hobby Hobby
}
// 按位置传参
var p = Person3{"donner",18,Hobby{"rap","1year"}}
fmt.Println(p) // {donner 18 {rap 1year}}
// 按关键字自传参
var p = Person3{name:"donner",hobby:Hobby{hobbyTime:"1year",hobbyName:"rap"},age:18}
fmt.Println(p) // {donner 18 {rap 1year}}
// 获取嵌套结构体的属性
p.hobby.hobbyName = "篮球"
fmt.Println(p) // {donner 18 {篮球 1year}}
十、提升字段
提升字段:如果嵌套结构体字段是一个匿名字段,那么该嵌套结构体中的字段可以被大结构体直接点出。
type Hobby struct {
hobbyName string
hobbyTime string
}
type Person4 struct {
name string
age int
Hobby
}
var p = Person4{"donner",18,Hobby{"rap","1year"}}
// 字段未提升前,需一层一层点出
fmt.Println(p.Hobby.hobbyName) // rap
// 字段提升后,一步到位
fmt.Println(p.hobbyName) // rap
十一、导出结构体和字段
导出结构体(大小写)和字段(大小写)。
如果结构体名称以大写字母开头,则它是其他包可以访问的导出类型。同样,如果结构体里的字段首字母大写,它也能被其他包访问到。
十二、结构体相等性
结构体是值类型。
如果它的每一个字段都是可比较的,则该结构体也是可比较的。
如果两个结构体变量的对应字段相等,则这两个变量也是相等的。
如果结构体包含不可比较的字段,则结构体变量也不可比较。