当果朗出现新的(接口{})时会发生什么



我在golang的接口中遇到了麻烦。接口{}表示任何类型。但我在戈兰新建了(接口{}(。会发生什么?它不等于类型为接口{}的变量并且它不能在点符号中进行赋值

以下是代码:

package main
import (
"fmt"
"reflect"
)
type S struct{}
func (s S) name() int { return 1 }
func main() {
var a, b interface{}
fmt.Println(a == b)
fmt.Printf("%#v   %#vn", a, b)
a = new(interface{ name() int })
fmt.Println(a == b)
fmt.Printf("%#v   %#vn", a, b)
}

new在任何接口类型上都会创建该类型的nil值并返回指向该值的指针。请记住,接口值只是一个包含两个字段的结构:类型和基础值。这种情况下的类型是interface{},基本值是nilnew返回一个指向它创建的值的指针,因此它返回一个*interface{}。您可以自己查看有关它的详细信息:

https://go.dev/play/p/PdknVrgAWfl

i := new(interface{})
fmt.Printf("i: %T, *i: %Tn", i, *i)
v := reflect.ValueOf(i)
fmt.Printf("Val: %#v, Kind: %s, Type: %+vn", v, v.Kind(), v.Type())
/*
i: *interface {}, *i: <nil>
Val: (*interface {})(0xc000014250), Kind: ptr, Type: *interface {}
*/

最新更新