golang类型断言,interface{}(指针)和interface{}(对象)之间有什么不同?

3

为什么在将接口分配给指针时,对类型断言结果赋值,并且在将其分配给结构对象分配接口时会出现“无法分配”错误?

以下是我的代码:

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.(Student) 产生一种临时对象(副本),该对象会立即被处理。将其赋值的目的是什么? - myaut
我是一个新手在golang,我正在尝试更好地了解一些关于这种语言的内在特性。 - Liu Weibo
如果你想深入了解Go语言:不要试图使用继承类型的设计。Go语言不支持这种方式,你会自讨苦吃。 - Volker
@Volker 这只是一个基本的接口实现。你所说的“继承类型设计”是什么意思? - Liu Weibo
1个回答

5
< p > value.(typeName) 的结果是一个新的 (复制) 值,其静态类型为 typeName

p2.(Student).id=456 会创建一个临时的 Student 值,对该值的任何修改都将被丢弃。因此,语言只是禁止了这个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接