gpt4 book ai didi

go - 在 go (golang) 中,如何将接口(interface)指针转换为结构指针?

转载 作者:IT王子 更新时间:2023-10-29 00:44:06 29 4
gpt4 key购买 nike

我想使用一些需要指向结构的指针的外部代码。在调用代码时,我有一个接口(interface)变量。

当从该变量创建指针时,指针的类型是 interface{}* 当我需要它是结构类型的指针类型时。

想象 TestCanGetStructPointer 中的代码 不知道 Cat 类,并且它存在于某个外部包中。

我怎样才能把它转换成这个?

这是一个代码示例:

import (
"reflect"
"testing"
)

type Cat struct {
name string
}

type SomethingGeneric struct {
getSomething func() interface{}
}

func getSomeCat() interface{} {
return Cat{}
}

var somethingForCats = SomethingGeneric{getSomething: getSomeCat}

func TestCanGetStructPointer(t *testing.T) {
interfaceVariable := somethingForCats.getSomething()

pointer := &interfaceVariable

interfaceVarType := reflect.TypeOf(interfaceVariable)
structPointerType := reflect.PtrTo(interfaceVarType)
pointerType := reflect.TypeOf(pointer)

if pointerType != structPointerType {
t.Errorf("Pointer type was %v but expected %v", pointerType, structPointerType)
}

}

测试失败:

指针类型为 *interface {} 但应为 *parameterized.Cat

最佳答案

@dyoo 的示例确实有效,但它依赖于您手动转换 DogCat

这是一个有点复杂/冗长的例子,它在某种程度上避免了这种限制:

package main

import (
"fmt"
"reflect"
)

type Cat struct {
name string
}

type SomethingGeneric struct {
getSomething func() interface{}
}

func getSomeCat() interface{} {
return Cat{name: "Fuzzy Wuzzy"}
}

var somethingForCats = SomethingGeneric{getSomething: getSomeCat}

func main() {
interfaceVariable := somethingForCats.getSomething()
castVar := reflect.ValueOf(interfaceVariable)
castVar.Convert(castVar.Type())

// If you want a pointer, do this:
fmt.Println(reflect.PtrTo(castVar.Type()))

// The deref'd val
if castVar.Type() != reflect.TypeOf(Cat{}) {
fmt.Printf("Type was %v but expected %v\n", castVar, reflect.TypeOf(&Cat{}))
} else {
fmt.Println(castVar.Field(0))
}
}

Playground Link

关于go - 在 go (golang) 中,如何将接口(interface)指针转换为结构指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29221854/

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