結(jié)構(gòu)體及其使用方法
結(jié)構(gòu)體的定義
package main
import "fmt"
type Shengwu struct {
life bool
cell bool
age int
}
type Animal struct {
name string
age int
Shengwu //嵌入類(lèi)型
}
func New() Animal{
s := Shengwu{age: 100,life:true,cell:true}
return Animal{
name: "wenxuwan",
age: 10,
Shengwu: s,
}
}
func (s Shengwu)setAge(age int){
s.age = age
}
//PrintAge函數(shù)兩個(gè)結(jié)構(gòu)體里面都有韧献,如果直接用animal調(diào)用會(huì)發(fā)生屏蔽現(xiàn)象
func (s *Shengwu)PrintAge(){
fmt.Println("The shengwu age is:",s.age)
}
func (a *Animal) PrintAge(){
fmt.Println("The annimal age is:",a.age)
}
func (a Animal) PrintName(){
fmt.Println("The annimal name is :",a.name)
}
func (a *Animal) SetAge(age int){
a.age = age
}
func (a Animal) SetAgeCp(age int){
a.age = age
}
func main(){
animal1 := New()
animal1.PrintName()
//animal1.SetAge(100)
animal1.SetAgeCp(1000)
animal1.PrintAge()
}
Go語(yǔ)言用嵌入式字段實(shí)現(xiàn)了繼承嗎?牲证?
GO語(yǔ)言不存在所謂的繼承哮针,只有組合。組合和繼承的區(qū)別就在于坦袍,組合是非侵入式的十厢,而繼承是侵入式的。也就是說(shuō)組合子類(lèi)不需要關(guān)注父類(lèi)的東西捂齐。只需要嵌入進(jìn)來(lái)就可享受父類(lèi)的一切蛮放。
GO語(yǔ)言不存在所謂的繼承,更不是通過(guò)嵌入實(shí)現(xiàn)繼承5煲恕I肝洹!
值方法和指針?lè)椒ǘ际鞘裁匆馑伎嫠惺裁磪^(qū)別徘六??榴都?
func (a *Animal) SetAge(age int){
a.age = age
}
func (a Animal) SetAgeCp(age int){
a.age = age
}
兩個(gè)方法都是改變變量age的值待锈,唯一的區(qū)別在于前面的接收者一個(gè)是指針一個(gè)是變量。主要區(qū)別有三點(diǎn):
1.值方法對(duì)值得成員的修改一般不會(huì)改變外面值得值嘴高,除了引用類(lèi)型竿音。但指針的會(huì)修改原值和屎。
2.一個(gè)自定義的數(shù)據(jù)類(lèi)型只包含它的值方法,但類(lèi)型的指針卻涵蓋了所有的值方法和所有的指針?lè)椒ā?
animal1 := New()
//animal1.PrintName()
animal1.SetAge(100) //go自動(dòng)將annimal1轉(zhuǎn)成了&animal
3.老師的demo30很清楚講的春瞬。
思考題
1.我們可以在結(jié)構(gòu)體類(lèi)型中嵌入某個(gè)類(lèi)型的指針嗎柴信,如果可以,有哪些注意事項(xiàng)宽气?
可以的随常,鏈表就這樣干的。注意賦值萄涯,不用直接使用绪氛。
字面變量struct{}代表什么?有什么用涝影?
個(gè)人感覺(jué)枣察,代表沒(méi)有屬性,但擁有結(jié)構(gòu)體的功能燃逻,比如擁有方法序目。