func SayHello() { fmt.Println("Hello") }
看见了吧. go使用关键字func定义函数, 并在函数体中编写函数逻辑.
func SayHelloToSomeone(name string) { fmt.Println("Hello " + name + ".") }
函数SayHelloToSomeone接受一个string类型的参数name.
func GetGreeting (name string) string { greeting := "Hello " + name + "." return greeting } // test greeting := GetGreeting("Bob") fmt.Println(greeting) //outputs "Hello Bob."
当然这没有什么, 其他语言也可以做到. 但是, 准备好接受惊喜了吗?
func GetGreeting (name string) (greeting string) { greeting = "Hello " + name + "." return }
GetGreeting函数为其返回值指定了名称: greeting. 在函数体中就可以直接使用greeting变量了, greeting其实就相当于函数中定义的一个局部变量. 而且如你所见, GetGreeting函数的return语句后面没有加上返回值, 因为go会自动将greeting变量的值返回给调用者.
type Stack struct { pos int data [10]int } func (s *Stack) Pop() (value int, ok bool) { if s.pos > 0 { s.pos-- ok = true value = s.data[s.pos] return } ok = false return }
代码中首先定义了Stack类型, 并提供了Pop函数. Pop函数返回2个值: value和ok, 分别代表pop的值和pop操作是否成功.
type TormentList struct { patients []string } // 将[]string(string数组)包装成TormentList类型的指针 func NewTormentList(people []string) *TormentList { return &TormentList{people} }
接下来, 让我们悄悄给TormentList类型增加Map方法:
func (g *TormentList) Map(f func(string)) { // 遍历g.patients, 为其每个value调用f方法 for _, val := range(g.patients) { f(val) } }
Map方法接受f函数作为其输入参数, f函数接受一个string类型的值. 遍历TormentList的病人, 并为每个病人调用f函数.
patients := []string{"Anand", "David", "Ivan", "JoJo", "Jin", "Mon", "Peter", "Sachin"} gl := NewTormentList(patients) // 还记得上面定义的SayHelloToSomeone函数吧? gl.Map(SayHelloToSomeone) /* outputs the following: Hello Anand. Hello David. Hello Ivan. Hello JoJo. Hello Jin. Hello Mon. Hello Peter. Hello Sachin. */
func Screen(patients []string) func(string) bool { // 定义匿名函数并返回 return func(name string) bool { for _, soul := range patients { if soul == name { return true } } return false } }
// 吃过寿司的人的清单 those_who_bought_sushi := []string{"Anand", "JoJo", "Jin", "Mon", "Peter", "Sachin"} // 得到刷选器函数 bought_sushi := Screen(those_who_bought_sushi) // 调用刷选器函数就可以知道某人是否在清单上 fmt.Println(bought_sushi("Anand")) // true fmt.Println(bought_sushi("Alex")) // false
有疑问加站长微信联系(非本文作者)
