结构体方法和接受者
在go中,没有类的概念但是可以给类型(结构体、自定义类型)定义方法。所谓方法就是定义了接受者的函数。接受者的概念类似于其他语言中的this或self。
- 方法的定义格式
func (接受者变量 接受者类型) 方法名(参数列表) (返回参数) {
函数体
}
- 结构体是值类型
type Person struct {
name string
age int
sex string
}
func main(){
var p1 = Person {
name:"哈哈",
age:20,
sex:"男",
}
p2 := p1
fmt.Println(p1 == p2) // true
p2.Name = "李四"
fmt.Printf("%v %v", p2, p1) //{李四 20 男} {哈哈 20 男}
}
- 接收者类型可以是指针类型和非指针类型
type Person struct {
name string
age int8
sex string
height int8
}
func (p Person) PrintInfo () {
fmt.Printf("姓名:%v 年龄:%v\n", p.name, p.age)
}
//接收的结构体必须是结构体的指针,才能在内部修改其属性
func (p *Person) SetInfo (name string, age int8){
p.name = name
p.age = age
}
func main(){
var p1 = Person{
name:"张三",
age:20,
sex:"男",
}
p1.PrintInfo()
//姓名:张三 年龄:20
var p2 = Person{
name:"李四",
age:30,
sex:"男",
}
p2.PrintInfo()
//姓名:李四 年龄:30
p1.PrintInfo()
//姓名:张三 年龄:20
p1.SetInfo("李四", 34)
p1.PrintInfo()
//姓名:李四 年龄:34
}
- 给任意类型添加方法
在go中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法
type MyInt int
func (m MyInt) printInfo() {
fmt.Println("我是自定义类型中的自定义方法")
}
func main() {
var a MyInt = 20
a.printInfo()
}
- 结构体的匿名字段
结构体允许其成员字段在声明时没有字段名,而只有类型,这种没有名字的字段就称为匿名字段。因为将类型名作为字段名,所有要求匿名结构体的类型必须唯一。
type Person struct {
string
int
}
func main() {
p := Person {
"张三",
20,
}
fmt.Println(p) //{张三 20}
}
结构体的字段类型可以是基本数据类型、切片、Map以及结构体
type Person struct {
name string
age int
hobby []string
map1 map[string]string
}
func main() {
var p Person
p.name = "张三"
p.age = 20
p.hobby = make([]string, 3, 6)
p.hobby[0] = "吃饭"
p.hobby[1] = "睡觉"
p.hobby[2] = "打豆豆"
p.map1 = make(map[string]string)
p.map1["address"] = "北京"
p.map1["phone"] = "139123123123"
fmt.Printf("%#v\n", p)
//main.Person{name:"张三", age:20, hobby:[]string{"吃饭", "睡觉", "打豆豆"}, map1:map[string]string{"address":"北京", "phone":"139123123123"}}
fmt.Printf("%v", p.hobby)//[吃饭 睡觉 打豆豆]
}
%v前面加#代表输出结构体的所有实例
如果结构体的字段类型是指针、slice和map的零值都是nil,即未分配空间。如果需要使用这样的字段,需要先make才能使用
有疑问加站长微信联系(非本文作者)