2017-12-31 43 views
2

golang 구조체를 포함 된 템플릿으로 초기화하려고합니다. 템플릿에는 필드가 없기 때문에, 당신이 혼란하고 내가 생성자에 변수의 정확한 수를 할당하는 작업 것이라고 기대하지만, 대신 컴파일러는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")) 
} 

답변

0

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

내장 필드 여전히 이다

또한

는 FYI, String 방법과 Stringer 인터페이스 fmt.Println 임의 구조체 (하지 Print 방법)을 참조 인쇄 기대 무엇 필드,이 유형에서 파생 된 이름이므로 TestBase은 실제로 두 개의 필드이 아닌입니다.210 및 TestTemplate. TestBase를 초기화 할 때

var t *TestBase 
t.TestTemplate.Print() 

그래서 당신은 필드 이름을 지정하거나 또는 모든 필드를 초기화 :

이 잘 컴파일합니다.

는이 모든 컴파일 :

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

아를, 나는()가 아니라 인쇄에 비해() 이름을 가지고 템플릿을 정의하는 것을 의미하지만,이 문제에 너무 관련이없는입니다. 고맙습니다. 템플릿이 필드가 아니며이 객체가 이러한 기능을 구현해야한다는 것을 컴파일러에게 알려주었습니다. – Spellchaser

+0

전통적인 OOP 개념을 Go에 맞추려고 할 때주의하십시오. Go 언어는이를 위해 빌드되지 않았습니다.Embedding은'Print/Name' 메쏘드가'TestBase'로부터 직접적으로 * 접근 할 수 있다는 것을 컴파일러에게 알려주지 만, 포함 된 필드와 그것의 메쏘드는 그것들이 속한 타입에 대한 지식이 없습니다 ,'Name/Print' 메쏘드는'TestBase.name' 필드에 접근 할 수 없습니다. – mkopriva

0

그것은 (지금까지 일반적인 개념이가는대로)처럼 보이는 것을 불평 종류의 이동이 전체 inheritance 문제에 접근하는 방법이다 구성인터페이스의 (

이 게시물이 당신을 위해 도움이 될 수 있습니다. 그래서 https://medium.com/@gianbiondi/interfaces-in-go-59c3dc9c2d98

TestTemplate은 인터페이스입니다. structTestBase는 (그 서명 됨) 인터페이스에 정의 된 방법을 구현하는 것을 의미

.

TestBasePrint을 구현해야합니다.

그러나 anycase 당신이지고있어 오류가 지정한없는 필드 이름을 가진 구조체를 초기화 할 때, 모든 필드 이름을 입력 할 것으로 예상하기 때문이다

https://gobyexample.com/structs

는 그래서 composition 제거를 참조하십시오 struct에서 TestTemplate을 가져오고 (대신 인터페이스에 정의 된 메서드를 구현합니다) 작동해야합니다. https://tour.golang.org/methods/17