欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中結(jié)構(gòu)體嵌套接口的實(shí)現(xiàn)

 更新時(shí)間:2023年04月03日 09:35:28   作者:raoxiaoya  
本文主要介紹了golang中結(jié)構(gòu)體嵌套接口的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在golang中結(jié)構(gòu)體A嵌套另一個(gè)結(jié)構(gòu)體B見(jiàn)的很多,可以擴(kuò)展A的能力。

A不僅擁有了B的屬性,還擁有了B的方法,這里面還有一個(gè)字段提升的概念。

示例:

package main

import "fmt"

type Worker struct {
?? ?Name string
?? ?Age int
?? ?Salary
}

func (w Worker) fun1() {
?? ?fmt.Println("Worker fun1")
}

type Salary struct {
?? ?Money int
}

func (s Salary) fun1() {
?? ?fmt.Println("Salary fun1")
}
func (s Salary) fun2() {
?? ?fmt.Println("Salary fun2")
}

func main() {
?? ?s := Salary{}
?? ?w := Worker{Salary: s}

?? ?//w.Name
?? ?//w.Age
?? ?//w.Money
?? ?//w.Salary
?? ?//w.fun1()
?? ?//w.fun2()
?? ?//w.Salary.fun1()
?? ?//w.Salary.fun2()
}

很明顯現(xiàn)在 Worker 強(qiáng)依賴(lài)與 Salary ,有時(shí)候我們希望 Worker 只依賴(lài)于一個(gè)接口,這樣只要實(shí)現(xiàn)了此接口的對(duì)象都可以傳遞進(jìn)來(lái)。

優(yōu)化后:

package main

import "fmt"

type Inter1 interface {
?? ?fun1()
?? ?fun2()
}

type Worker struct {
?? ?Name string
?? ?Age int
?? ?Inter1
}

func (w Worker) fun1() {
?? ?fmt.Println("Worker fun1")
}

type Salary struct {
?? ?Money int
}

func (s Salary) fun1() {
?? ?fmt.Println("Salary fun1")
}
func (s Salary) fun2() {
?? ?fmt.Println("Salary fun2")
}

func main() {
?? ?s := Salary{}
?? ?w := Worker{Inter1: s}

?? ?//w.Age
?? ?//w.Name
?? ?//w.fun1()
?? ?//w.fun2()
?? ?//w.Inter1
?? ?//w.Inter1.fun1()
?? ?//w.Inter1.fun2()
?? ?// 無(wú)法訪問(wèn) Money 屬性,可以增加方法來(lái)實(shí)現(xiàn)
}

Worker 依賴(lài)一個(gè) Inter1 接口,只要實(shí)現(xiàn)了 Inter1 的對(duì)象都可以注入。
Worker 也實(shí)現(xiàn)了 Inter1 接口。
Worker 可以重新實(shí)現(xiàn) Inter1 接口的方法。

golang的context標(biāo)準(zhǔn)庫(kù)就是這樣實(shí)現(xiàn)的context之間的嵌套。

另外,需要注意的是,一個(gè)結(jié)構(gòu)體包含了一個(gè)接口,那么此結(jié)構(gòu)體自然就是這個(gè)接口的一個(gè)實(shí)現(xiàn),即便這個(gè)結(jié)構(gòu)體沒(méi)有實(shí)現(xiàn)任何方法

type man interface {
?? ?Eat(args ...any)
}

type dog struct {
?? ?man
}

func testDog() {
?? ?d := dog{}
?? ?d.Eat(1)
}

顯然這里的調(diào)用會(huì)報(bào)錯(cuò)。

golang接口的這種隱式的實(shí)現(xiàn)特性,會(huì)導(dǎo)致某個(gè)對(duì)象無(wú)意間就實(shí)現(xiàn)了某個(gè)接口,然而對(duì)于一些底層接口卻需要保持其封閉性,為了達(dá)到這個(gè)目的,通常的做法是,在接口中有特殊含義的方法,比如runtime.Error接口,注釋就說(shuō)明了意圖

// The Error interface identifies a run time error.
type Error interface {
?? ?error

?? ?// RuntimeError is a no-op function but
?? ?// serves to distinguish types that are run time
?? ?// errors from ordinary errors: a type is a
?? ?// run time error if it has a RuntimeError method.
?? ?RuntimeError()
}

或者定義一個(gè)無(wú)法導(dǎo)出的方法,這樣在包外面就無(wú)法被實(shí)現(xiàn)了,比如testing.TB接口

// TB is the interface common to T, B, and F.
type TB interface {
?? ?Cleanup(func())
?? ?Error(args ...any)
?? ?Errorf(format string, args ...any)
?? ?Fail()
?? ?FailNow()
?? ?Failed() bool
?? ?Fatal(args ...any)
?? ?Fatalf(format string, args ...any)
?? ?Helper()
?? ?Log(args ...any)
?? ?Logf(format string, args ...any)
?? ?Name() string
?? ?Setenv(key, value string)
?? ?Skip(args ...any)
?? ?SkipNow()
?? ?Skipf(format string, args ...any)
?? ?Skipped() bool
?? ?TempDir() string

?? ?// A private method to prevent users implementing the
?? ?// interface and so future additions to it will not
?? ?// violate Go 1 compatibility.
?? ?private()
}

第一種方法顯然只能防君子,不能防小人。

第二種方法看起來(lái)比較安全,但是結(jié)合我們上面的知識(shí),如果使用結(jié)構(gòu)體來(lái)包含這個(gè)接口呢?是不是也能實(shí)現(xiàn)這個(gè)接口?

type MyTB struct {
    testing.TB
}

顯然MyTB已經(jīng)實(shí)現(xiàn)了testing.TB,但是此時(shí)調(diào)用是會(huì)報(bào)錯(cuò)的

func main() {
    tb := new(MyTB)
    tb.Fatal("hello", "world")
}

實(shí)現(xiàn)其中的一個(gè)方法,再調(diào)用即可

func (p *MyTB) Fatal(args ...interface{}) {
?? ?fmt.Println(args...)
}

func main() {
?? ?tb := new(MyTB)
?? ?tb.Fatal("hello", "world")
}

既然MyTB實(shí)現(xiàn)了testing.TB,那么就可以做隱式轉(zhuǎn)換

var tb testing.TB = new(MyTB)
tb.Fatal("hello", "world")

到此這篇關(guān)于golang中結(jié)構(gòu)體嵌套接口的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang 結(jié)構(gòu)體嵌套接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang?throttled基于GCRA速率限制庫(kù)使用探索

    Golang?throttled基于GCRA速率限制庫(kù)使用探索

    這篇文章主要為大家介紹了Golang?throttled基于GCRA速率限制庫(kù)使用實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例

    Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例

    這篇文章主要為大家介紹了Go中的格式化字符串fmt.Sprintf()和fmt.Printf()使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 一文詳解Golang中的切片數(shù)據(jù)類(lèi)型

    一文詳解Golang中的切片數(shù)據(jù)類(lèi)型

    這篇文章主要介紹了一文詳解Golang中的切片數(shù)據(jù)類(lèi)型,切片是一個(gè)種特殊的數(shù)組。是對(duì)數(shù)組的一個(gè)連續(xù)片段的引用,所以切片是一個(gè)引用類(lèi)型
    2022-09-09
  • 淺析Go中函數(shù)的健壯性,panic異常處理和defer機(jī)制

    淺析Go中函數(shù)的健壯性,panic異常處理和defer機(jī)制

    這篇文章主要為大家詳細(xì)介紹了Go中函數(shù)的健壯性,panic異常處理和defer機(jī)制的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-10-10
  • 通過(guò)案例簡(jiǎn)單聊聊為什么說(shuō)Go中的字符串是不能被修改的

    通過(guò)案例簡(jiǎn)單聊聊為什么說(shuō)Go中的字符串是不能被修改的

    在接觸Go這么語(yǔ)言,可能你經(jīng)常會(huì)聽(tīng)到這樣一句話(huà),對(duì)于字符串不能修改,可能你很納悶,日常開(kāi)發(fā)中我們對(duì)字符串進(jìn)行修改也是很正常的,為什么又說(shuō)Go中的字符串不能進(jìn)行修改呢,本文就來(lái)通過(guò)實(shí)際案例給大家演示,為什么Go中的字符串不能進(jìn)行修改
    2023-07-07
  • Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案

    Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Mac GoLand打不開(kāi)(閃退)也不報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • 深入理解go sync.Once的具體使用

    深入理解go sync.Once的具體使用

    在很多情況下,我們可能需要控制某一段代碼只執(zhí)行一次,go 為我們提供了?sync.Once?對(duì)象,它保證了某個(gè)動(dòng)作只被執(zhí)行一次,本文主要介紹了深入理解go sync.Once的具體使用,感興趣的可以了解一下
    2024-01-01
  • Golang?websocket協(xié)議使用淺析

    Golang?websocket協(xié)議使用淺析

    這篇文章主要介紹了Golang?websocket協(xié)議的使用,WebSocket是一種新型的網(wǎng)絡(luò)通信協(xié)議,可以在Web應(yīng)用程序中實(shí)現(xiàn)雙向通信,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05
  • golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解

    golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用詳解

    這篇文章主要介紹了golang常用庫(kù)之gorilla/mux-http路由庫(kù)使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Go語(yǔ)言利用ffmpeg轉(zhuǎn)hls實(shí)現(xiàn)簡(jiǎn)單視頻直播

    Go語(yǔ)言利用ffmpeg轉(zhuǎn)hls實(shí)現(xiàn)簡(jiǎn)單視頻直播

    這篇文章主要為大家介紹了Go語(yǔ)言利用ffmpeg轉(zhuǎn)hls實(shí)現(xiàn)簡(jiǎn)單視頻直播,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04

最新評(píng)論