1 Go语言中函数的声明如下: func 函数名 (变量名1,变量名2 变量类型1,变量名3 变量类型2)函数返回值类型{ 函数体 }。类型总是在名字后面,先有名字才有的类型。
package main
import (
"fmt"
)
func eval(a, b int, op string) int {
switch op {
case "+":
return a + b
case "-":
return a - b
case "*":
return a * b
case "/":
return a / b
default:
panic("unsupported operation" + op)
}
}
func main() {
fmt.Println(eval(3, 4, "*"))
}
输出结果为: 12
2 改良版 (可以解决panic带来的程序完全中断)
package main
import (
"fmt"
)
func eval(a, b int, op string) (int, error) //在这里函数返回类型为两个分别是int类型和error类型{
switch op {
case "+":
return a + b, nil //返回两个值
case "-":
return a - b, nil
case "*":
return a * b, nil
case "/":
return a / b, nil
default:
return 0, fmt.Errorf(
"unsupported operation: %s", op)
}
}
func div(a, b int) (q, r int) {
return a / b, a % b
}
func main() {
fmt.Println(eval(3, 4, "X"))
q, r := div(13, 5) //用q,r来接返回的值
fmt.Println(q, r)
}
输出结果为: 0 unsupported operation: X
2 3
3.函数返回可以返回多个值,在这里值得注意的是,只能用于简单的函数
现在我们再来看上面的加强版:
package main
import (
"fmt"
)
func eval(a, b int, op string) (int, error)//在这里函数返回类型为两个分别是int类型和error类型{
switch op {
case "+":
return a + b, nil //返回两个值
case "-":
return a - b, nil
case "*":
return a * b, nil
case "/":
return a / b, nil
default:
return 0, fmt.Errorf(
"unsupported operation: %s", op)
}
}
func div(a, b int) (q, r int) {
return a / b, a % b
}
func
func main() {
fmt.Println(eval(3, 4, "X"))
q, r := div(13, 5) //用q,r来接返回的值
fmt.Println(q, r)
}\
4
package main
import (
"fmt"
"math"
"reflect"
"runtime"
)
//在函数中调用函数,用a,b直接传入调用的函数中,并得到被调用的函数名
func apply(op func(int, int) int, a, b int) int {
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name()
fmt.Printf("Calling function %s with args "+"%d,%d\n", opName, a, b)
return op(a, b)
}
func div(a, b int) (q, r int) {
return a / b, a % b
}
func main() {
fmt.Println(eval(3, 4, "X"))
q, r := div(13, 5) //用q,r来接返回的值
fmt.Println(q, r)
fmt.Println(apply(
func(a int, b int) int {
return int(math.Pow(float64(a), float64(b)))//在这里我们调用pow函数,并根据apply函数返回类型把原本的float行式转成int 型。
}, 3, 4))
}
输出结果为: 0 unsupported operation: X
2 3
Calling function main.main.func1 with args 3,4
81//(3^4=81)
5 传入可变参数列表
package main
import (
"fmt"
)
func sum(numbers ...int) int {//这里的省略号表示传入的参数是无限的
s := 0
for i := range numbers {
s += numbers[i]
}
return s
}
func main() {
fmt.Println(sum(1, 2, 3, 4, 5))
}
输出结果为:15