亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 嵌入式自定義接口

Go 嵌入式自定義接口

Go
LEATH 2021-09-27 17:19:39
我試圖了解 Go 的接口和嵌入。我在這里嘗試做的是創建我自己的自定義writer,reader 并且每個人都實現io.Writer或io.Reader現在我想將這些實現基本接口的自定義結構嵌入到另一個實現Read/Write/Close. 下面的代碼是我到目前為止的代碼,但是當我運行它時,出現以下錯誤cannot use test (type MyReadWriteCloser) as type io.Writer in argument to fmt.Fprintf:    MyReadWriteCloser does not implement io.Writer (missing Write method)我認為當你在另一個結構中嵌入一個結構時,你也會得到嵌入結構的方法。有人可以告訴我我錯過了什么嗎?package mainimport ("fmt""io")type MyWriter struct {    w io.Writer}func (m MyWriter) Write(b []byte) (n int, err error) {    // encrypt b and write to underlying writer    m.w.Write(b)    return}type MyReader struct {    r io.Reader}func (m MyReader) Read(b []byte) (n int, err error) {    // decrypt b    m.r.Read(b)    return}type MyReadWriteCloser struct {    MyWriter    MyReader}func (m MyReadWriteCloser) Close() error {    return nil}func main() {    fmt.Println("main start")    r, w := io.Pipe()    test := MyReadWriteCloser{        MyWriter{w},        MyReader{r},    }    fmt.Fprintf(test, "hello world\n")} 
查看完整描述

2 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

您沒有嵌入接口,而是將它們作為結構中的字段。


嵌入看起來像:


type MyReader struct {

    io.Reader

}

如果要手動委托給接口,需要使用相同的方法名


func (m MyReader) Read(b []byte) (n int, err error) {

    return m.r.Read(b)

}


查看完整回答
反對 回復 2021-09-27
?
九州編程

TA貢獻1785條經驗 獲得超4個贊

您的語法錯誤,因此實際上并未嵌入接口/類型。


type MyWriter struct {

    w io.Writer

}

應該


type MyWriter struct {

    io.Writer

}

根據我的理解,適當的嵌入不會讓您有理由定義類似的方法;


func (m MyWriter) Write(b []byte) (n int, err error) {

    m.w.Write(b)

    return

}

因為身體就是m.Write(b)這樣,只是沒有意義。如果你嵌入一個類型,嵌入類型將能夠直接從嵌入類型調用方法(它是最接近繼承的東西,對于普通讀者來說看起來是一樣的)。如果嵌入類型中的方法或屬性名稱或嵌入類型的嵌入類型之間存在沖突,我不記得解析規則,但一個好的經驗法則是避免嵌入類型會導致命名沖突,因為行為不會明顯的。


編輯:如何覆蓋基礎類型中的方法并從內部調用“base”(我引用,因為該詞選擇可能會冒犯某些地鼠)方法的示例;


func (m MyWriter) Write(b []byte) (n int, err error) {

     b = EncodeBFromMethodThatsInScopeHere(b)

     return m.Writer.Write(b)

}

基本上,如果你想顯式地使用嵌入類型方法,你可以將它作為使用嵌入類型類型的類型的屬性來引用,就像它是一個屬性名稱一樣。


查看完整回答
反對 回復 2021-09-27
  • 2 回答
  • 0 關注
  • 237 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號