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()