簡體   English   中英

在 Golang 中,在結構內部使用接口是什么意思?

[英]In Golang, what does it mean when an interface is used inside of a struct?

Go 的新手在這里。 我遇到了一些與 DynamoDB 相關的代碼:

type Dynamo interface {
    DescribeTableWithContext(
        aws.Context,
        *dynamodb.DescribeTableInput,
        ...request.Option,
    ) (*dynamodb.DescribeTableOutput, error)
}

type my_struct struct {
    Dynamo
}

我假設my_struct “實現” Dynamo 接口是否正確,現在可以使用DescribeTableWithContext方法?

我假設 my_struct “實現” Dynamo 接口是否正確

不完全是。 無論您為Dynamo嵌入初始化my_struct的什么結構,都將是實現接口的東西。 然而, my_struct將在編譯時滿足Dynamo接口。 正如@mkopriva 指出的那樣,在運行時,這確實需要嵌入式接口的具體實現。 因此,如果您要執行以下操作:

package main

import "fmt"

type Adder interface {
    func Add(a, b int) int
}

type Embed struct {
    Adder
}

func PrintAdd(a Adder, first, second int) {
    fmt.Println(a.Add(first, second))
}

func main() {
    e := Embed{}
    PrintAdd(e, 1, 2)
}

此代碼可以編譯,但在運行時,對PrintAdd的調用將失敗,因為尚未設置嵌入式接口實現。

如果將上面的 main 替換為:

type adder struct {}

func (a adder) Add(first, second int) int {
     return first + second
}

func main() {
    e := Embed{adder{}}
    PrintAdd(e, 1, 2)
}

事情將按預期進行。

...現在可以使用 DescribeTableWithContext 方法了嗎?

是的,假設您在初始化期間提供了接口實現。

編輯:添加了對實現接口與僅僅滿足它的含義的解釋。

我假設 my_struct"implements" Dynamo 接口是否正確,現在可以使用 DescribeTableWithContext 方法?

不,它的作用是在你的結構中嵌入一個Dynamo類型的未命名字段。 您將能夠直接在my_struct的實例(例如var my_struct_instance my_struct )上調用DescribeTableWithContext ,但此調用實際上會調用您分配給my_struct_instance.Dynamo的任何內容的實現,而不是my_struct中的實現(因為它沒有定義DescribeTableWithContext ,因此不實現Dynamo )。 在將my_struct_instance.Dynamo設置為具有實現Dynamo的類型的值(或指向值的指針)之后,這樣做可能只會 go 好(即不會恐慌)。 Go 中接口的實現是通過鴨子類型完成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM