gpt4 book ai didi

go - 如何测试一个接口(interface)变量的底层类型 接口(interface)变量的类型是别名

转载 作者:数据小太阳 更新时间:2023-10-29 03:14:52 26 4
gpt4 key购买 nike

这里是 Golang 新手。

这个问题的简短版本是:给定一个可能是别名类型的接口(interface)值,检查它是否是底层类型的正确方法是什么?

我发现类型断言和类型切换不起作用。

例如,在下面的程序中,我有一堆自动生成的命名类型 Alias<N>来自底层类型 Origin .我有一个接口(interface)变量 v ,它可以是任何类型。我想用它的 Field值(value)如果 v类型为 Origin .

package main

import (
"fmt"
)

type Origin struct {
Field int
}

type Alias1 Origin
type Alias2 Origin
type Alias3 Origin

// A bunch of other aliases

func f(v interface{}) {
if _, ok := v.(Origin); ok {
fmt.Println("type assertion works")
}

switch v := v.(type) {
case Origin:
fmt.Println("type switch works")
case Alias1:
fmt.Printf("No... Alias1 Value: %v\n", v.Field)
case Alias2:
fmt.Printf("No... Alias2 Value: %v\n", v.Field)
default:
fmt.Printf("No... Alias3 Value: %T\n", v.(Origin).Field)
}
}

func main() {
f(Alias1{Field: 10})
f(Alias2{Field: 10})
f(Alias3{Field: 10})
}

输出如https://play.golang.org/p/3WjpX6NcfF所示:

No... Alias1 Value: 10
No... Alias2 Value: 10
panic: interface conversion: interface is main.Alias3, not main.Origin

正确的方法是什么? (我无法在 Origin 中列出 f 的所有别名类型,因为这些别名类型是自动生成并分散在各处的。)非常感谢任何帮助。提前致谢!

===== 编辑 1 =====

尝试使用 reflect包,但仍然没有解决方案:https://play.golang.org/p/3LtG9ZOkQd

package main

import (
"fmt"
"reflect"
)

type Origin struct {
Field int
}

type Alias1 Origin

// A bunch of other aliases

func g(v interface{}) {
vt := reflect.TypeOf(v)
ot := reflect.TypeOf(Origin{})
if vt.ConvertibleTo(ot) {
fmt.Printf("%T is convertible to Origin", v)

// panic: interface is main.Alias3, not main.Origin
// fmt.Printf("Value: %v\n", v.(Origin).Field)

// error: vt is not a type
// fmt.Printf("Value: %v\n", v.(vt).Field)

// error: cannot convert v (type interface {}) to type Origin: need type assertion
// fmt.Printf("Value: %v\n", Origin(v).Field)

}
}

func main() {
g(Alias1{Field: 10})
}

最佳答案

我能得到的最短的是:

fmt.Printf("Value: %v\n", reflect.ValueOf(v).Convert(ot).Interface().(Origin).Field)

(而不是代码中的第三个 fmt)

它使用反射将 v 转换为 origin 类型。但随后要使用类型断言,但那将是 reflect.Value。要将其转换为 Origin 类型,需要将其转换为 interface{},然后才能将其断言为 Origin 类型。

关于go - 如何测试一个接口(interface)变量的底层类型 接口(interface)变量的类型是别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39155553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com