我一直在閱讀有關 Go 如何通過指針與值將參數傳遞給函數的信息。我一直在閱讀有關接口類型的信息。而且我一直在篡改反射包。但很明顯,由于這里的示例代碼,我仍然不明白它是如何工作的:package mainimport ( "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為什么在這兩種情況下變量不同?
1 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
您的調試器很可能使用(或至少遵循)包的默認格式設置規則fmt:
對于復合對象,使用這些規則遞歸打印元素,布局如下:
struct: {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2 ...]
pointer to above: &{}, &[], &map[]
在您的第一種情況下,i它的值是 type *[]Business。因此,如果要打印(或檢查)的值是指向切片的指針,則它會打印為&[values].
在你的第二種情況下,i持有一個指向一個值的指針interface{},它是 type *interface{}。打印這種類型的值時,%p使用默認格式,它只是將內存地址打印為前綴為 . 的十六進制值0x。
- 1 回答
- 0 關注
- 153 瀏覽
添加回答
舉報
0/150
提交
取消