我一直在閱讀有關(guān) Go 如何通過(guò)指針與值將參數(shù)傳遞給函數(shù)的信息。我一直在閱讀有關(guān)接口類型的信息。而且我一直在篡改反射包。但很明顯,由于這里的示例代碼,我仍然不明白它是如何工作的: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)}當(dāng)我運(yùn)行這段代碼時(shí),它將打印一個(gè)包含 10 個(gè)業(yè)務(wù)結(jié)構(gòu)的列表,其中 Business.Name 為 Pizza 0 到 9。我知道在我的示例中,我的函數(shù)收到了業(yè)務(wù)切片的DoSomething副本,因此,business變量在我的主要功能中,無(wú)論做什么,都不會(huì)受到影響DoSomething。我接下來(lái)要做的是將我的更改func DoSomething(b []Business)為func DoSomething(b interface{}). 現(xiàn)在,當(dāng)我嘗試運(yùn)行我的腳本時(shí),出現(xiàn)panic: reflect: Elem of invalid type on在線運(yùn)行時(shí)錯(cuò)誤z := reflect.New(v.Type().Elem())我注意到DoSomething(b []Business), 變量i == &[]. 但是隨著DoSomething(b interface{}),變量i == 0xc42000e1d0。i為什么在這兩種情況下變量不同?
1 回答

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