結(jié)構(gòu)體方法和接受者
在go中,沒有類的概念但是可以給類型(結(jié)構(gòu)體、自定義類型)定義方法。所謂方法就是定義了接受者的函數(shù)榆苞。接受者的概念類似于其他語言中的this或self。
- 方法的定義格式
func (接受者變量 接受者類型) 方法名(參數(shù)列表) (返回參數(shù)) {
函數(shù)體
}
- 結(jié)構(gòu)體是值類型
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)
}
//接收的結(jié)構(gòu)體必須是結(jié)構(gòu)體的指針霞捡,才能在內(nèi)部修改其屬性
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中坐漏,接收者的類型可以是任何類型,不僅僅是結(jié)構(gòu)體碧信,任何類型都可以擁有方法
type MyInt int
func (m MyInt) printInfo() {
fmt.Println("我是自定義類型中的自定義方法")
}
func main() {
var a MyInt = 20
a.printInfo()
}
- 結(jié)構(gòu)體的匿名字段
結(jié)構(gòu)體允許其成員字段在聲明時(shí)沒有字段名赊琳,而只有類型,這種沒有名字的字段就稱為匿名字段砰碴。因?yàn)閷㈩愋兔鳛樽侄蚊锓ぃ幸竽涿Y(jié)構(gòu)體的類型必須唯一。
type Person struct {
string
int
}
func main() {
p := Person {
"張三",
20,
}
fmt.Println(p) //{張三 20}
}
結(jié)構(gòu)體的字段類型可以是基本數(shù)據(jù)類型衣式、切片寸士、Map以及結(jié)構(gòu)體
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前面加#代表輸出結(jié)構(gòu)體的所有實(shí)例
如果結(jié)構(gòu)體的字段類型是指針、slice和map的零值都是nil碴卧,即未分配空間。如果需要使用這樣的字段乃正,需要先make才能使用