package main
import (
"errors"
"fmt"
)
// 函数
// 函数定义:
func Add(a int, b int) (ret int, err error) {
if a < 0 || b < 0 {
err = errors.New("should be non-negative numbers!")
return
}
return a + b, nil //支持多重返回值
}
//参数类型相同可这样声明
func Add1(a, b int) (ret int, err error) {
return 0, nil
}
// 返回值列表中返回的类型相同,也可以合并
func Add2(a, b int) int {
return 0
}
//函数命名规范
// 小写字母开头的函数只在本包内可见, 大写字母开头的函数才能被其他包使用\
// 不定参数类型
// ...type这个语法糖,再函数调用的时候,使代码更易读
func myfunc1(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}
func myfunc2(args []int) {
for _, arg := range args {
fmt.Println(arg)
}
}
// 不定参数的传递
func myfunc3(args ...int) {
myfunc1(args...) //按原样传递
myfunc1(args[1:]...) //分片传递
}
// 任意类型的不定参数
// 使用...interface{}传递任意类型数据是Go语言的惯用用法
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value")
case string:
fmt.Println(arg, "is a string value")
case int64:
fmt.Println(arg, "is an int64 value")
default:
fmt.Println(arg, "is an unknown type")
}
}
}
// 多返回值
// Go语言并不需要强制命名返回值,但是命名后的返回值可以让代码更清晰, 可读性更强
// 不关心的返回值,可以使用 '_' 来跳过这个返回值
// n, _ := f.Read(buf)
func main() {
fmt.Println(Add(2, 3))
myfunc1(1, 2, 3)
myfunc2([]int{1, 2, 3})
myfunc3(1, 2, 3)
var v1 int = 1
var v2 int64 = 123
var v3 string = "hello"
var v4 float32 = 1.234
MyPrintf(v1, v2, v3, v4)
// 匿名函数
f := func(x, y int) int {
return x + y
}(3, 4) // 花括号后直接跟参数列表表示函数调用
fmt.Println(f)
// fmt.Println(f(3, 4))
}