Go基礎(chǔ)篇-"類"和接口

go語(yǔ)言中沒(méi)有類的概念,它通過(guò)結(jié)構(gòu)體來(lái)實(shí)現(xiàn)類的功能。

// user 類
type user struct {
    name       string
    email      string
}

// admin 類
type admin struct {
    // 自定義類
    person user
    // 內(nèi)置類型
    level string
}

類的實(shí)例化

  // 1. 創(chuàng)建 user 變量,所有屬性初始化為其零值
    var bill user
    fmt.Println(bill) // {  0 false}

    // 2. 創(chuàng)建 user 變量,并初始化屬性值
    vix := user{
        name:       "vix",
        email:      "vix1009@163.com",
    }
    fmt.Println(vix) // {vix vix1009@163.com}
    // 直接使用屬性值,屬性值的順序要與 struct 中定義的一致
    vix2 := user{"vix", "vix1009@163.com"}
    fmt.Println(vix2) // {vix vix1009@163.com}

    // 3. 含有自定義類型的 struct 進(jìn)行初始化
   vix := admin{
        person: user{
            name:       "vix",
            email:      "vix1009@163.com",
        },
        level: "super",
    }
    fmt.Println("vix:",vix) //vix: {{vix vix1009@163.com} super}

方法
方法能給用戶定義的類型添加行為。方法本身也是函數(shù),只是在聲明是在關(guān)鍵字和方法名之間添加一個(gè)參數(shù)(接受者)。

普通的函數(shù)定義 func 方法名(參數(shù)) 返回值{}
自定義類型的方法定義 func (接收者) 方法名(參數(shù)) 返回值{}
type user struct {
    name  string
    email string
}

// 普通的函數(shù)定義 "func 方法名(入?yún)? 返回值"
// 自定義類型的函數(shù)定義 "func (接收者) 方法名(入?yún)? 返回值"
// 值傳遞,拷貝一份 user
func (u user) notify() {
    fmt.Println("pass-by-value", u.name, u.email)
    u.email = "0@qq.com"
}

// 傳遞指針(即地址),內(nèi)部改變會(huì)影響外部
func (u *user) changeEmail(newEmail string) {
    // 不需要 (*u).email
    u.email = newEmail
}

func main() {
    // 1. user類型的值可以用來(lái)調(diào)用使用值接收者聲明的方法
    bill := user{"bill", "1@163.com"}
    bill.notify() // {"bill", "1@163.com"}
    fmt.Println("1", bill.email) // "1@163.com"

    // 2. 指向 user 類型值的指針也可以用來(lái)調(diào)用使用值接收者聲明的方法
    lisa := &user{"lisa", "2@163.com"}
    // 等價(jià)于 (*lisa).notify()
    // 注意:把 lisa 指針指向的 user 對(duì)象復(fù)制了一份,"再?gòu)?qiáng)調(diào)一次,notify 操作的是一個(gè)副本,只不過(guò)這次操作的是從 lisa 指針指向的值的副本。"
    lisa.notify() // {"lisa", "2@163.com"}
    fmt.Println("2", lisa.email) // "0@163.com"(錯(cuò))  2@163.com(對(duì))

    // 3.user 類型的值可以用來(lái)調(diào)用使用指針接收者聲明的方法
    // 等價(jià)于 (&bill).changeEmail ("100@163.com"),注意 changeEmail 接收的是一個(gè)指針
    bill.changeEmail("100@163.com")
    fmt.Println("3", bill.email) // "100@163.com"

    // 4.指向 user 類型值的指針可以用來(lái)調(diào)用使用指針接收者聲明的方法
    lisa.changeEmail("200@163.com")
    fmt.Println("4", lisa.email) // "200@163.com"
}

接口

接口是用來(lái)定義行為的類型。這些行為是通過(guò)方法由用戶定義的類型實(shí)現(xiàn)。
接口定義和實(shí)現(xiàn)

// notifier 是一個(gè)定義了通知類行為的接口
type notifier interface {
    // 接口方法
    notify()
}
# 實(shí)現(xiàn)
// notify 是使用值接收者實(shí)現(xiàn) notifier interface 接口的方法, 對(duì)于值接收者,sendNotification(&u) 和 sendNotification(u) 都可
// sendNotification(&u) 和 sendNotification(u) 都可
func (u user) notify() {
    fmt.Println("notify", u)
}
// notify 是使用指針接收者實(shí)現(xiàn) notifier interface 接口的方法,  對(duì)于指針接收者,只能使用 sendNotification(&u)
// 只能使用 sendNotification(&u)
func (u *user) notify() {
    fmt.Println("notify", *u)
}

持續(xù)更新~

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評(píng)論 25 709
  • HTML標(biāo)簽解釋大全 一、HTML標(biāo)記 標(biāo)簽:!DOCTYPE 說(shuō)明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,530評(píng)論 1 41
  • iOS 9設(shè)計(jì)規(guī)范 中文版 完整版譯者注:本文譯自蘋果官方人機(jī)界面指南 iOS Human Interface G...
    海寧Hennie閱讀 13,643評(píng)論 2 60
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,336評(píng)論 0 17
  • 我想去荷蘭畫畫 我想去海邊彈鋼琴 我想去新西蘭放綿羊 我想去大草原數(shù)星星 我想去洛杉磯看日出 ?我想去倫敦雨中漫步...
    愛簡(jiǎn)書的小萱萱閱讀 197評(píng)論 0 0

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