登录
首页 >  Golang >  Go问答

将临时结构键入具体结构的方法

来源:stackoverflow

时间:2024-02-20 16:00:29 136浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《将临时结构键入具体结构的方法》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我对使用 reflect 生成的结构和普通结构之间的类型断言有疑问。

我知道这是一个非常有限的用例,但我仍然想知道为什么它不起作用。

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

package main

import (
    "fmt"
    "math/big"
    "reflect"
)

type TupleT struct {
    X *big.Int
    Y *big.Int
}

func main() {
    var fields []reflect.StructField
    fields = append(fields, reflect.StructField{
        Name: "X",
        Type: reflect.TypeOf(new(big.Int)),
        //Tag:  reflect.StructTag("json:\"" + "x" + "\""),
    })
    fields = append(fields, reflect.StructField{
        Name: "Y",
        Type: reflect.TypeOf(new(big.Int)),
        //Tag:  reflect.StructTag("json:\"" + "y" + "\""),
    })
    a := reflect.New(reflect.StructOf(fields)).Elem().Interface()
    if _ = a.(TupleT); true {
        fmt.Println("Hello, playground")
    }

    b := new (struct {X *big.Int "json:\"x\""; Y *big.Int "json:\"y\""})
    interf2 := interface{}(b)
    if _ = interf2.(*TupleT); true {
        fmt.Println("Hello, playground")
    }
}

解决方案


因为 type assertion 不是这样工作的:

x.(t)

断言 x 不是 nil 并且 x 中存储的值的类型为 t

类型断言断言接口值中的类型“恰好”是 t。在你的情况下,这不成立。接口中有一个未命名的结构体值,它不能与命名类型 main.tuplet 相同。可能这些类型具有相同的基础类型或者它们是可转换的,但它们不相同,因此类型断言失败。

如果您使用 Value.Convert() convert 值,您可以做您想做的事情:

a := reflect.new(reflect.structof(fields)).elem().
    convert(reflect.typeof(tuplet{})).interface()
if _, ok := a.(tuplet); ok {
    fmt.println("hello, playground")
}

类似地,当使用类型断言而不使用反射时,由于接口值保存未命名结构类型的值,因此您必须键入断言:

b := new(struct {
    X *big.Int `json:"x"`
    Y *big.Int `json:"x"`
})
interf2 := interface{}(b)
if _, ok := interf2.(*struct {
    X *big.Int `json:"x"`
    Y *big.Int `json:"x"`
}); ok {
    fmt.Println("Hello, playground")
}

尝试 Go Playground 上的示例。

请注意,在第二种情况下,您还必须指定结构标记,即使在第一个示例中不需要。这样做的原因是因为具有相同字段(不考虑标签)的结构可以相互转换,但它们并不相同。

今天关于《将临时结构键入具体结构的方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>