2017-12-31 119 views
2

Ich versuche, eine Golang-Struktur mit einer eingebetteten Vorlage zu initialisieren. Da Vorlagen keine Felder haben, würde ich erwarten, dass die richtige Anzahl von Variablen zu einem Konstruktor zuweisen funktionieren würde, sondern der Compiler beschwert sich, dassGolan Initialisierung der Struktur mit eingebetteten Vorlage: zu wenig Werte in Struct Initialisierer

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")) 
} 

Antwort

0

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

Ein Embedded-Bereich ist immer noch ein Feld, dessen Name von seinem Typ abgeleitet ist, daher hat TestBase eigentlich zwei Felder und nicht eins, nämlich name und TestTemplate.

Dies kompiliert gerade fein: So

var t *TestBase 
t.TestTemplate.Print() 

wenn TestBase Initialisieren Sie entweder die Feldnamen angeben, oder Sie initialisieren alle Felder aus.

Diese alle kompilieren:

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

Ahh, ich um die Vorlage zu definieren gemeint Namen haben() anstelle von Print(), aber das ist nicht zu relevant für das Problem. Danke, ich dachte, dass die Vorlage kein Feld war und sagte nur dem Compiler, dass dieses Objekt diese Funktionen implementieren sollte. – Spellchaser

+0

Seien Sie vorsichtig, wenn Sie versuchen, traditionelle OOP-Konzepte in Go zu integrieren. Die Go-Sprache wurde dafür nicht gebaut.Die Einbettung teilt dem Compiler lediglich mit, dass auf die 'Print/Name'-Methode direkt * von' TestBase' zugegriffen werden kann, ohne das Feld anzugeben, zu dem er gehört, aber der eingebettete Typ und seine Methode haben keine Kenntnis über den Typ, in den sie eingebettet sind , so dass die Methode 'Name/Drucken' keinen Zugriff auf das Feld' TestBase.name' hat. – mkopriva

0

Es sieht aus wie (soweit allgemeine Konzepte gehen) Sie verwirrend Schnittstelle s mit Zusammensetzung (welche Art von ist, wie gehen die ganze inheritance Frage nähert sich

Dieser Beitrag könnte für Sie hilfreich sein. https://medium.com/@gianbiondi/interfaces-in-go-59c3dc9c2d98

So TestTemplate ist eine Schnittstelle.

Das heißt, die structTestBase wird die Methoden implementieren (dessen Signatur) in der Schnittstelle definiert sind.

Sie sollten Print für TestBase implementieren.

Aber in anycase der Fehler Sie bekommen ist, denn wenn man eine Struktur ohne Feldnamen angegeben initialisieren, es erwartet, dass die alle Feldnamen eingegeben werden, siehe

https://gobyexample.com/structs

So die composition entfernen TestTemplate von der Struktur (und implementieren Sie stattdessen die Methode in der Schnittstelle definiert), und es sollte funktionieren.

Auch FYI, die Stringer Schnittstelle mit String Methode ist, was fmt.Println erwartet eine beliebige Struktur (kein Print Methode) sehen drucken: https://tour.golang.org/methods/17

Verwandte Themen