go规范中提到过方法集的概念,你了解么?下面的代码输出结果是啥?
package main
import "fmt"
type t1 int
type t2 int
func( t *t1) String() string { return "ptr" }
func( t t2) String() string { return "val" }
func main() {
var a t1
var b t2
a = 5
fmt.Println( a, b)
}
结果分析:
指针的方法集包括两部分:(t *T)这样的方法和(t T)这样的方法;
值得方法集只包含本身,即:(t T)这样的方法
不过有一点别弄混了:
方法集的概念是对接口来说的
实际上,一个值类型a是可以调用(t *T)这样的方法的,因为调用时会变为:&a
具体分析:
a是一个t1类型,t1类型针对指针实现了String()方法,a是一个值的时候,并不享受t1类型指针绑定的String()方法。b是一个t2类型,t2类型针对值实现了String方法,所以b实现了stringer接口,所以被调用了String()方法,打印val.
进入fmt.Println后过程如下:
//传入fmt.Println后,其实,相当于要做如下判断
var c interface{}
c = a
switch c.(type) {
case fmt.Stringer:
fmt.Println("a is Stringer type")
default:
fmt.Println("a is not Stringer type")
}
c = b
switch c.(type) {
case fmt.Stringer:
fmt.Println("b is Stringer type")
default:
fmt.Println("bi is not stringer type")
}
有疑问加站长微信联系(非本文作者)