gpt4 book ai didi

pointers - 混淆函数参数中的指针、 slice 和接口(interface){}

转载 作者:IT王子 更新时间:2023-10-29 02:01:31 26 4
gpt4 key购买 nike

我一直在阅读有关 Go 如何通过指针与值将参数传递给函数的信息。我一直在阅读有关接口(interface)类型的信息。而且我一直在篡改反射包。但显然,由于这里的示例代码,我仍然不明白它是如何工作的:

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 函数收到了一个副本业务 slice ,因此,无论 DoSomething 做什么,我的 main 函数中的 business 变量都不会受到影响。

我接下来所做的是将我的 func DoSomething(b []Business) 更改为 func DoSomething(b interface{})。现在,当我尝试运行我的脚本时,我在 z := reflect.New(v.Type() .Elem())

我注意到对于 DoSomething(b []Business),变量 i == &[]。但是对于 DoSomething(b interface{}),变量 i == 0xc42000e1d0。为什么变量 i 在这两种情况下不同?

最佳答案

您的调试器很可能使用(或至少遵循)fmt 的默认格式化规则包裹:

For compound objects, the elements are printed using these rules, recursively, laid out like this:

struct:             {field0 field1 ...}
array, slice: [elem0 elem1 ...]
maps: map[key1:value1 key2:value2 ...]
pointer to above: &{}, &[], &map[]

在您的第一种情况下,i 持有类型为 *[]Business 的值。因此,如果要打印(或检查)的值是指向 slice 的指针,则它会打印为 &[values]

在第二种情况下,i 持有一个指向 interface{} 值的指针,该值的类型为 *interface{}。打印这种类型的值时,使用默认的 %p 格式,它只是将内存地址打印为前缀为 0x 的十六进制值。

关于pointers - 混淆函数参数中的指针、 slice 和接口(interface){},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52100007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com