最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言面向?qū)ο筇匦?封裝、組合、多態(tài))超詳細(xì)講解

 更新時(shí)間:2026年03月18日 09:48:03   作者:我叫黑大帥  
面向?qū)ο缶幊叹哂懈邇?nèi)聚低耦合,易維護(hù)、易擴(kuò)展、易復(fù)用的優(yōu)點(diǎn),而Go語(yǔ)言中也是可以進(jìn)行面向?qū)ο缶幊痰?這篇文章主要介紹了Go語(yǔ)言面向?qū)ο筇匦?封裝、組合、多態(tài))的相關(guān)資料,需要的朋友可以參考下

Go語(yǔ)言面向?qū)ο筇匦栽斀猓ǚ庋b、組合、多態(tài))

Go語(yǔ)言并未遵循傳統(tǒng)面向?qū)ο螅∣OP)的“類(lèi)、繼承、重載”范式,而是以“極簡(jiǎn)實(shí)用”為核心,通過(guò)**結(jié)構(gòu)體(struct)、方法(method)、接口(interface)**三大核心元素,實(shí)現(xiàn)封裝、組合(替代繼承)、多態(tài)三大OOP核心特性。其核心理念是“組合優(yōu)于繼承”,摒棄了傳統(tǒng)OOP的冗余語(yǔ)法,兼顧靈活性與可維護(hù)性。本文將系統(tǒng)梳理Go面向?qū)ο蟮暮诵挠梅?、特性?guī)則及工程實(shí)踐,助力高效掌握Go式OOP編程。

一、核心總覽:Go式OOP的核心邏輯

Go語(yǔ)言無(wú)class、extendsimplements等傳統(tǒng)OOP關(guān)鍵字,其面向?qū)ο缶幊痰暮诵倪壿嬁筛爬椋?/p>

  • 結(jié)構(gòu)體(struct)封裝數(shù)據(jù)(屬性),替代傳統(tǒng)“類(lèi)”的屬性定義;

  • 方法(method)綁定結(jié)構(gòu)體行為,實(shí)現(xiàn)“數(shù)據(jù)+操作”的封裝;

  • 接口(interface)實(shí)現(xiàn)多態(tài),通過(guò)“隱式實(shí)現(xiàn)”簡(jiǎn)化代碼耦合;

  • 結(jié)構(gòu)體組合替代傳統(tǒng)繼承,實(shí)現(xiàn)代碼復(fù)用,規(guī)避繼承層級(jí)臃腫問(wèn)題。

Go式OOP不追求語(yǔ)法形式上的“面向?qū)ο?rdquo;,而是聚焦“解決問(wèn)題”,語(yǔ)法更簡(jiǎn)潔、邏輯更清晰,適合工程化開(kāi)發(fā)。

二、核心特性一:封裝(Encapsulation)

封裝是OOP的基礎(chǔ),指將數(shù)據(jù)(屬性)與操作數(shù)據(jù)的行為(方法)綁定在一起,并控制外部對(duì)數(shù)據(jù)的訪問(wèn)權(quán)限,避免數(shù)據(jù)被非法修改。Go通過(guò)“結(jié)構(gòu)體+方法+大小寫(xiě)訪問(wèn)控制”實(shí)現(xiàn)完整封裝。

1. 結(jié)構(gòu)體:數(shù)據(jù)封裝的載體

結(jié)構(gòu)體(struct)是Go中自定義復(fù)合類(lèi)型,用于組合一組相關(guān)屬性,作為數(shù)據(jù)封裝的核心載體,替代傳統(tǒng)OOP中“類(lèi)”的屬性定義。

// 定義User結(jié)構(gòu)體,封裝用戶相關(guān)屬性
type User struct {
    // 首字母大寫(xiě):導(dǎo)出屬性(公開(kāi)),所有包可訪問(wèn)
    Name string
    Age  int
    // 首字母小寫(xiě):未導(dǎo)出屬性(私有),僅當(dāng)前包內(nèi)可訪問(wèn)
    email string // 私有屬性,外部無(wú)法直接讀寫(xiě)
}  

2. 訪問(wèn)控制規(guī)則(無(wú)public/private關(guān)鍵字)

Go沒(méi)有public、private、protected關(guān)鍵字,通過(guò)標(biāo)識(shí)符首字母大小寫(xiě)控制訪問(wèn)權(quán)限,這是封裝的核心權(quán)限控制手段:

標(biāo)識(shí)符首字母訪問(wèn)權(quán)限適用范圍示例
大寫(xiě)導(dǎo)出(公開(kāi))當(dāng)前包及所有外部包可訪問(wèn)Name、Age、GetInfo()
小寫(xiě)未導(dǎo)出(私有)僅當(dāng)前包內(nèi)部可訪問(wèn)email、calcScore()

3. 方法:結(jié)構(gòu)體的行為綁定

普通函數(shù)屬于“包級(jí)函數(shù)”,而方法是綁定到指定類(lèi)型(結(jié)構(gòu)體/基礎(chǔ)類(lèi)型)的特殊函數(shù),用于實(shí)現(xiàn)結(jié)構(gòu)體的行為,完成“數(shù)據(jù)+操作”的封裝。

(1)方法基礎(chǔ)語(yǔ)法

// 語(yǔ)法格式:(接收器變量 接收器類(lèi)型) 方法名(參數(shù)列表) 返回值列表
func (接收器 類(lèi)型) 方法名(參數(shù)) 返回值 {
    // 方法邏輯(可訪問(wèn)接收器的屬性)
}

核心:接收器(Receiver) 是方法與類(lèi)型的綁定橋梁,通過(guò)接收器可訪問(wèn)綁定類(lèi)型的屬性(包括私有屬性,若在同一包內(nèi))。

(2)兩種接收器類(lèi)型(關(guān)鍵區(qū)別)

根據(jù)接收器傳遞方式,分為“值接收器”和“指針接收器”,二者適用場(chǎng)景不同(結(jié)合指針知識(shí)點(diǎn)):

接收器類(lèi)型語(yǔ)法形式核心特性適用場(chǎng)景
值接收器(u User)傳遞結(jié)構(gòu)體副本,方法內(nèi)修改僅作用于副本,不影響原始數(shù)據(jù)僅讀取數(shù)據(jù)、不修改屬性;結(jié)構(gòu)體體積較?。截愰_(kāi)銷(xiāo)低)
指針接收器(u *User)傳遞結(jié)構(gòu)體內(nèi)存地址,方法內(nèi)修改直接作用于原始數(shù)據(jù)需要修改結(jié)構(gòu)體屬性;結(jié)構(gòu)體體積較大(減少拷貝開(kāi)銷(xiāo))

(3)封裝完整示例

package main

import "fmt"

// 1. 結(jié)構(gòu)體封裝數(shù)據(jù)(屬性)
type User struct {
    Name  string // 公開(kāi)屬性
    Age   int    // 公開(kāi)屬性
    email string // 私有屬性(僅當(dāng)前包可訪問(wèn))
}

// 2. 構(gòu)造函數(shù):創(chuàng)建User實(shí)例(Go無(wú)默認(rèn)構(gòu)造,需手動(dòng)實(shí)現(xiàn))
func NewUser(name string, age int, email string) *User {
    // 私有屬性可在同一包內(nèi)的函數(shù)中賦值
    return &User{
        Name:  name,
        Age:   age,
        email: email,
    }
}

// 3. 值接收器方法:僅讀取數(shù)據(jù)(不修改原始對(duì)象)
func (u User) GetInfo() string {
    return fmt.Sprintf("姓名:%s,年齡:%d", u.Name, u.Age)
}

// 4. 指針接收器方法:修改原始結(jié)構(gòu)體數(shù)據(jù)
func (u *User) SetAge(newAge int) {
    if newAge > 0 && newAge < 150 { // 數(shù)據(jù)合法性校驗(yàn)(封裝的優(yōu)勢(shì))
        u.Age = newAge
    }
}

// 5. 指針接收器方法:讀取私有屬性(提供對(duì)外訪問(wèn)接口)
func (u *User) GetEmail() string {
    return u.email // 同一包內(nèi)可訪問(wèn)私有屬性
}

func main() {
    // 創(chuàng)建User實(shí)例(通過(guò)構(gòu)造函數(shù),而非直接初始化)
    user := NewUser("張三", 20, "zhangsan@example.com")
    
    // 調(diào)用方法
    fmt.Println(user.GetInfo())       // 輸出:姓名:張三,年齡:20
    user.SetAge(25)                   // 修改年齡(指針?lè)椒ǎ?
    fmt.Println(user.GetInfo())       // 輸出:姓名:張三,年齡:25
    fmt.Println("郵箱:", user.GetEmail()) // 訪問(wèn)私有屬性(通過(guò)公開(kāi)方法)
}

核心結(jié)論:封裝的核心價(jià)值的是“數(shù)據(jù)安全+代碼隱藏”——通過(guò)私有屬性限制直接訪問(wèn),通過(guò)公開(kāi)方法控制數(shù)據(jù)讀寫(xiě),同時(shí)隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。

三、核心特性二:組合(替代傳統(tǒng)繼承)

Go語(yǔ)言完全不支持傳統(tǒng)OOP的“繼承”(extends),而是采用“結(jié)構(gòu)體組合”(嵌套結(jié)構(gòu)體)實(shí)現(xiàn)代碼復(fù)用,遵循“has-a”(包含)的關(guān)系,替代傳統(tǒng)繼承的“is-a”(是)關(guān)系,從根源上規(guī)避了繼承層級(jí)臃腫、菱形繼承等問(wèn)題。

1. 組合的核心語(yǔ)法:匿名字段

組合的核心是“結(jié)構(gòu)體嵌套”,當(dāng)嵌套的字段為“匿名字段”(僅寫(xiě)類(lèi)型,不寫(xiě)字段名)時(shí),內(nèi)層結(jié)構(gòu)體的屬性和方法會(huì)自動(dòng)提升到外層結(jié)構(gòu)體,可直接調(diào)用,實(shí)現(xiàn)類(lèi)似繼承的“代碼復(fù)用”效果。

// 基礎(chǔ)結(jié)構(gòu)體:封裝通用屬性和方法
type Person struct {
    Name string
    Age  int
}

// 給Person綁定方法(通用行為)
func (p Person) SayHello() {
    fmt.Printf("你好,我是%s,今年%d歲\n", p.Name, p.Age)
}

// 組合Person結(jié)構(gòu)體:Student包含Person的屬性和方法
type Student struct {
    Person       // 匿名字段:自動(dòng)提升Person的屬性和方法
    School string // Student特有屬性
    Grade  int    // Student特有屬性
}

// Student特有方法
func (s Student) Study() {
    fmt.Printf("%s在%s上%d年級(jí),正在學(xué)習(xí)\n", s.Name, s.School, s.Grade)
}

2. 組合的使用示例

package main

import "fmt"

// 基礎(chǔ)結(jié)構(gòu)體Person(同上)
type Person struct { Name string; Age int }
func (p Person) SayHello() { fmt.Printf("你好,我是%s,今年%d歲\n", p.Name, p.Age) }

// 組合Person的Student(同上)
type Student struct { Person; School string; Grade int }
func (s Student) Study() { fmt.Printf("%s在%s上%d年級(jí),正在學(xué)習(xí)\n", s.Name, s.School, s.Grade) }

// 組合Person的Teacher(另一個(gè)組合類(lèi)型)
type Teacher struct {
    Person    // 匿名字段
    Course string // Teacher特有屬性
}
func (t Teacher) Teach() {
    fmt.Printf("%s老師教授《%s》課程\n", t.Name, t.Course)
}

func main() {
    // 初始化組合結(jié)構(gòu)體(指定嵌套結(jié)構(gòu)體屬性)
    stu := Student{
        Person: Person{Name: "小明", Age: 18},
        School: "北京大學(xué)",
        Grade:  3,
    }
    
    // 直接調(diào)用提升的方法(無(wú)需stu.Person.SayHello())
    stu.SayHello() // 輸出:你好,我是小明,今年18歲
    // 直接訪問(wèn)提升的屬性
    fmt.Println("姓名:", stu.Name) // 輸出:姓名:小明
    // 調(diào)用Student特有方法
    stu.Study() // 輸出:小明在北京大學(xué)上3年級(jí),正在學(xué)習(xí)
    
    // 另一個(gè)組合類(lèi)型的使用
    tea := Teacher{Person: Person{Name: "王老師", Age: 35}, Course: "計(jì)算機(jī)基礎(chǔ)"}
    tea.SayHello() // 輸出:你好,我是王老師,今年35歲
    tea.Teach()    // 輸出:王老師教授《計(jì)算機(jī)基礎(chǔ)》課程
}

3. 組合的優(yōu)勢(shì)(對(duì)比傳統(tǒng)繼承)

  • 靈活性更高:可組合多個(gè)結(jié)構(gòu)體(多維度復(fù)用),而傳統(tǒng)繼承僅能單繼承(或有限多繼承);

  • 無(wú)層級(jí)臃腫:避免繼承導(dǎo)致的“類(lèi)族譜”過(guò)深,代碼邏輯更清晰;

  • 無(wú)菱形繼承問(wèn)題:傳統(tǒng)繼承中多繼承可能導(dǎo)致方法沖突,組合通過(guò)顯式調(diào)用避免該問(wèn)題;

  • 語(yǔ)義更清晰:“has-a”關(guān)系(Student有Person的屬性)比“is-a”(Student是Person)更貼合實(shí)際業(yè)務(wù)場(chǎng)景。

四、核心特性三:多態(tài)(Polymorphism)

多態(tài)是OOP的核心特性之一,指“同一接口,不同實(shí)現(xiàn)”——同一方法調(diào)用,根據(jù)傳入的具體類(lèi)型,執(zhí)行不同的邏輯。Go通過(guò)**接口(interface)**實(shí)現(xiàn)多態(tài),其核心是“隱式實(shí)現(xiàn)”,語(yǔ)法極簡(jiǎn)且靈活。

1. 接口的核心定義

Go的接口是一種“行為約定”,僅聲明方法簽名(無(wú)具體實(shí)現(xiàn)),不包含任何屬性。任何類(lèi)型只要實(shí)現(xiàn)了接口的所有方法,就會(huì)隱式實(shí)現(xiàn)該接口(無(wú)需implements關(guān)鍵字)。

// 定義接口:約定"發(fā)聲"行為
type Animal interface {
    Speak() string // 僅聲明方法簽名(無(wú)實(shí)現(xiàn))
}

核心規(guī)則:接口僅關(guān)注“行為”,不關(guān)注“類(lèi)型本身”——只要類(lèi)型有接口約定的所有方法,就屬于該接口類(lèi)型。

2. 多態(tài)的實(shí)現(xiàn)示例

package main

import "fmt"

// 定義接口(行為約定)
type Animal interface {
    Speak() string
}

// 類(lèi)型1:Dog實(shí)現(xiàn)Animal接口(隱式)
type Dog struct{}
// 實(shí)現(xiàn)Animal的Speak方法
func (d Dog) Speak() string {
    return "汪汪汪!"
}

// 類(lèi)型2:Cat實(shí)現(xiàn)Animal接口(隱式)
type Cat struct{}
// 實(shí)現(xiàn)Animal的Speak方法
func (c Cat) Speak() string {
    return "喵喵喵!"
}

// 類(lèi)型3:Duck實(shí)現(xiàn)Animal接口(隱式)
type Duck struct{}
// 實(shí)現(xiàn)Animal的Speak方法
func (du Duck) Speak() string {
    return "嘎嘎嘎!"
}

// 統(tǒng)一調(diào)用函數(shù):接收Animal接口類(lèi)型(支持所有實(shí)現(xiàn)類(lèi))
func MakeSound(a Animal) {
    fmt.Println("動(dòng)物發(fā)聲:", a.Speak())
}

func main() {
    // 多態(tài)核心:同一函數(shù),傳入不同類(lèi)型,執(zhí)行不同邏輯
    MakeSound(Dog{})   // 輸出:動(dòng)物發(fā)聲: 汪汪汪!
    MakeSound(Cat{})   // 輸出:動(dòng)物發(fā)聲: 喵喵喵!
    MakeSound(Duck{})  // 輸出:動(dòng)物發(fā)聲: 嘎嘎嘎!
}

3. 接口的關(guān)鍵擴(kuò)展(高頻用法)

(1)空接口(interface{})

空接口是沒(méi)有定義任何方法的接口,所有類(lèi)型都自動(dòng)實(shí)現(xiàn)空接口??战涌诔S糜诮邮?ldquo;任意類(lèi)型”的參數(shù)(類(lèi)似Java的Object、Python的任意類(lèi)型)。

// 接收任意類(lèi)型參數(shù)
func PrintAny(v interface{}) {
    fmt.Printf("類(lèi)型:%T,值:%v\n", v, v)
}

func main() {
    PrintAny(100)      // 輸出:類(lèi)型:int,值:100
    PrintAny("Go語(yǔ)言")  // 輸出:類(lèi)型:string,值:Go語(yǔ)言
    PrintAny(Dog{})    // 輸出:類(lèi)型:main.Dog,值:{}
}

(2)類(lèi)型斷言(從接口還原原始類(lèi)型)

當(dāng)接口變量存儲(chǔ)了具體類(lèi)型后,可通過(guò)“類(lèi)型斷言”還原其原始類(lèi)型,用于多態(tài)場(chǎng)景下的特殊邏輯處理。語(yǔ)法:value, ok := 接口變量.(原始類(lèi)型)。

func CheckAnimal(a Animal) {
    // 類(lèi)型斷言:判斷a是否為Dog類(lèi)型
    if dog, ok := a.(Dog); ok {
        fmt.Printf("這是一只狗,發(fā)聲:%s\n", dog.Speak())
    } else if cat, ok := a.(Cat); ok {
        fmt.Printf("這是一只貓,發(fā)聲:%s\n", cat.Speak())
    } else {
        fmt.Println("未知?jiǎng)游镱?lèi)型")
    }
}

func main() {
    CheckAnimal(Dog{}) // 輸出:這是一只狗,發(fā)聲:汪汪汪!
    CheckAnimal(Cat{}) // 輸出:這是一只貓,發(fā)聲:喵喵喵!
}

五、Go面向?qū)ο笞罴褜?shí)踐與避坑指南

1. 接收器選擇規(guī)范(重點(diǎn))

  • 必須修改結(jié)構(gòu)體屬性 → 強(qiáng)制使用指針接收器

  • 結(jié)構(gòu)體體積較大(如包含大數(shù)組、長(zhǎng)字符串) → 優(yōu)先使用指針接收器(減少內(nèi)存拷貝);

  • 僅讀取數(shù)據(jù)、不修改屬性 → 可用值接收器(小結(jié)構(gòu)體優(yōu)先);

  • 同一類(lèi)型的所有方法,接收器類(lèi)型保持統(tǒng)一(工程規(guī)范,避免混亂)。

2. 接口設(shè)計(jì)原則

  • 小接口原則:一個(gè)接口只定義1~2個(gè)方法(如Go標(biāo)準(zhǔn)庫(kù)的io.Reader、io.Writer),靈活組合;

  • 依賴(lài)接口而非具體實(shí)現(xiàn):函數(shù)參數(shù)優(yōu)先聲明為接口類(lèi)型,降低代碼耦合,方便單元測(cè)試;

  • 接口命名規(guī)范:以“er”結(jié)尾(表示“具備某種能力”),如Reader、WriterAnimal。

3. 常見(jiàn)易錯(cuò)點(diǎn)避坑

  • 易錯(cuò)點(diǎn)1:強(qiáng)行模仿傳統(tǒng)繼承 → 過(guò)度嵌套結(jié)構(gòu)體,導(dǎo)致邏輯混亂。 避坑:牢記“組合優(yōu)于繼承”,按需組合結(jié)構(gòu)體,而非強(qiáng)行構(gòu)建繼承層級(jí)。

  • 易錯(cuò)點(diǎn)2:方法與函數(shù)混淆 → 忘記綁定接收器,導(dǎo)致無(wú)法訪問(wèn)結(jié)構(gòu)體屬性。 避坑:結(jié)構(gòu)體的行為必須定義為“方法”(帶接收器),而非普通包級(jí)函數(shù)。

  • 易錯(cuò)點(diǎn)3:接口方法未全部實(shí)現(xiàn) → 編譯報(bào)錯(cuò)。 避坑:實(shí)現(xiàn)接口時(shí),必須實(shí)現(xiàn)接口的所有方法(簽名完全一致,包括參數(shù)、返回值、接收器類(lèi)型)。

  • 易錯(cuò)點(diǎn)4:私有屬性對(duì)外暴露 → 外部包無(wú)法訪問(wèn),卻試圖直接讀寫(xiě)。 避坑:外部包需訪問(wèn)私有屬性時(shí),提供公開(kāi)的Get/Set方法(如GetEmail()、SetAge())。

  • 易錯(cuò)點(diǎn)5:空接口類(lèi)型斷言未判空 → 類(lèi)型不匹配時(shí)觸發(fā)panic。 避坑:類(lèi)型斷言必須通過(guò)ok值判斷是否成功,避免直接使用v.(T)(失敗會(huì)崩潰)。

六、Go OOP與傳統(tǒng)OOP對(duì)比表

OOP核心特性傳統(tǒng)面向?qū)ο螅↗ava/C++)Go語(yǔ)言
核心載體(屬性封裝)class(類(lèi))struct(結(jié)構(gòu)體)
行為綁定(方法)類(lèi)方法(屬于類(lèi))接收器方法(綁定到類(lèi)型)
代碼復(fù)用繼承(extends),is-a關(guān)系結(jié)構(gòu)體組合,has-a關(guān)系
多態(tài)實(shí)現(xiàn)顯式實(shí)現(xiàn)接口(implements關(guān)鍵字)隱式實(shí)現(xiàn)接口(無(wú)需關(guān)鍵字)
訪問(wèn)控制public/private/protected關(guān)鍵字標(biāo)識(shí)符首字母大小寫(xiě)(導(dǎo)出/未導(dǎo)出)
方法重載支持(同一類(lèi)中方法名相同,參數(shù)不同)不支持(方法名必須唯一)

七、綜合實(shí)戰(zhàn)示例(整合三大特性)

以下示例整合“封裝、組合、多態(tài)”三大核心特性,實(shí)現(xiàn)一個(gè)“工作者調(diào)度”場(chǎng)景,貼近實(shí)際工程開(kāi)發(fā)。

package main

import "fmt"

// 1. 定義接口(多態(tài)基礎(chǔ):工作行為約定)
type Worker interface {
    Work() // 所有工作者必須實(shí)現(xiàn)Work方法
}

// 2. 基礎(chǔ)結(jié)構(gòu)體(封裝通用屬性)
type Person struct {
    Name string
    Age  int
}

// 3. 程序員:組合Person,實(shí)現(xiàn)Worker接口(封裝+組合+多態(tài))
type Programmer struct {
    Person        // 組合Person,復(fù)用屬性
    Language string // 特有屬性
}
// 實(shí)現(xiàn)Worker接口的Work方法
func (p Programmer) Work() {
    fmt.Printf("[程序員] %s(%d歲),使用%s語(yǔ)言編寫(xiě)代碼\n", p.Name, p.Age, p.Language)
}

// 4. 教師:組合Person,實(shí)現(xiàn)Worker接口(封裝+組合+多態(tài))
type Teacher struct {
    Person     // 組合Person,復(fù)用屬性
    Course string // 特有屬性
}
// 實(shí)現(xiàn)Worker接口的Work方法
func (t Teacher) Work() {
    fmt.Printf("[教師] %s(%d歲),教授《%s》課程\n", t.Name, t.Age, t.Course)
}

// 5. 醫(yī)生:組合Person,實(shí)現(xiàn)Worker接口(封裝+組合+多態(tài))
type Doctor struct {
    Person      // 組合Person,復(fù)用屬性
    Department string // 特有屬性
}
// 實(shí)現(xiàn)Worker接口的Work方法
func (d Doctor) Work() {
    fmt.Printf("[醫(yī)生] %s(%d歲),在%s科室接診\n", d.Name, d.Age, d.Department)
}

// 6. 統(tǒng)一調(diào)度函數(shù)(多態(tài)核心:接收Worker接口,調(diào)度所有實(shí)現(xiàn)類(lèi))
func DispatchWork(w Worker) {
    w.Work()
}

func main() {
    // 創(chuàng)建不同類(lèi)型的工作者實(shí)例(封裝:通過(guò)構(gòu)造函數(shù)初始化,隱藏細(xì)節(jié))
    prog := Programmer{Person: Person{Name: "李四", Age: 28}, Language: "Go"}
    tea := Teacher{Person: Person{Name: "王老師", Age: 35}, Course: "計(jì)算機(jī)基礎(chǔ)"}
    doc := Doctor{Person: Person{Name: "張醫(yī)生", Age: 42}, Department: "內(nèi)科"}

    // 多態(tài)調(diào)度:同一函數(shù),處理不同類(lèi)型的工作者
    fmt.Println("=== 工作調(diào)度開(kāi)始 ===")
    DispatchWork(prog)
    DispatchWork(tea)
    DispatchWork(doc)
}

運(yùn)行結(jié)果:

=== 工作調(diào)度開(kāi)始 === [程序員] 李四(28歲),使用Go語(yǔ)言編寫(xiě)代碼 [教師] 王老師(35歲),教授《計(jì)算機(jī)基礎(chǔ)》課程 [醫(yī)生] 張醫(yī)生(42歲),在內(nèi)科科室接診

八、核心總結(jié)

  1. Go語(yǔ)言無(wú)“類(lèi)”和“繼承”,通過(guò)“結(jié)構(gòu)體+方法+接口”實(shí)現(xiàn)面向?qū)ο缶幊?,核心理念?ldquo;組合優(yōu)于繼承”;

  2. 三大核心特性:

  • 封裝:結(jié)構(gòu)體封裝數(shù)據(jù),方法綁定行為,大小寫(xiě)控制訪問(wèn)權(quán)限;
  • 組合:嵌套結(jié)構(gòu)體實(shí)現(xiàn)代碼復(fù)用,替代傳統(tǒng)繼承,靈活且無(wú)層級(jí)臃腫;
  • 多態(tài):接口隱式實(shí)現(xiàn),同一接口不同實(shí)現(xiàn),實(shí)現(xiàn)通用調(diào)度;
  1. 語(yǔ)法極簡(jiǎn):無(wú)冗余關(guān)鍵字,隱式接口實(shí)現(xiàn)、接收器綁定等設(shè)計(jì),降低學(xué)習(xí)成本;

  2. 工程原則:小接口、指針接收器優(yōu)先(修改/大對(duì)象)、依賴(lài)接口而非具體實(shí)現(xiàn),寫(xiě)出高效可維護(hù)的Go代碼。

到此這篇關(guān)于Go語(yǔ)言面向?qū)ο筇匦?封裝、組合、多態(tài))的文章就介紹到這了,更多相關(guān)Go語(yǔ)言面向?qū)ο筇匦詢?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言列表List獲取元素的4種方式

    Go語(yǔ)言列表List獲取元素的4種方式

    Golang的列表元素的獲取可以使用內(nèi)置的 Front 函數(shù)獲取頭結(jié)點(diǎn),使用 Back 函數(shù)獲取尾結(jié)點(diǎn),使用 Prev 獲取前一個(gè)結(jié)點(diǎn),使用 Next 獲取下一個(gè)結(jié)點(diǎn),本文就介紹了Go語(yǔ)言列表List獲取元素的4種方式,感興趣的可以了解一下
    2022-04-04
  • Go函數(shù)的使用示例教程

    Go函數(shù)的使用示例教程

    這篇文章主要介紹了Go函數(shù)的使用示例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標(biāo)

    prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標(biāo)

    這篇文章主要為大家介紹了prometheus?client_go為應(yīng)用程序自定義監(jiān)控指標(biāo)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • golang指數(shù)運(yùn)算操作

    golang指數(shù)運(yùn)算操作

    這篇文章主要介紹了golang指數(shù)運(yùn)算操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 一文帶你了解Go語(yǔ)言如何解析JSON

    一文帶你了解Go語(yǔ)言如何解析JSON

    本文將說(shuō)明如何利用?Go?語(yǔ)言將?JSON?解析為結(jié)構(gòu)體和數(shù)組,如果解析?JSON?的嵌入對(duì)象,如何將?JSON?的自定義屬性名稱(chēng)映射到結(jié)構(gòu)體,如何解析非結(jié)構(gòu)化的?JSON?字符串
    2023-01-01
  • Go語(yǔ)言字符串高效拼接的實(shí)現(xiàn)

    Go語(yǔ)言字符串高效拼接的實(shí)現(xiàn)

    這篇文章主要介紹了Go語(yǔ)言字符串高效拼接的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Go語(yǔ)言中循環(huán)與判斷的語(yǔ)法、用法與最佳實(shí)踐

    Go語(yǔ)言中循環(huán)與判斷的語(yǔ)法、用法與最佳實(shí)踐

    本文詳細(xì)介紹了Go語(yǔ)言的if條件判斷、for循環(huán)和switch語(yǔ)句的用法,包括基本語(yǔ)法、高級(jí)用法和實(shí)戰(zhàn)技巧,并指出了一些常見(jiàn)的錯(cuò)誤和最佳實(shí)踐,通過(guò)本文,讀者可以掌握Go語(yǔ)言中的循環(huán)和條件判斷的核心用法,需要的朋友可以參考下
    2026-04-04
  • golang?run時(shí)報(bào)undefined錯(cuò)誤的解決

    golang?run時(shí)報(bào)undefined錯(cuò)誤的解決

    這篇文章主要介紹了golang?run時(shí)報(bào)undefined錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 深入學(xué)習(xí)Golang并發(fā)編程必備利器之sync.Cond類(lèi)型

    深入學(xué)習(xí)Golang并發(fā)編程必備利器之sync.Cond類(lèi)型

    Go?語(yǔ)言的?sync?包提供了一系列同步原語(yǔ),其中?sync.Cond?就是其中之一。本文將深入探討?sync.Cond?的實(shí)現(xiàn)原理和使用方法,幫助大家更好地理解和應(yīng)用?sync.Cond,需要的可以參考一下
    2023-05-05
  • golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類(lèi)型

    golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類(lèi)型

    這篇文章主要介紹了golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類(lèi)型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評(píng)論

平谷区| 乌拉特中旗| 曲水县| 濉溪县| 乌兰浩特市| 鄂托克前旗| 万载县| 积石山| 华容县| 景宁| 台江县| 绥芬河市| 通渭县| 晋城| 仁寿县| 桃园县| 方城县| 余庆县| 三河市| 临海市| 西安市| 饶阳县| 阜南县| 文登市| 东兴市| 剑川县| 松江区| 滁州市| 武义县| 团风县| 电白县| 北流市| 瓮安县| 藁城市| 平武县| 太和县| 亳州市| 会理县| 宜君县| 宝鸡市| 仁寿县|