golang类型断言,interface{}(指针)和interface{}(对象)有什么区别?

Liu*_*ibo 3 pointers go type-assertion

为什么我要为接口由指针分配的类型断言结果赋值,而当我对由结构对象分配的接口执行此操作时,会出现“无法分配”错误?

这是我的代码:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

zzn*_*zzn 5

的结果value.(typeName)是一个静态类型的新(复制)值typeName。

p2.(Student).id=456将创建一个临时Student值,对该值的任何修改都将被丢弃。所以语言不允许这种错误。