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

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


可以这么说,给定定义:


package main


import (

    "fmt"

)


type GenericData struct {

    Hard int

    Soft interface{}

}


type Data struct {

    Hard int

    Soft int

}


type GenericDataGenerator func() GenericData


func 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


蛊毒传说
浏览 99回答 1
1回答

呼啦一阵风

有没有一种直接的方法可以将某些字段是“通用”(interface{})的结构转换为另一种具有相同字段名称但“强类型”(int、string 等)的类型?不。一旦你明白这interface{}不是某种“通用”或“任意”类型,而是一种单一的“强类型”类型,就像stringor一样,这就很明显了int32。空接口interface{}是一个完全正常的类型,就像 auint16或 amap[float32]bool一样。它是一种接口类型(与数字类型和映射类型的其他示例相反)并且它的方法集是空集。它与任何其他类型一样严格或强类型。您可以将任何值分配给类型变量的事实interface{}并不意味着interface{}以某种方式表示“任何类型”。您可以将值3,-1234和435948(仅举几例)分配给 a int32。这是允许的,因为 a 的允许值范围int32包含这些值(3、-1234、435948)。您可以将类型的值分配func(int) string给类型的变量interface{},因为允许的值范围interface{}包含func(int)string。这是一个空洞的事实,而不是一个“通用”的事实。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go