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

等效结构上字段的接口转换

等效结构上字段的接口转换

Go
蛊毒传说 2023-06-19 17:09:18
有没有一种直接的方法可以将某些字段为“通用”( interface{}) 的结构转换为具有相同字段名称但“强类型”( , 等) 的另一种int类型string?可以这么说,给定定义:package mainimport (    "fmt")type GenericData struct {    Hard int    Soft interface{}}type Data struct {    Hard int    Soft int}type GenericDataGenerator func() GenericDatafunc generateGenericData() interface{} {    return GenericData{1, 2}}func returnsGenericDataGenerator() interface{} {    return generateGenericData}GenericData从到转换是否Data需要显式转换所有interface{}字段?有没有更直接的方法来做到这一点?func main() {    gd := generateGenericData()    fmt.Println(gd)    fmt.Println(gd.(GenericData))    // Doesn't work, but is straightforward    // fmt.Println(gd.(Data))    // Works, but is not straight forward    fmt.Println(Data{gd.(GenericData).Hard, gd.(GenericData).Soft.(int)})    genDataGenerator := returnsGenericDataGenerator()    // Doesn't work, but is straightforward    //genDataGenerator.(GenericDataGenerator)()    // Works, but is not straight forward    resp := genDataGenerator.(func() interface{})()    fmt.Println(resp.(GenericData))}代码可以执行在: https ://play.golang.org/p/_UVBi5It1FY
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

有没有一种直接的方法可以将某些字段是“通用”(interface{})的结构转换为另一种具有相同字段名称但“强类型”(int、string 等)的类型?

不。

一旦你明白这interface{}不是某种“通用”或“任意”类型,而是一种单一的“强类型”类型,就像stringor一样,这就很明显了int32。空接口interface{}是一个完全正常的类型,就像 auint16或 amap[float32]bool一样。它是一种接口类型(与数字类型和映射类型的其他示例相反)并且它的方法集是空集。它与任何其他类型一样严格或强类型。

您可以将任何值分配给类型变量的事实interface{}并不意味着interface{}以某种方式表示“任何类型”。您可以将值3,-1234435948(仅举几例)分配给 a int32。这是允许的,因为 a 的允许值范围int32包含这些值(3、-1234、435948)。您可以将类型的值分配func(int) string给类型的变量interface{},因为允许的值范围interface{}包含func(int)string。这是一个空洞的事实,而不是一个“通用”的事实。


查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

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