【问题标题】:golang type assertion, what the different between interface{}(pointer) and interface{}(object)?golang 类型断言,interface{}(pointer) 和 interface{}(object) 有什么区别?
【发布时间】: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)
}

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

【问题讨论】:

  • p2.(Student) 产生一种临时对象(副本),它会立即被处理掉。分配给它的目的是什么?
  • 我是 golang 的新手,我正在努力更好地了解该语言的一些内在特性
  • 如果你想深入了解 Go:停止尝试继承类型的设计。 Go 不支持这一点,你会伤害自己。
  • @Volker 只是一个基本的接口实现。 inheritance-type design 是什么意思?

标签: pointers go type-assertion


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-29
    • 2019-09-02
    • 2018-08-05
    • 1970-01-01
    • 2013-12-27
    • 2019-09-29
    • 1970-01-01
    • 2011-10-26
    • 2011-04-13
    相关资源
    最近更新 更多