2017-03-09 35 views
1

在golang反映包零值reflect.Value的,reflect.value.IsValid有這些意見:什麼是golang

IsValid的報道V是否代表一個值。如果v是零值,它將返回false。如果IsValid返回false,除了String panic之外的所有其他方法。大多數函數和方法永遠不會返回無效值。如果有的話,其文件明確說明條件。

閱讀上面,我很困惑。我不知道什麼是反映的零值。價值和使用它調用isValid得到錯誤。

我寫一些代碼來測試:

var haha *int 
fmt.Println(reflect.ValueOf(haha).IsValid()) //true 
var hehe interface{} 
fmt.Println(reflect.ValueOf(hehe).IsValid() //false 
+1

您剛剛介紹了一個示例,顯示瞭如何使用ValueOf空接口返回零值。你感到困惑的是什麼? – JimB

+3

Go中的任何值都具有「零值」。數字爲0,「」爲字符串,零爲指針等。任何類型。所以'reflect.Value'類型的值爲零(無論如何)。這就是文檔正在討論的內容。遠離包裝反映,直到你非常熟悉Go。 – Volker

+0

@Volker在我的工作中,我需要使用反射來實現我的項目。使用反射pkg是非常危險的,但我想嘗試和學習。我熟悉golang,但是我不使用反映pkg的普通開發 – LittleDriver

回答

0

零值是寫入到內存地址提供沒有明確的初始化時的默認初始值。測試v是否爲零值實際上是測試是否已初始化v

var haha *int返回true,因爲haha是一個指針,不能用有理的「默認零值」創建,否則它會指向一個隨機地址在你的記憶中,並可能有危險的副作用。指針在創建時爲零,其他數據類型將具有實際值。

另一方面,var hehe interface{}的零值是一個nil * int,它是一個實際的實體。

+2

您給出的解釋可能有點誤導:Go沒有區分「剛剛聲明」和「已初始化」。任何已聲明的Go值將被初始化爲零值。指針和空接口示例的行爲完全相同,都由編譯器設置爲零。爲什麼hehe示例行爲不同的真正原因在reflect.ValueOf的文檔中描述:ValueOf看起來像在傳遞內容:對於哈哈的情況,ValueOf中的'i'包含一個非零接口{},其中包含一個nil * int 。哈哈案由最後一句解釋:i == nil。 – Volker

+0

@毒販你的兇手很清楚。我讀了reflect.ValueOf的文檔,然後我知道,零值是由reflect.ValueOf(nil)構造的。哈哈是指針,它指向無價值。呵呵是零,容器價值是零。所以,當我打電話reflect.ValueOf哈哈,這是返回一個reflect.Ptr類型的數據。但對於嘿嘿,它返回一個反映。無效的類型數據。謝謝 – LittleDriver