Function 通过变量访问Go函数

Function 通过变量访问Go函数,function,go,Function,Go,我刚开始学习围棋,有些事情引起了我的注意 功能如下: delete(map, "Answer") // for maps append(slice, 0) // for slices len(slice), cap(slice) // again for slices 等等。作为一个喜欢C语言的人,我想知道: 1) 可以通过变量本身调用这些函数吗(如map.delete(“Answer”) 2) 这是一种常见做法(定义泛型函数并让它确定类型和应该做什么),还是只针对内置类型。例如,如果我要定义

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

功能如下:

delete(map, "Answer") // for maps
append(slice, 0) // for slices
len(slice), cap(slice) // again for slices
等等。作为一个喜欢C语言的人,我想知道:

1) 可以通过变量本身调用这些函数吗(如
map.delete(“Answer”)

2) 这是一种常见做法(定义泛型函数并让它确定类型和应该做什么),还是只针对内置类型。例如,如果我要定义自己的类型,比如
myCollinkedList
,我是否应该定义
len
并在类型内附加函数,然后像这样调用它们

list := new(MyCoolLinkedList)
list.len()
或者我应该定义一个接收列表的函数,如:

len(list)

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

m := map[int]string{1: "one"}
m.delete(1)
是一个编译时错误,您可以修改它

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

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

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

作为一个方法,如果您需要实现一个接口,例如,在您的
myCollinkedList
的情况下,实现能够对列表进行排序是有意义的,例如,这需要一个
Len()int
方法

选择方法而不是辅助函数还有一个优点,即可以通过反射使用方法。您可以使用包列出和调用某一类型的方法,但不能使用“just”函数

value.Method()