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

断言结构切片的接口

断言结构切片的接口

Go
慕盖茨4494581 2022-07-11 16:03:47
为什么我面临错误,即第一个要附加的 arg 在已经被断言为结构切片的接口之后必须是切片?package mainimport (    "fmt")type AccessKeys struct {    AccessKeys interface{}}type AccessKey struct {    AccessKeyID string}func main() {    var b AccessKey    b.AccessKeyID = "ye"    var bs AccessKeys    bs.AccessKeys = bs.AccessKeys.([]AccessKey) // Assert    bs.AccessKeys = append(bs.AccessKeys, b) // Error: first argument to append must be slice; have interface {}        fmt.Println(bs)}https://play.golang.org/p/OfT3i1AbkMe
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

它无法工作,因为您尝试将 AccessKey 附加到不是切片的 interface{} 类型。


package main


import (

    "fmt"

)


type AccessKeys struct {

    AccessKeys []interface{}

}


type AccessKey struct {

    AccessKeyID string

}


func main() {

    var b AccessKey

    b.AccessKeyID = "ye"


    var bs AccessKeys

    bs.AccessKeys = append(bs.AccessKeys, b)

    

    fmt.Println(bs)

}

但在我看来,这不是非常惯用的做某事的方式,而是取决于你想要实现的目标。我什至会替换


AccessKeys []interface{}

AccessKeys []AccessKey


查看完整回答
反对 回复 2022-07-11
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

感谢一位后来删除他的评论的好心的海报。

它不起作用,因为AccessKeys interface{}使 AccessKeys 成为无类型的 nil 类型,因为接口的零值是无类型的nil。由于 Go 是一种静态类型语言,它会在编译时报错。

如果这是有道理的,出于同样的原因,你不能在 Go 中这样做:

n := nil

即使这是固定的,它也会在运行时在断言 say 时失败panic: interface conversion: interface {} is nil, not []main.AccessKey。虽然我不确定为什么。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号