我刚刚开始学习Go,有些事情引起了我的注意。
功能如下:
delete(map, "Answer") // for maps append(slice, 0) // for slices len(slice), cap(slice) // again for slices
等等。作为来自C语言的人,我想知道:
1)是否可以通过变量本身来调用这些函数(如中所述map.delete("Answer"))?
map.delete("Answer")
2)这是一种常见的做法(定义泛型函数并让其找出类型及其应执行的操作),还是仅用于内置类型。例如,如果我要定义自己的类型,例如MyCoolLinkedList,是否应该len在类型内定义和附加函数,并将其命名为
MyCoolLinkedList
len
list := new(MyCoolLinkedList) list.len()
还是应该定义一个接收列表的函数,例如:
len(list)
1-您不能将内置方法“附加”到类型或值上,例如
m := map[int]string{1: "one"} m.delete(1)
是一个编译时错误,可以轻松验证。
2- Go没有泛型。但是为了缓解“痛苦”,它提供了一些内置函数,可以接受不同类型的值。它们是内置的,因为(如上所述)由于缺少泛型,它们需要编译器的帮助才能接受不同类型的值。有些人还接受类型而不是表达式作为第一个参数(例如make([]int, 1)),这也是您不能创建的。内置函数没有标准的Go类型,它们只能出现在调用表达式中。
make([]int, 1)
您不能创建接受不同类型值的函数。话虽如此,当您创建自己的类型并为其创建“函数”时,建议将其声明为方法而不是辅助函数。就像“功能”在您的具体类型上运行一样,无论如何您都不能将其用于其他类型。
因此,将其声明为方法是有意义的,然后您可以更“优雅地”调用它,例如
value.Method()
作为一种方法,如果您需要实现一个接口,则也“算在内” 该类型的方法集,例如,在您需要实现一个接口的情况下,能够对列表进行排序是MyCoolLinkedList有意义的,例如sort.Interface,这需要一个Len() int方法。
sort.Interface
Len() int
在辅助函数上选择方法的另一个好处是,可以通过反射来使用您的方法。您可以使用该reflect程序包列出和调用某种类型的方法,但使用“ just”函数则无法做到这一点。
reflect