2016-10-21 2 views
-1

몇 가지 패키지가있는 작은 프로그램을 작성하려고합니다. 각 패키지에는 인터페이스를 구현하는 구조체가 있습니다. 아이디어는 사용자 입력을 기반으로 특정 구조체를 작성하고 그 구조체가 가지고 있다고 가정하는 함수를 호출하는 데 사용할 패키지를 선택할 수 있습니다. 앞서 유형을 알지 못했기 때문에 interface{}을 사용하여이를 전달 선언으로 사용할 수 있다는 인상하에있었습니다 (마지막 코드 스 니펫 참조). 나는이처럼 보이는 무언가가 :구조체를 만들 때 인터페이스를 올바르게 사용하기

data = foo.FooInput("awyiss", 1} 
var something interface{} 
var err error 

switch some_string { 
case "foo": 
    something, err = bob.MakeBob(foo_input) 
case "bar": 
    // imagine bar is like foo 
    something, err = bar.MakeBar(foo_input) 
// imagine other cases 
} 
something.Dong() 
: 내가 그렇게 보이는 무언가가, 내 기본 패키지에서

type Bob struct { 
    foo.FooInput 
} 
func (mybob *Bob) Ding() {} 
func (mybob *Bob) Dong() {} 
func MakeBob(foo_input foo.FooInput) (*Bob, error) { 
    my_bob := Bob{foo_input} 
    return &my_bob, nil 
} 

: 다른 패키지, bob에서

package foo 

type FooInput struct { 
    Bar string 
    Baz int 
} 

type Foo interface { 
    Ding() 
    Dong() 
} 

를, 내가 좋아하는 뭔가를

/building/etc를 실행하면 다음 오류가 발생합니다.

something.Dong undefined (type interface {} is interface with no methods) 

제가 잘못하고있는 것에 대해 다소 혼란 스럽습니다 ... 내가 어떻게 사용해야하는지에 관한 어떤 정리가 interface{} (전혀) 매우 유용 할 것입니다!

답변

2

변수 something이 빈 인터페이스로 선언됩니다. 빈 인터페이스에는 메소드가 없습니다. Dong 메서드를 호출하려면 somethingfoo.Foo으로 선언하십시오.

변경

var something interface{} 

var something foo.Foo 

에이 barfoo 같이 되 그 bar 만족 foo.Foo 인터페이스 수단 것으로 가정한다.

+0

문제를 더 잘 보여 주려고 시도했는데 마지막으로 수정 사항을 참조하십시오. –

1

외모가 있다면, 당신은 조금 혼란스러워합니다. 두 가지 중 하나를 선택하십시오. 변수 "something"에 넣으려는 모든 유형이 메소드 Ding 및 Dong - than 인터페이스를 정의한다면. Foo가 최고의 이름이 아니며 DingDonger (https://golang.org/doc/effective_go.html#interface-names)가 더 좋습니다. 후

: 각 뭔가에 할당

var something DingDonger 

형이 정말 방법을 필요 여부를 체크하고, 따라서 오류가 발생할 수 없습니다() something.Ding됩니다.

변수가 interface {} 유형이라면 아무도 알지 못합니다. 그런 방법이 있는지 여부에 관계없이 메소드가 구현되는지 확인하기 위해 유형 어설 션 (https://golang.org/doc/effective_go.html#interface_conversions)을 사용해야합니다.

관련 문제