2017-03-10 15 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

私はgolangの新しい蜂です。私は言語についての本質的ないくつかの固有のことを知らせようとしています –

+0

Goで洞察を得たい場合:継承型の設計をやめてください。 Goはこれをサポートしておらず、あなたは自分自身を傷つけるでしょう。 – Volker

答えて

1

value.(typeName)の結果は静的な型typeNameで新しい(コピー)値です。

p2.(Student).id=456は、一時的な値Studentを作成し、その値の変更は破棄されます。だから言語はこのミスを許さない。

関連する問題