第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang:使用反射獲取指向結(jié)構(gòu)的指針

Golang:使用反射獲取指向結(jié)構(gòu)的指針

Go
收到一只叮咚 2022-11-23 20:09:31
我正在嘗試編寫遞歸遍歷結(jié)構(gòu)并跟蹤指向其所有字段的指針以進(jìn)行基本分析(大小、引用數(shù)量等)的代碼。但是,我遇到了一個(gè)問題,我似乎無法得到反射來給我指向純結(jié)構(gòu)的指針。我以下面的代碼為例:type foo struct {    A    *bar    data []int8}type bar struct {    B       *foo    ptrData *[]float64}func main() {    dataLen := 32    refData := make([]float64, dataLen)    fooObj := foo{data: make([]int8, dataLen)}    barObj := bar{        B:       &fooObj,        ptrData: &refData,    }    fooObj.A = &barObj    fooVal := reflect.ValueOf(fooObj)    _ := fooVal.Addr().Pointer() // fails    _ := fooVal.Pointer() // fails    // More analysis code after this}如果我想穿越fooObj,那就好了,直到我進(jìn)入barObj,然后我又遇到了fooObj。因?yàn)榈谝淮蝔ooObj遇到的指針沒辦法拿到,最后遍歷fooObj了兩次,直到碰到barObj第二次才退出遞歸。知道如何使用反射獲取結(jié)構(gòu)的指針嗎?
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊

package main


import (

    "reflect"

    "fmt"

)


type foo struct {

    A    *bar

    data []int8

}


type bar struct {

    B       *foo

    ptrData *[]float64

}


func main() {

    dataLen := 32

    refData := make([]float64, dataLen)

    

    // allocate here, now value has a pointer

    fooObj := &foo{data: make([]int8, dataLen)} 

    barObj := bar{

        B:       fooObj,

        ptrData: &refData,

    }

    fooObj.A = &barObj


    fooVal := reflect.ValueOf(fooObj)

    fmt.Println(fooVal.Pointer()) // succeeds


    // More analysis code after this

}

Addr 返回一個(gè)指針值,表示 v 的地址。如果 CanAddr() 返回 false,它會(huì)崩潰。Addr 通常用于獲取指向結(jié)構(gòu)字段或切片元素的指針,以便調(diào)用需要指針接收器的方法。


查看完整回答
反對(duì) 回復(fù) 2022-11-23
?
開滿天機(jī)

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊

如果可能的話,這需要一個(gè)值的指針。


package main


import "reflect"

import "fmt"


func main() {

    val := new(int)

    slice := []int{}

    local := 10

    fn := func() {}


    fmt.Println(PointerOf(val))

    fmt.Println(PointerOf(slice))

    fmt.Println(PointerOf(&local))

    fmt.Println(PointerOf(fn))

    fmt.Println(PointerOf(3))

}


func PointerOf(value any) (p uintptr, ok bool) {

    rValue := reflect.ValueOf(value)

    

    if(rValue.Kind() == reflect.Pointer || rValue.Kind() == reflect.Slice || rValue.Kind() == reflect.Func) {

        return rValue.Pointer(), true

    }    


    if(rValue.CanAddr()) {

        return rValue.Addr().Pointer(), true

    }


    return

}


查看完整回答
反對(duì) 回復(fù) 2022-11-23
?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

正如您所提到的,您的代碼在這部分失敗了


fooVal := reflect.ValueOf(fooObj)

_ = fooVal.Addr().Pointer() // fails

_ = fooVal.Pointer() // fails

In foostructdata不是指針值。


type foo struct {

    A    *bar

    data []int8

}

您正在嘗試在非指針類型上調(diào)用reflect.Value.Addr().Pointer()and ,從而導(dǎo)致錯(cuò)誤。reflect.Value.Pointer()


您可以通過檢查類型是否實(shí)際上是來防止這種情況ptr


package main


import (

    "reflect"

)


type foo struct {

    A    *bar

    data []int8

}


type bar struct {

    B       *foo

    ptrData *[]float64

}


func main() {

    dataLen := 32

    refData := make([]float64, dataLen)


    fooObj := foo{data: make([]int8, dataLen)}

    barObj := bar{

        B:       &fooObj,

        ptrData: &refData,

    }

    fooObj.A = &barObj


    fooVal := reflect.ValueOf(fooObj)


    if fooVal.Kind().String() == "ptr" {

        _ = fooVal.Addr().Pointer() // ok

        _ = fooVal.Pointer()        // ok


       // More analysis code for pointer types

    } else {

       // More analysis code for non-pointer types

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-11-23
  • 3 回答
  • 0 關(guān)注
  • 298 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)