首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过变量访问的Go函数

通过变量访问的Go函数
EN

Stack Overflow用户
提问于 2016-08-22 15:37:23
回答 1查看 52关注 0票数 2

我刚开始学习围棋,有些事情引起了我的注意。

函数如下:

代码语言:javascript
复制
delete(map, "Answer") // for maps
append(slice, 0) // for slices
len(slice), cap(slice) // again for slices

诸若此类。作为一个来自类似C语言的人,我想知道:

1)是否可以通过变量本身调用这些函数(就像在map.delete("Answer")中一样)?

2)这是一种常见的做法(定义一个泛型函数,让它找出类型和它应该做的事情),或者这只是内置类型的做法。例如,如果我要定义自己的类型,比如MyCoolLinkedList,我是否应该在类型中定义len和append函数,并让它们像这样被调用

代码语言:javascript
复制
list := new(MyCoolLinkedList)
list.len()

或者我应该定义一个接收列表的函数,比如:

代码语言:javascript
复制
len(list)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-22 15:40:52

1-你不能调用“附加”到类型或值的内置方法,例如

代码语言:javascript
复制
m := map[int]string{1: "one"}
m.delete(1)

是一个编译时错误,你可以使用verify easily

2- Go doesn't have generics.但为了减轻“痛苦”,它提供了几个builtin函数,可以接受不同类型的值。它们是内置的,因为-as提到了-由于缺乏泛型,它们需要编译器的帮助才能接受不同类型的值。有些还接受类型而不是表达式作为第一个参数(例如make([]int, 1)),这也是您不能创建的东西。内置函数没有标准的Go类型,它们只能出现在call expressions中。

您不能创建这样的函数来接受不同类型的值。话虽如此,当您创建自己的类型并为其创建“函数”时,建议将其声明为method而不是帮助函数;就像“函数”在您的具体类型上操作一样,您无论如何也不能将其用于其他类型。

因此,将其声明为方法是有意义的,然后您可以像这样更“优雅”地调用它。

代码语言:javascript
复制
value.Method()

如果你需要实现一个接口,作为一种方法也可以“计算”到类型的method set,例如,在你的MyCoolLinkedList的情况下,实现sort.Interface来对列表进行排序是有意义的,例如,这需要一个Len() int方法。

选择一个方法而不是助手函数也有一个好处,那就是你的方法将通过反射可用。您可以使用reflect包列出和调用某个类型的方法,但不能使用"just“函数执行相同的操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39073756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档