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

如何通过接口获取指针的值类型?

如何通过接口获取指针的值类型?

Go
鸿蒙传说 2021-12-07 16:55:10
这个游乐场说明了我的问题。基本上我有一个接受空接口作为参数的函数。我想传入任何内容并打印有关类型和值的信息。它按预期工作,除非我将指针传递给自定义类型(在我的示例中,底层结构类型)。我不完全确定反射模型在那时是如何构建的。由于函数签名指定了一个interface{}参数,当我调用reflect.Indirect(v).Kind()它时自然会返回,interface但我想知道调用函数时的类型。以下是来自操场的相同代码:package mainimport (    "fmt"    "reflect")func main() {    var s interface{}    s = CustomStruct{}    PrintReflectionInfo(s)    PrintReflectionInfo(&s)}type CustomStruct struct {}func PrintReflectionInfo(v interface{}) {    // expect CustomStruct if non pointer    fmt.Println("Actual type is:", reflect.TypeOf(v))    // expect struct if non pointer    fmt.Println("Value type is:", reflect.ValueOf(v).Kind())    if reflect.ValueOf(v).Kind() == reflect.Ptr {        // expect: CustomStruct        fmt.Println("Indirect type is:", reflect.Indirect(reflect.ValueOf(v)).Kind()) // prints interface        // expect: struct        fmt.Println("Indirect value type is:", reflect.Indirect(reflect.ValueOf(v)).Kind()) // prints interface    }    fmt.Println("")}
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

要获取结构值,您需要获取接口值的元素:


fmt.Println("Indirect type is:", reflect.Indirect(reflect.ValueOf(v)).Elem().Type()) // prints main.CustomStruct


fmt.Println("Indirect value type is:", reflect.Indirect(reflect.ValueOf(v)).Elem().Kind()) // prints struct


此代码有助于理解示例中的类型:


rv := reflect.ValueOf(v)

for rv.Kind() == reflect.Ptr || rv.Kind() == reflect.Interface {

    fmt.Println(rv.Kind(), rv.Type(), rv)

    rv = rv.Elem()

}

if rv.IsValid() {

    fmt.Println(rv.Kind(), rv.Type(), rv)

}

输出为&s:


ptr *interface {} 0xc000010200

interface interface {} {}

struct main.CustomStruct {}


查看完整回答
反对 回复 2021-12-07
?
UYOU

TA贡献1878条经验 获得超4个赞

使用reflect.Indirect


package main


import (

    "fmt"

    "reflect"

)


func testFunc(value interface{}) {

    fmt.Println("---------------------")

    fmt.Println("type = " + reflect.ValueOf(value).Type().String())

    fmt.Println("kind = " + reflect.ValueOf(value).Kind().String())

    if reflect.ValueOf(value).Kind() == reflect.Ptr {

        fmt.Println("--> pointer ")

        pointsToValue := reflect.Indirect(reflect.ValueOf(value))

        fmt.Println("-->", pointsToValue.Kind(), " - ", pointsToValue.Type(), " - ", pointsToValue)

        if pointsToValue.Kind() == reflect.Slice {

            fmt.Println("--> slice !! ")

        }

    }

}


func main() {

    var testVar1 string

    var testVar2 []string

    var testVar3 []*string

    testVar2 = append(testVar2, "A")

    testVar2 = append(testVar2, "B")

    testFunc(testVar1)

    testFunc(testVar2)

    testFunc(testVar3)

    testFunc(testVar2)

    testFunc(&testVar2)

}

/*

---------------------

type = string

kind = string

---------------------

type = []string

kind = slice

---------------------

type = []*string

kind = slice

---------------------

type = []string

kind = slice

---------------------

type = *[]string

kind = ptr

--> pointer 

--> slice  -  []string  -  [A B]

--> slice !!

*/

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



查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

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