golang正在使用嵌入模板初始化结构:结构初始值设定项中的值太少

golang正在使用嵌入模板初始化结构:结构初始值设定项中的值太少,go,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 Te

我正在尝试使用嵌入模板初始化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"))
}
看起来(就一般概念而言)你把接口组合混淆了(这是处理整个
继承
问题的方式)

这篇文章可能会对你有所帮助:

因此,
TestTemplate
是一个接口

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

您应该为
TestBase
实现
Print

但无论如何,您得到的错误是,当您初始化没有指定字段名的结构时,它希望输入所有字段名,请参阅

因此,从结构中删除
组合
测试模板
(并实现接口中定义的方法),它应该可以工作

另外,仅供参考,带有
String
方法的
Stringer
接口是
fmt.Println
希望打印任意结构(而不是
打印
方法)的功能,请参见:

嵌入式字段仍然是一个字段,其名称是从其类型派生的,因此
TestBase
实际上有两个字段而不是一个,即
name
TestTemplate

这就很好地编译了:

var t *TestBase
t.TestTemplate.Print()
因此,在初始化
TestBase
时,可以指定字段名,也可以初始化所有字段

这些都是:

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

啊,我的意思是将模板定义为Name()而不是Print()但这与问题不太相关。谢谢,我认为模板不是字段,只是告诉编译器这个对象应该实现这些函数。在尝试将传统OOP概念融入Go时要小心。Go语言不是为此而构建的。嵌入只是告诉编译器,
Print/Name
方法可以直接从
TestBase
访问,无需指定它所属的字段,但嵌入类型及其方法不知道它们嵌入的类型,因此
Name/Print
方法将无法访问
TestBase.Name
字段。