为了账号安全,请及时绑定邮箱和手机立即绑定

从 golang 中的 interface{} 正确转换类型断言失败

从 golang 中的 interface{} 正确转换类型断言失败

Go
喵喵时光机 2021-10-18 14:07:01
这是我从下面的简单重现案例中得到的输出:2015/06/22 21:09:50 ok: false2015/06/22 21:09:50 stub: *main.Stub <nil>显然,存根被正确标记为指向存根类型的指针,但转换失败。我正在尝试更新数组的内容。package mainimport "log"const BUFFER_SIZE = 8type Value struct {    value int}func (v Value) Value() int          { return v.value }func (v *Value) SetValue(value int) { v.value = value }type Stub struct {    Value    testString string}type StubFactory struct{}type FactoryInterface interface {    NewInstance(size int) []interface{}}func (factory StubFactory) NewInstance(size int) []interface{} {    stubs := make([]interface{}, size)    for i, _ := range stubs {        stubs[i] = &Stub{Value: Value{i}, testString: ""}    }    return stubs}type Buffer struct {    values []interface{}}func NewBuffer(factory FactoryInterface, size int) *Buffer {    return &Buffer{values: factory.NewInstance(size)}}func (buf *Buffer) Get(index int) interface{} {    return &buf.values[index]}func main() {    stubFactory := &StubFactory{}    buffer := NewBuffer(stubFactory, BUFFER_SIZE)    index := 0    if stub, ok := buffer.Get(index).(*Stub); ok { // THIS FAILS :-(        log.Printf("ok: %+v\n", ok)        log.Printf("stub: %T %+v\n", stub, stub)        stub.SetValue(1234)        log.Printf("value:%+v\n", buffer.Get(index)) // I WANT "1234"    } else {        log.Printf("ok: %+v\n", ok)        log.Printf("stub: %T %+v\n", stub, stub) // but this shows the right type    }}
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

错误是:


func (buf *Buffer) Get(index int) interface{} {

    return &buf.values[index]

}

你想做:


func (buf *Buffer) Get(index int) interface{} {

    return buf.values[index]

}

当您返回 &buf.values[index] 时,您将返回一个指向接口的指针。哪个是 *(*Stub) (在某种意义上)


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 426 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信