本章的三个例子来源与无闻老师的课程,很是感谢!闭包
所谓坑就是那些明明知道,但仍是容易犯错,一旦犯错,很久还查不出来的问题.app
通常你们都知道go中slice时会扩容的,在 append 时必定要写成s = append(s, var) 的形式,可是仍是会容易犯错,好比下面本想打印s扩容先后的值:code
package main import ( "fmt" ) func testAppend(s []string) { s = append(s, "1") // 注意参数的值拷贝特性 } func main() { s := make([]string, 0) fmt.Println(s) // [] testAppend(s) fmt.Println(s) // [] }
正确的用法应该是:orm
package main import ( "fmt" ) func testAppend(s []string) []string { return append(s, "1") } func main() { s := make([]string, 0) fmt.Println(s) // [] s = testAppend(s) fmt.Println(s) // [1] }
WTF "Mon Jan _2 15:04:05 2006"字符串
package main import ( "fmt" "time" ) func main() { now := time.Now() fmt.Println(now) // 2018-10-25 22:09:55.6575643 +0800 CST m=+0.005982101 fmt.Println(now.Format(time.ANSIC)) // Thu Oct 25 22:09:55 2018 fmt.Println(now.Format("Mon Jan _2 15:04:05 2006")) // Thu Oct 25 22:09:55 2018 fmt.Println(now.Format("Mon Jan _2 15:04:06 2006")) // Thu Oct 25 22:09:18 2018 } // 注意到了没,时间格式化的时候直接使用字符串,若是字符串和time包定义的常量不同,会返回错误的时间,可是却没有任何提示
package main import ( "bufio" "fmt" "os" ) func main() { str := []string{"a", "b", "c"} for _, s := range str { go func() { fmt.Println(s) // 闭包引用的是地址,打印结果是随机的 }() } inputReader := bufio.NewReader(os.Stdin) inputReader.ReadString('\n') }
正确的方式应该是input
func main() { str := []string{"a", "b", "c"} for _, s := range str { go func(s string) { fmt.Println(s) }(s) } inputReader := bufio.NewReader(os.Stdin) inputReader.ReadString('\n') }