获取通过接口获取的 var 上的指针
Get pointer on var obtained via interface
在下面的代码中
var a int
var b interface{}
b = a
fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, &b)
输出:
int, *int
int, *interface {}
我希望 &b 的类型是 int 上的指针。
我有两个问题:
1) 为什么它是接口{}上的指针?
2) 我怎样才能得到原始类型的指针?
&b
=> 这是address operator应用于变量b
,其类型是interface{}
。所以&b
将是一个*interface{}
类型的指针,指向变量b
。如果您取 T
类型变量的地址,结果将始终是 *T
.
类型
无法从b
获取变量a
的地址,因为赋值:
b = a
简单地将a
的值复制到b
中。它将 a
的值包装在类型 interface{}
的接口值中,并将此接口值存储到 b
中。该值与 a
.
完全分离
一般来说,所有 assignments 复制分配的值。 Go 中没有引用类型。如果您首先将 a
的地址存储在 b
中,那么最接近您想要的内容,例如:
b = &a
然后你可以使用type assertion从b
得到a
的地址,像这样:
fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, b.(*int))
此输出(在 Go Playground 上尝试):
int, *int
*int, *int
(注意:当你简单打印b
时,由于它是接口类型,fmt
包打印它包裹的(具体)值。)
查看相关问题:
刚刚完成. In case if you don't know the type of the value stored in the interface (and, hence, you can't explicitly use type assertion), you can use reflect包:
var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))
在下面的代码中
var a int
var b interface{}
b = a
fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, &b)
输出:
int, *int
int, *interface {}
我希望 &b 的类型是 int 上的指针。
我有两个问题:
1) 为什么它是接口{}上的指针?
2) 我怎样才能得到原始类型的指针?
&b
=> 这是address operator应用于变量b
,其类型是interface{}
。所以&b
将是一个*interface{}
类型的指针,指向变量b
。如果您取 T
类型变量的地址,结果将始终是 *T
.
无法从b
获取变量a
的地址,因为赋值:
b = a
简单地将a
的值复制到b
中。它将 a
的值包装在类型 interface{}
的接口值中,并将此接口值存储到 b
中。该值与 a
.
一般来说,所有 assignments 复制分配的值。 Go 中没有引用类型。如果您首先将 a
的地址存储在 b
中,那么最接近您想要的内容,例如:
b = &a
然后你可以使用type assertion从b
得到a
的地址,像这样:
fmt.Printf("%T, %T \n", a, &a)
fmt.Printf("%T, %T \n", b, b.(*int))
此输出(在 Go Playground 上尝试):
int, *int
*int, *int
(注意:当你简单打印b
时,由于它是接口类型,fmt
包打印它包裹的(具体)值。)
查看相关问题:
刚刚完成
var a int
var b interface{}
b = &a
fmt.Println(reflect.TypeOf(b))