亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用反射在 Go 中查找空結構值?

如何使用反射在 Go 中查找空結構值?

Go
嚕嚕噠 2023-04-17 14:51:29
我一直在尋找并為此苦苦掙扎了一段時間。我發現了另一個 Stack Overflow 問題,它讓我朝著正確的方向前進但沒有用:Quick way to detect empty values via reflection in Go。我當前的代碼如下所示:structIterator := reflect.ValueOf(user)for i := 0; i < structIterator.NumField(); i++ {    field := structIterator.Type().Field(i).Name    val := structIterator.Field(i).Interface()    // Check if the field is zero-valued, meaning it won't be updated    if reflect.DeepEqual(val, reflect.Zero(structIterator.Field(i).Type()).Interface()) {        fmt.Printf("%v is non-zero, adding to update\n", field)        values = append(values, val)    }}然而,我fmt.Printf打印出了 theval和reflect.ZeroI have,即使它們相同,它仍然進入語句if并且每個字段都被讀取為非零,即使顯然不是這種情況。我究竟做錯了什么?我不需要更新字段,如果它們不為零,只需將它們添加到切片值中。
查看完整描述

1 回答

?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

對于初學者,如果IS為零值,則添加val到切片中,如果不是,則不添加。所以你應該檢查而不是你有什么。除此之外,您的代碼似乎工作正常:valuesval if !reflect.DeepEqual(...


package main


import (

    "fmt"

    "reflect"

)


type User struct {

    Name  string

    Age   int

    Email string

}


func main() {


    user, values := User{Name: "Bob", Age: 32}, []interface{}(nil)


    structIterator := reflect.ValueOf(user)

    for i := 0; i < structIterator.NumField(); i++ {

        field := structIterator.Type().Field(i).Name

        val := structIterator.Field(i).Interface()


        // Check if the field is zero-valued, meaning it won't be updated

        if !reflect.DeepEqual(val, reflect.Zero(structIterator.Field(i).Type()).Interface()) {

            fmt.Printf("%v is non-zero, adding to update\n", field)

            values = append(values, val)

        }

    }

}

輸出以下內容(Go Playground Link):


Name is non-zero, adding to update

Age is non-zero, adding to update

因此,正確地看到該Email字段未初始化(或更正確地,包含 的零值string)。


查看完整回答
反對 回復 2023-04-17
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號