golang中 方法集的概念,你了解么?

polaris · 2013-08-17 13:35:01 · 4946 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-08-17 13:35:01 的主题,其中的信息可能已经有所发展或是发生改变。

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")
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4946 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传