【发布时间】:2017-07-31 12:05:22
【问题描述】:
为什么在接口由指针赋值的类型断言结果中赋值,而当我对结构对象赋值的接口进行赋值时会出现“无法赋值”的错误?
这是我的代码:
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)
}
【问题讨论】:
-
p2.(Student)产生一种临时对象(副本),它会立即被处理掉。分配给它的目的是什么? -
我是 golang 的新手,我正在努力更好地了解该语言的一些内在特性
-
如果你想深入了解 Go:停止尝试继承类型的设计。 Go 不支持这一点,你会伤害自己。
-
@Volker 只是一个基本的接口实现。
inheritance-type design是什么意思?
标签: pointers go type-assertion