繁体   English   中英

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

[英]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实际上有两个字段而不是一个字段 ,即nameTestTemplate

编译得很好:

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方法)的内容,请参阅: httpsfmt.Println

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM