golang使用嵌入式模板初始化struct:struct initializer中的值太少

时间:2017-12-31 23:10:05

标签: go

我尝试使用嵌入式模板初始化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"))
}

2 个答案:

答案 0 :(得分:3)

https://golang.org/ref/spec#Struct_types

嵌入字段仍然是字段,其名称源自其类型,因此TestBase实际上两个字段而不是一个,即nameTestTemplate

编译得很好:

var t *TestBase
t.TestTemplate.Print()

因此,在初始化TestBase时,您可以指定字段名称,也可以初始化所有字段。

这些全部编译:

_ = &TestBase{name, nil}
_ = &TestBase{name: name}
_ = &TestBase{name: name, TestTemplate: nil}
_ = &TestBase{TestTemplate: nil}

答案 1 :(得分:0)

看起来(就一般概念而言)你将界面组合混为一谈(这就是Go如何接近整个{{ 1}}问题。

这篇文章可能对您有所帮助:https://medium.com/@gianbiondi/interfaces-in-go-59c3dc9c2d98

所以inheritance是一个界面。

这意味着TestTemplate struct实现接口中定义的方法(其签名)。

您应该为TestBase实施Print

但无论如何,你得到的错误是因为当你初始化一个没有指定字段名的结构时,它希望输入所有的字段名,参见

https://gobyexample.com/structs

所以从结构中删除TestBase composition(并实现接口中定义的方法),它应该可以工作。

此外,FYI,TestTemplate方法与Stringer方法是String期望打印任意结构(而不​​是fmt.Println方法)的内容,请参阅:{{3} }