golang中的那些坑

本章的三个例子来源与无闻老师的课程,很是感谢!闭包

所谓坑就是那些明明知道,但仍是容易犯错,一旦犯错,很久还查不出来的问题.app

1. slice扩容的坑

通常你们都知道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]
}

2. 时间包的坑

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包定义的常量不同,会返回错误的时间,可是却没有任何提示

3. 闭包的坑

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')
}
相关文章
相关标签/搜索