[英]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.