golang 类型断言,接口{}(指针)和接口{}(对象)有什么区别?
golang type assertion, what the different between interface{}(pointer) and interface{}(object)?
为什么我要给接口由指针赋值的类型断言结果赋值,而当我对由结构对象赋值的接口赋值时会出现"cannot assign"错误?
这是我的代码:
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)
}
value.(typeName)
的结果是静态类型 typeName
的新(副本)值。
p2.(Student).id=456
将创建一个临时 Student
值,对该值的任何修改都将被丢弃。所以语言就是不允许这个错误。
为什么我要给接口由指针赋值的类型断言结果赋值,而当我对由结构对象赋值的接口赋值时会出现"cannot assign"错误?
这是我的代码:
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)
}
value.(typeName)
的结果是静态类型 typeName
的新(副本)值。
p2.(Student).id=456
将创建一个临时 Student
值,对该值的任何修改都将被丢弃。所以语言就是不允许这个错误。