2016-08-23 67 views
2

我對golang很陌生,一般編譯語言,所以請原諒我的無知。在這樣的一些代碼:變量賦值和傳遞參考之間有什麼區別?

package main 

import "fmt" 

func assign() int { 
    return 1 
} 

func reference(foo *int) int { 
    *foo = 2 
    return 0 
} 

func main() { 
    var a, b int 

    a = assign() 
    reference(&b) 

    fmt.Println(a) 
    fmt.Println(b) 
} 

...將值分配給與傳遞b通過引用有什麼實際區別?

就現實世界的代碼而言,爲什麼json.Unmarshal()要求你傳遞一個指向你空變量的指針,而不僅僅是返回Unmarshalled值,以便你可以將它分配給你的變量?

+0

Go是「按價值傳遞」。所以'reference'函數將一個指向一個整數的指針恰好作爲一個參考值。您不需要在該功能中返回任何內容。 – squiguy

回答

0

按值傳遞需要複製參數,但是在引用的情況下,您只需將指針發送到對象。 Golang默認傳值,包括切片。

對於關於json.Unmarshal的具體問題,我相信原因是這樣Unmarshal代碼可以驗證傳入的對象是否包含與json中找到的兼容類型相同的字段名稱。例如,如果json具有重複的字段,則需要在我們解析的對象中存在相應的切片。

所以,我們需要傳入我們希望將json字符串解組到的結構。它需要是一個指針,以便Unmarshal可以填充字段。如果你只是傳遞一個通用接口,Unmarshal將返回一張地圖。如果Unmarshal沒有使用指向結構/接口的指針,它可能已被實現爲始終返回一張地圖,但我認爲這樣更有用。

這是一個簡單的例子,但可能有用 - https://play.golang.org/p/-n8euepSS0

+0

啊,我明白了。我沒有考慮將特定類型傳遞給j​​son.Unmarshal()並使用它來「過濾」返回值。在迄今爲止我看到的所有示例中,所有內容都使用了一個接口來獲取JSON中的所有屬性。然而,如果該方法解析了json並將其返回,那麼您將不會有選擇。 – Marc

+0

「Golang默認通過價值傳遞,包括切片。」 - 這是真的,但它有點複雜,因爲片本身包含一個指向數據的指針,所以它作爲一個引用類型,例如,即使通過值傳遞,也可以修改元素:https://play.golang.org/p/XmmeiCkRYy 但是,根據容量的不同,追加可能會也可能不會,因爲append可能會修改指針以指向新的內存位置):https://blog.golang.org/go-slices-usage-and-internals [https://blog.golang.org/slices#TOC_4.](https://blog.golang.org/slices #TOC_4。) – user1431317

相關問題