![](/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.