Go語(yǔ)言入門(mén)總結(jié)(五)- 結(jié)構(gòu)、接口

結(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)體的話(huà),也可以把結(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)建使用了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容