为什么尽量不要使用反射?
这个问题是因为go官方json包引起的,官方包里的json编码与解码使用的就是反射,社区里都不推荐直接使用json.Marshal而是推荐easyjson,其中最重要的区别就是一个用了反射,一个没有用反射,easyjson的效率是官方包的3倍。 为什么反射会慢? 是因为在使用反射相关方法时会产生很多临时变量,所涉及的变量越多,GC带来的开销就越大,性能也就越低。所以easyjson这种不使用反射去解析json的就会快。
中文字符串长度及截取应该注意
go中的string底层是[]byte,byte是uint8的别称,代表一个字节,中文字符在utf-8字符集下是3个字节、所以,针对中文字符长度的判断不能用len()返回的是字节数不是中文字符数,同理也不能用于中文的截取操作,正确的做法如下
var str = "小手25是什么"
s:=[]rune(str)
fmt.Println(len(s)) //长度只有 7,每字汉字当一个字节
//等价于utf8.RuneCountInString(s)
fmt.Println(string(s[:4])) //取前4个,取出后转成string
//结果:小手25