結(jié)構(gòu)三幻、接口
go語(yǔ)言里沒(méi)有類(lèi)的概念就漾,也不支持繼承。但是念搬,通過(guò)組合結(jié)構(gòu)和方法抑堡,就可以實(shí)現(xiàn)面向?qū)ο笤O(shè)計(jì)的相關(guān)概念。
1.結(jié)構(gòu)(struct)
熟悉java的同學(xué)可以把它理解為一個(gè)bean的結(jié)構(gòu)體朗徊。
結(jié)構(gòu)體里面包含多個(gè)定義的數(shù)據(jù)名稱(chēng)及類(lèi)型首妖。
func main() {
var people struct{
name string
age int
}
people.name = "張三"
people.age = 18
fmt.Println(people)
}
當(dāng)然如果有很多地方使用到這個(gè)結(jié)構(gòu)體的話,也可以把結(jié)構(gòu)體定義為type類(lèi)型爷恳,這樣就可以通過(guò)var之類(lèi)的方式初始化很多該結(jié)構(gòu)體有缆。
func main() {
type people struct{
name string
age int
}
var people1 = people{name: "張三",age: 18}
var people2 = people{name: "李四",age: 19}
fmt.Println(people1,people2)
}
結(jié)構(gòu)的作用是將多個(gè)值打包組合成一個(gè)單元。
結(jié)構(gòu)也可以構(gòu)成切片類(lèi)型温亲,把結(jié)構(gòu)當(dāng)做一個(gè)普通的類(lèi)型切片使用就可以了棚壁。
和普通類(lèi)型type定義方法一樣,也可以為結(jié)構(gòu)定義方法铸豁。
func main() {
var people1 = people{name: "張三",age: 18}
var people2 = people{name: "李四",age: 19}
fmt.Println(people1.getPeopleNameAge(),people2.getPeopleNameAge())
}
type people struct{
name string
age int
}
func (p people)getPeopleNameAge() string{
return p.name + " " + strconv.Itoa(p.age)
}
2.結(jié)構(gòu)的合并組合
對(duì)于有大量數(shù)據(jù)的結(jié)構(gòu)來(lái)說(shuō)灌曙,如果結(jié)構(gòu)體里面充斥著大量數(shù)據(jù),肯定不是啥好事节芥,畢竟管理起來(lái)也挺費(fèi)事的在刺。
這個(gè)時(shí)候我們可以把結(jié)構(gòu)體里面的內(nèi)容再拆分成很多小的結(jié)構(gòu)體,這樣小的結(jié)構(gòu)體可以單獨(dú)使用头镊,大的結(jié)構(gòu)體數(shù)據(jù)也是完整的蚣驼。
func main() {
peopleSkill := peopleSkill{id: 0,people: people{name : "張三",age:18},skill: skill{skillName:"鋼琴",time: 3}}
fmt.Println(peopleSkill)
//如果要調(diào)用子結(jié)構(gòu)的方法,可以通過(guò)點(diǎn)的方式調(diào)用
peopleSkill.people.getPeopleNameAge()
//也可以給父結(jié)構(gòu)體定義一個(gè)轉(zhuǎn)發(fā)相艇,然后調(diào)用
peopleSkill.getPeopleNameAge()
}
type people struct{
name string
age int
}
type skill struct {
skillName string
time int32
}
type peopleSkill struct {
id int
people people
skill skill
}
func (p people)getPeopleNameAge() string{
return p.name + " " + strconv.Itoa(p.age)
}
//也可以給父結(jié)構(gòu)體定義一個(gè)轉(zhuǎn)發(fā)
func (p peopleSkill)getPeopleNameAge() string{
return p.people.getPeopleNameAge()
}
當(dāng)然颖杏,定義結(jié)構(gòu)體時(shí)舍棄其它結(jié)構(gòu)體的字段名,就可以實(shí)現(xiàn)自動(dòng)轉(zhuǎn)發(fā)坛芽。除了轉(zhuǎn)發(fā)留储,還能自動(dòng)調(diào)用子結(jié)構(gòu)的字段翼抠。
//將peopleSkill這樣定義,上面main中調(diào)用的方法可以正常使用
type peopleSkill struct {
id int
people
skill
}
//在main中還可以這樣調(diào)用其子結(jié)構(gòu)的字段
func main() {
peopleSkill := peopleSkill{id: 0,people: people{name : "張三",age:18},skill: skill{skillName:"鋼琴",time: 3}}
peopleSkill.skillName
peopleSkill.age
}
3.接口
go語(yǔ)言里的接口沒(méi)有繼承概念获讳,只要實(shí)現(xiàn)了接口里的方法就屬于該接口類(lèi)型阴颖,這樣在一個(gè)函數(shù)接受該接口的時(shí)候,所有符合規(guī)則的類(lèi)型和結(jié)構(gòu)都是適用的丐膝。
對(duì)于實(shí)現(xiàn)了接口的類(lèi)型或結(jié)構(gòu)體量愧,如果嵌入在了另一個(gè)結(jié)構(gòu)體里面,那么該結(jié)構(gòu)體也相當(dāng)于實(shí)現(xiàn)了這個(gè)接口帅矗。
func main() {
peopleSkill := peopleSkill{id: 0, people: people{name: "張三", age: 18}, skill: skill{skillName: "鋼琴", time: 3}}
music = peopleSkill.skill
fmt.Println(music.startMusic())//使用 鋼琴 演奏了歌曲
music = peopleSkill.people
fmt.Println(music.startMusic())//張三 唱起了歌
music = peopleSkill
fmt.Println(music.startMusic())//張三使用 鋼琴 演奏了歌曲
}
var music interface {
startMusic() string
}
type people struct {
name string
age int
}
type skill struct {
skillName string
time int32
}
type peopleSkill struct {
id int
people
skill
}
func (p people) startMusic() string {
return p.name + " 唱起了歌"
}
func (s skill) startMusic() string {
return "使用 " + s.skillName + " 演奏了歌曲"
}
func (p peopleSkill) startMusic() string {
return p.name + "使用 " + p.skillName + " 演奏了歌曲"
}
如果需要多個(gè)繼承了接口的變量偎肃,可以將var換成type類(lèi)型,這樣就可以隨意創(chuàng)建使用了浑此。