我在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{}
,基本值是nil
。new
返回一个指向它创建的值的指针,因此它返回一个*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 {}
*/