![](/img/trans.png)
[英]too few values in struct initializer when initialize C struct in golang
[英]golang initializing struct with embedded template: too few values in struct initializer
我正在嘗試使用嵌入式模板初始化golang結構。 由於模板沒有字段,我希望為構造函數分配正確數量的變量是可行的,但編譯器會抱怨
main.go:17:19: too few values in struct initializer
package main
import "fmt"
type TestTemplate interface {
Name() string
}
type TestBase struct {
name string
TestTemplate
}
func New(name string) *TestBase {
return &TestBase{name} // This fails
//return &TestBase{name: name} // This works
}
func (v *TestBase) Name() string {
return v.name
}
func main() {
fmt.Println(New("Hello"))
}
https://golang.org/ref/spec#Struct_types
嵌入字段仍然是一個字段 ,其名稱是從其類型派生的,因此TestBase
實際上有兩個字段而不是一個字段 ,即name
和TestTemplate
。
編譯得很好:
var t *TestBase
t.TestTemplate.Print()
因此,在初始化TestBase
您可以指定字段名稱,也可以初始化所有字段。
這些都編譯:
_ = &TestBase{name, nil}
_ = &TestBase{name: name}
_ = &TestBase{name: name, TestTemplate: nil}
_ = &TestBase{TestTemplate: nil}
看起來(就一般概念而言)你將界面與構圖混淆(這就是Go如何處理整個inheritance
問題。
這篇文章可能對您有所幫助: https : //medium.com/@gianbiondi/interfaces-in-go-59c3dc9c2d98
所以TestTemplate
是一個接口。
這意味着struct
TestBase
將實現接口中定義的方法(其簽名)。
您應該為TestBase
實現Print
。
但無論如何,你得到的錯誤是因為當你初始化一個沒有指定字段名的結構時,它希望輸入所有的字段名,見
https://gobyexample.com/structs
因此從結構中刪除composition
TestTemplate
(並實現接口中定義的方法),它應該工作。
另外,FYI, String
方法的Stringer
接口是fmt.Println
期望打印任意結構(不是Print
方法)的內容,請參閱: https : fmt.Println
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.