关于函数
函数定义
func 函数名(形参列表) (返回参数列表){
函数体
}
如果函数没有返回值,返回参数列表可以省略。
Go里面没有“形参默认值”一说。
Go里面有些没有函数体的函数,这说明这个函数不是Go实现的,可能是其他语言实现的。
关于返回值
Go里面一个函数可以返回多值,这是比较特殊的地方。
当函数的某个返回值不被关注时,可以用“_”忽略它。
函数值
这个概念跟C里面的函数指针很像。Go认为函数也是一种值,也是可以传递的。使用函数值时,要注意一下几点:
· 函数值的“默认零值”是nil
· 函数值之间是不可比的
· 函数值不能作为map的key
示例代码
package main import ( "fmt" "reflect" ) func add_int(a, b int) (c int) { return a + b } func main() { fmt.Println(reflect.TypeOf(add_int)) var func_add func(int, int) int = add_int result := func_add(1, 2) fmt.Println(result) }
结果
func(int, int) int
3
匿名函数
带函数名的函数都是包级元素,实际上函数内部还可以使用匿名函数。所谓匿名函数就是没有函数名的函数,由于没有函数名指定匿名函数不可能是包级元素。
package main import "fmt" func main() { add := func(a, b int) int { return a + b } result := add(1, 2) fmt.Println(result) result = func(a, b int) int { return a - b }(1, 2) fmt.Println(result) }3
-1
关于方法
将函数绑定到类型上就是这个类型的方法。实际上这是Go对OOP独(ai)特(mei)的支持。
方法声明
func (值 类型) 方法名 (形参列表) (返回值列表){
方法体
}
package main import "fmt" type persion struct { name string age uint } func (p persion) sayHello() string { return p.name + " says: hello \n" } func (p_ptr *persion) sayFuck() string { return p_ptr.name + " says: fuck \n" } func main() { yong := persion{name: "thinking", age: 27} fmt.Print(yong.sayHello()) fmt.Print(yong.sayFuck()) p_yong := &yong fmt.Print(p_yong.sayFuck()) }
thinking says: hello
thinking says: fuck
thinking says: fuck