我一直在阅读有关 Go 如何通过指针与值将参数传递给函数的信息。我一直在阅读有关接口类型的信息。而且我一直在篡改反射包。但很明显,由于这里的示例代码,我仍然不明白它是如何工作的:
package main
import (
"reflect"
"fmt"
)
type Business struct {
Name string
}
func DoSomething(b []Business) {
var i interface{}
i = &b
v := reflect.ValueOf(i).Elem()
for c:=0 ;c<10; c++ {
z := reflect.New(v.Type().Elem())
s := reflect.ValueOf(z.Interface()).Elem()
s.Field(0).SetString("Pizza Store "+ fmt.Sprintf("%v",c))
v.Set(reflect.Append(v, z.Elem()))
}
fmt.Println(b)
}
func main() {
business := []Business{}
DoSomething(business)
}
当我运行这段代码时,它将打印一个包含 10 个业务结构的列表,其中 Business.Name 为 Pizza 0 到 9。我知道在我的示例中,我的函数收到了业务切片的DoSomething副本,因此,business变量在我的主要功能中,无论做什么,都不会受到影响DoSomething。
我接下来要做的是将我的更改func DoSomething(b []Business)为func DoSomething(b interface{}). 现在,当我尝试运行我的脚本时,出现panic: reflect: Elem of invalid type on在线运行时错误z := reflect.New(v.Type().Elem())
我注意到DoSomething(b []Business), 变量i == &[]. 但是随着DoSomething(b interface{}),变量i == 0xc42000e1d0。i为什么在这两种情况下变量不同?
手掌心
相关分类