一尘不染

通过变量访问函数

go

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

功能如下:

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在类型内定义和附加函数,并将其命名为

list := new(MyCoolLinkedList)
list.len()

还是应该定义一个接收列表的函数,例如:

len(list)

阅读 275

收藏
2020-07-02

共1个答案

一尘不染

1-您不能将内置方法“附加”到类型或值上,例如

m := map[int]string{1: "one"}
m.delete(1)

是一个编译时错误,可以轻松验证

2-
Go没有泛型。但是为了缓解“痛苦”,它提供了一些内置函数,可以接受不同类型的值。它们是内置的,因为(如上所述)由于缺少泛型,它们需要编译器的帮助才能接受不同类型的值。有些人还接受类型而不是表达式作为第一个参数(例如make([]int, 1)),这也是您不能创建的。内置函数没有标准的Go类型,它们只能出现在调用表达式中

您不能创建接受不同类型值的函数。话虽如此,当您创建自己的类型并为其创建“函数”时,建议将其声明为方法而不是辅助函数。就像“功能”在您的具体类型上运行一样,无论如何您都不能将其用于其他类型。

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

value.Method()

作为一种方法,如果您需要实现一个接口,则也“算在内”
该类型的方法集,例如,在您需要实现一个接口的情况下,能够对列表进行排序是MyCoolLinkedList有意义的,例如sort.Interface,这需要一个Len() int方法。

在辅助函数上选择方法的另一个好处是,可以通过反射来使用您的方法。您可以使用该reflect程序包列出和调用某种类型的方法,但使用“
just”函数则无法做到这一点。

2020-07-02