簡體   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