golang使用注意事项
1.可以给类型取别名,但是该类型和别名是两个不同的类型:
type myInt int
2.go支持可变参数:args...
0个或多个参数:func sum(args... int) sum int {}
1个或多个参数:func sum(n int, args... int) sum int {}
3.init()函数是初始化函数,如果有全局变量,执行顺序为:全局变量——> init()——>main()
4.匿名函数:
res := func(n1 int, n2 int) int { return n1 + n2 }(10, 20) fmt.Println(res)
a := func(n1 int, n2 int) int { return n1 - n2 } fmt.Println(a(10, 5))
5.全局匿名函数:
var( Fun1 = func(n1 int, n2 int) int { return n1 * n2 } ) func main() { b := Fun1(10, 5) fmt.Println(b) }
6.闭包:返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。
func makeSuffix(suffix string) func (string) string { return func (name string) string { if !strings.HasSuffix(name, suffix) { return name + suffix } return name } }
7.defer:当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈),当函数执行完毕后,再从defer栈,按照先入后出的方式出栈:
func sum1(n1 int, n2 int) int { defer fmt.Println("ok1 n1-", n1) defer fmt.Println("ok2 n2-", n2) res := n1 + n2 fmt.Println("ok3 res-", res) return res }
8.字符串遍历,同时处理有中文的问题 r := []rune(str)
str := "hello北京" r := []rune(str) for i := 1; i < len(r); i++ { fmt.Printf("字符=%c\n", r[i]) }
9.使用defer+recover来处理错误
func test(){ defer func() { err := recover() if err != nil { fmt.Println("err=", err) } }() num1 := 10 num2 := 0 res := num1 / num2 fmt.Println("res=", res) } func main() { test() }
10.自定义错误:errors.New和panic内置函数
1)errors.New("错误说明"), 会返回一个error类型的值,表示一个错误
2)panic内置函数,接收一个interface{}类型的值(也就是 任何值了)作为参数,可以接收error类型的变量,输出错误信息,并退出程序
func readConf(name string) (err error) { if name == "config.ini" { return nil } else { return errors.New("读取文件错误...") } } func test() { err := readConf("config.ini") if err != nil { panic(err) } fmt.Println("test()继续执行...") } func main() { test() }
人生就是要不断折腾