package main;import ( "fmt" "time" "sync")//修改slice的坑func add(s []int) { //当s通过append添加元素时,这里会发生内存重新分配 //s会指向新的地址 s = append(s, 3);}//当需要对slice进行修改时,建议通过函数返回值把该slice返回func add2(s []int) []int { s = append(s, 3); return s;}func main() { //下面的二次打印结果都是[] s := make([]int, 0); fmt.Println(s); add(s); fmt.Println(s); //add2()返回的slice才是真正的修改后的slice s = add2(s); fmt.Println(s); //时间的格式化输出的坑 t := time.Now(); fmt.Println(t.Format(time.ANSIC)); //注意下面的字符串不能写错,写错了输出时间会不对 fmt.Println(t.Format("2006-01-02 15:04:05")); //for range中闭包的坑 a := []string{"a", "b", "c"}; swg := sync.WaitGroup{}; swg.Add(3); for _, v := range a { go func() { //注意,这里的闭包,v是引用的 //运行三次后,实际v指向的是slice最后一个元素 fmt.Println(v); swg.Done(); }(); } swg.Wait(); swg.Add(3); for _, v := range a { //修改成如下形式,以参数的形式传递进去 go func(s string) { fmt.Println(s); swg.Done(); }(v); } swg.Wait();}