有两种方法可以将参数传递给函数。一个按值传递,另一个按引用传递。这两种方式都有不同的概念,有时会给程序员带来困惑。
简单来说,传递值是指我们传递参数时没有指向该值的原始地址的指针。并且通过引用传递是当我们使用指向给定参数的指针传递参数时。
在Golang中,我们可以在下面的示例中看到这两个。
func passByValue(item string){} func passByReference(item * string){}
在Golang中通过引用传递和值传递
一个简单得例子:
package mainimport ( "fmt")func main() { item := "" passByValue(item) fmt.Println(item) passByReference(&item) fmt.Println(item)}func passByValue(item string) { item = "hello"}func passByReference(item *string) { *item = "world"}
上面的示例显示了我们可以根据类型(通过引用或值)传递参数的典型方法。
Golang中的接口参数传递参考
但是,有一天。我遇到了一个问题,我需要解决有关通过引用传递参数的问题。不像我曾经做过的任何普通的,这个在参数中使用接口。所以基本上,这个函数接受任何内容interface{},并根据该函数内部发生的逻辑填充值。
该功能如下所示。
func doSomethinWithThisParam(item interface {}){}
这个函数很简单,它只接受一个接口,并在其中做一些事情。它不会返回任何错误,因此它只是用项中的值来水合项目。
因此,为了解决这种奇怪的行为,我试图通过自己尝试来解决。下面我将解释我如何解决它的步骤。
第一次尝试:指向接口的指针
package mainimport ( "fmt")func main() { var item Student doSomethinWithThisParam(&item) fmt.Printf("%+v