猿问

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

这个游乐场说明了我的问题。


基本上我有一个接受空接口作为参数的函数。我想传入任何内容并打印有关类型和值的信息。


它按预期工作,除非我将指针传递给自定义类型(在我的示例中,底层结构类型)。我不完全确定反射模型在那时是如何构建的。由于函数签名指定了一个interface{}参数,当我调用reflect.Indirect(v).Kind()它时自然会返回,interface但我想知道调用函数时的类型。


以下是来自操场的相同代码:


package main


import (

    "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("")

}


鸿蒙传说
浏览 195回答 2
2回答

慕容3067478

要获取结构值,您需要获取接口值的元素:fmt.Println("Indirect type is:", reflect.Indirect(reflect.ValueOf(v)).Elem().Type()) // prints main.CustomStructfmt.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 {} 0xc000010200interface interface {} {}struct main.CustomStruct {}

UYOU

使用reflect.Indirectpackage mainimport (    "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 = stringkind = string---------------------type = []stringkind = slice---------------------type = []*stringkind = slice---------------------type = []stringkind = slice---------------------type = *[]stringkind = ptr--> pointer --> slice  -  []string  -  [A B]--> slice !!*/https://play.golang.org/p/ysqIWQYyzn3
随时随地看视频慕课网APP

相关分类

Go
我要回答