自定义类型
//将NewString定义为string类型
type NewString string
类型别名
type byte = uint8
type rune = int32
go 结构体
Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体
定义结构体
type StructName struct {
field1 fieldType
field2 fieldType
…
}
type person struct {
name string
city string
age int8
}
创建指针类型结构体
可以通过new函数进行实例化,得到一个结构体的指针
var p2 = new(person)
fmt.Printf("%T\n", p2) //*main.person
fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"", city:"", age:0}
结构体实例化的三种方式
// 方式1
var p1 person
// 方式2
// var p2 = new(person)
// 方式2
// var p3 := &person{}
p1.name = "name"
p1.age = 18
p1.city = "city"
fmt.Printf("p1=%#v\n", p1) //p1=&main.person{name:"name", city:"city", age:18}
结构体初始化
没有初始化的结构体,结构体字段的值都是对应类型的0值, 例如:
var p1 person
- 方式1,通过
.
的方式对字段直接赋值进行初始化
p1.name = "name"
p1.age = 18
p1.city = "city"
- 方式2,通过键值对赋值的方式初始化
p1 := person{
name: "name",
city: "city",
age: 18,
}
- 方式3,通过结构体指针进进行初始化
p1 := &person{
name: "name",
city: "city",
age: 18,
}
- 方式4,根据字段的顺序,直接传入对应的值
p1 := &person{"name", "city", 18}
空结构体
// 空结构体不占用空间
var person struct{}
fmt.Println(unsafe.Sizeof(person)) // 0
方法的定义
func (receiver receiverType) methodName(params) (returnValueType) {
...
}
方法接收者
指定接收者,相当于python中传入self
- 接收者的两种类型:
- 值类型接收者
- 指针类型接收者
- 指针类型作为方法接收者使用场景:
如果用到了指针接收者,为保证代码一致性,那么应尽量保证其他方法也都使用指针类型的接收者,不应混用
- 需要修改接收者的字段值(属性值)
- 比较大的结构体作为接收者传入
嵌套结构体
// Address 结构体
type Address struct {
Province string
City string
}
// User 结构体
type User struct {
Name string
Gender string
Address // 匿名字段, 可省略类型, 也可传入指针类型的 *Address
}
嵌套结构体的查找顺序
当访问结构体属性或方法时,先在当前结构体中查找该字段,若未找到再去嵌套的匿名字段中查找。
嵌套结构体适用场景
虽然golang没有像其他语言一样比较明确的使用面向对象,但嵌套结构体可理解为其他语言中的继承。
有疑问加站长微信联系(非本文作者)