亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

混淆函數參數中的指針、切片和接口{}

混淆函數參數中的指針、切片和接口{}

Go
Helenr 2023-03-29 15:20:36
我一直在閱讀有關 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。


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號