2016-08-23 136 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

相关问题