2014-10-20 3 views
-2

아직도 새로 워. 나는 as suggested here to my previous question 답을 구현하려고한다. 이 경우 동물 인터페이스와 동물 구조체가 있습니다. 각 동물을 반복 할 수 있기를 원합니다. & 언어를 구하십시오. 내가 포인터의 목록을 해봤지만 오류가 계속 "y.language 정의되지 않은 (유형 동물은 아무 필드 나 메소드 언어가 없습니다)"인터페이스 조각을 반복하는 방법은 무엇입니까?

My playground code

package main 

import "fmt" 

type animal interface { 
    speak() 
} 

type dog struct{ 
    language string 
} 

func (d *dog) speak() { 
    d.language = "woof" 
} 

var n = []animal{ 
    &dog{}, 
} 


func main() { 
    for _, w := range n{ 
     x := &dog{} 
     fmt.Println(x) 
     x.speak() 
     fmt.Println(x.language) // this works 

     fmt.Println(w) 
     y := w 
     y.speak() 
     fmt.Println(y.language) // but this doesn't...why?? 
    } 
} 

수정 # 1 : 만들려면 내 더 명확한 질문 : x : = & 개가 작동하지만 y : = w는 작동하지 않는 이유는 무엇입니까? 편집 # 2 : newbs 없음 사랑 (

+1

컴파일 타임 오류 메시지는 절대적으로 옳습니다 : 인터페이스에는'speak()'만 있습니다. 인터페이스에 따르면 '동물'을 가지고 있으면 말할 수 있다는 것입니다. 그 언어를 얻으려고하는 것은 기술적 인면에서 예상 할 수 있습니다. 동물의'언어 '를 원한다면 인터페이스에'GetLanguage()'를 추가하는 방법이있을 수 있습니다. – dyoo

+0

@CharlieTumahai : 어쩌면 내가 분명하지 않을 수 있습니다. 왜 x : = & dog {}는 작동 하나 y : = w는 작동하지 않습니까? –

+0

@dyoo 목록을 사용하지 않으면 동물의 언어를 사용할 수 있습니다. http://play.golang.org/p/IwFEbkoOZk. 내 질문은 왜 x : = & dog {}가 작동하지만 y : = w는 작동하지 않는 것과 비슷합니까? –

답변

3

오류는 올바른 y := wanimal 인터페이스 language를 포함하지 않기 때문에 유형 animal (당신의 n 슬라이스 타입 animal이다로)의 수 y를 선언한다 ..... . 그것은 무엇을 해야할지하지 않으며, 같은 그것은 오류가

당신은이 유형 주장 사용하여 dog 포인터 실제로 주장 할 수 있습니다.

fmt.Println(y.(*dog).language) 

..howe가 ver, 나는 당신이 성취하려는 것을 확신하지 못합니다.

language 속성이없는 cat을 입력하면 구조가 끊어집니다. (문제가 자리하고있는 곳입니다 보여 희망과) 따라서,이 또한 유사한 문제가 발생합니다 :

type cat struct{ 
} 

func (c *cat) speak() { 
    // do nothing 
} 

대답을 당신의 질문에 "내가 어떻게이 인터페이스의 조각을 구현합니까?" - 항목을 "일반적으로"처리하려면 인터페이스에 필요한 것을 추가해야합니다. 즉, language 속성을 Language() 메서드로 변환하고 animal 인터페이스를 구현하는 개별 개체를 통해 반환하는 것을 의미합니다.

+0

나는 훨씬 더 잘 이해하고있다. .. 신들을 돕는 Thx! –

관련 문제