关于函数
函数定义
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 alias
import "strconv"
type Fuck func(int, int) string
func FuckFunc(a int, b int) string {
return strconv.Itoa(a + b)
}
package main
import (
"./alias"
"fmt"
)
func main() {
var testFunc alias.Fuck = alias.FuckFunc
fmt.Println(testFunc(1, 2))
}
匿名函数
带函数名的函数都是包级元素,实际上函数内部还可以使用匿名函数。所谓匿名函数就是没有函数名的函数,由于没有函数名指定匿名函数不可能是包级元素。
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