2017-03-10 5 views
0

포인터가 인터페이스를 할당 한 형식 어설 션 결과에 값을 할당하는 이유는 무엇입니까? 구조체 개체가 할당 한 인터페이스에 "할당 할 수 없습니다"오류가 발생하는 이유는 무엇입니까?golang 유형 어설 션, 인터페이스 {} (포인터)와 인터페이스 {} (개체)의 차이점은 무엇입니까?

package main 

import (
    "fmt" 
) 

type Person interface { 
    SayHi() 
} 

type Student struct { 
    id int 
    name string 
} 

func (s Student) SayHi() { 
    fmt.Println("hi, i am", s.name, " my id is:", s.id) 
} 

func main() { 
    p1 := Person(&Student{id: 123, name: "William"}) 
    p1.SayHi()  // ok 
    p1.(*Student).SayHi() // ok here 
    p1.(*Student).id = 456 // ok here 
    p2 := Person(Student{id: 123, name: "William"}) 
    p2.SayHi()   //ok 
    p2.(Student).SayHi() // ok here 
    p2.(Student).id = 456 // error here and why? 
    fmt.Println("p1:", p1, " p2:", p2) 
} 

https://play.golang.org/p/dwkvLzng_n

+2

'p2. (학생)'즉시 폐기되는 일종의 임시 객체 (사본)를 생성합니다. 그것에 배정 된 목적은 무엇입니까? – myaut

+0

나는 골란에서 새로운 꿀벌이에요, 언어에 대해 더 잘 알고 싶습니다. –

+0

Go에서 통찰력을 얻고 싶다면 상속 형 디자인을 시도하지 마십시오. 이동은 이것을 지원하지 않으므로 스스로 상처를줍니다. – Volker

답변

1

value.(typeName)의 결과가 정적 유형 typeName로 새로운 (복사) 값입니다

여기 내 코드입니다.

p2.(Student).id=456은 임시로 Student 값을 만들므로 해당 값의 수정 사항은 무시됩니다. 그래서이 언어는이 실수를 허용하지 않습니다.