分享两个在开发中需注意的小点

简介: 分享两个在开发中需注意的小点

文章目录:

  • 不要使用 + 和 fmt.Sprintf 操作字符串
  • +
  • fmt.Sprintf
  • bytes.NewBufferString
  • 对于固定字段的键值对,不要使用 map[string]interface{}
  • map[string]interface{}
  • 临时 Struct
  • 小结
  • 推荐阅读


不要使用 + 和 fmt.Sprintf 操作字符串

不要使用 +fmt.Sprintf 操作字符串,虽然很方便,但是真的很慢!

我们要使用 bytes.NewBufferString 进行处理。

基准测试如下:

+

func BenchmarkStringOperation1(b *testing.B)  {
 b.ResetTimer()
 str := ""
 for i := 0; i < b.N; i++ {
  str += "golang"
 }
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/stringoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStringOperation1
BenchmarkStringOperation1-12       353318     114135 ns/op
PASS
Process finished with the exit code 0

fmt.Sprintf

func BenchmarkStringOperation2(b *testing.B)  {
 b.ResetTimer()
 str := ""
 for i := 0; i < b.N; i++ {
  str = fmt.Sprintf("%s%s", str, "golang")
 }
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/stringoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStringOperation2
BenchmarkStringOperation2-12       280140     214098 ns/op
PASS
Process finished with the exit code 0

bytes.NewBufferString

func BenchmarkStringOperation3(b *testing.B)  {
 b.ResetTimer()
 strBuf := bytes.NewBufferString("")
 for i := 0; i < b.N; i++ {
  strBuf.WriteString("golang")
 }
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/stringoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStringOperation3
BenchmarkStringOperation3-12     161292136          8.582 ns/op
PASS
Process finished with the exit code 0

对于固定字段的键值对,不要使用 map[string]interface{}

对于固定字段的键值对,不要使用 map[string]interface{}!

我们要使用临时 Struct

基准测试如下:

map[string]interface{}

func BenchmarkStructOperation1(b *testing.B) {
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  var demo = map[string]interface{}{}
  demo["Name"] = "Tom"
  demo["Age"] = 30
 }
}
// 输出
goos: darwin
goarch: amd64
pkg: demo/structoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStructOperation1
BenchmarkStructOperation1-12     43300134         27.97 ns/op
PASS
Process finished with the exit code 0

临时 Struct

func BenchmarkStructOperation2(b *testing.B) {
 b.ResetTimer()
 for i := 0; i < b.N; i++ {
  var demo struct {
   Name string
   Age  int
  }
  demo.Name = "Tom"
  demo.Age = 30
 }
}
// 输出
oos: darwin
goarch: amd64
pkg: demo/structoperation
cpu: Intel(R) Core(TM) i7-8700B CPU @ 3.20GHz
BenchmarkStructOperation2
BenchmarkStructOperation2-12     1000000000          0.2388 ns/op
PASS
Process finished with the exit code 0

小结

你有类似这样的注意点吗,欢迎留言~

目录
相关文章
|
5月前
|
存储 安全 编译器
C++学习过程中的一些值得注意的小点(1)
C++学习过程中的一些值得注意的小点(1)
|
5月前
|
C++
C++语言中的一些小点
C++语言中的一些小点
|
11月前
每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧
每次都要写一堆样式代码?试试ViewModifier建立统一的样式规范吧
67 1
|
数据安全/隐私保护 iOS开发 芯片
将任意应用窗口置顶显示,这个工具太强了。
将任意应用窗口置顶显示,这个工具太强了。
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
C++
VS、ReSharper 设置修改代码颜色、提高代码辨识度!附VS超实用快捷!
ReSharper 配置代码颜色 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) ...
4918 0
|
Web App开发 XML JSON
程序人生 - 开发程序不写代码,而是靠拼图?
程序人生 - 开发程序不写代码,而是靠拼图?
216 0
程序人生 - 开发程序不写代码,而是靠拼图?
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
关于 Qt图形视图框架自绘图元放到左边和上边之外,部分在内进行拉伸后,拉伸多余的区域无法碰撞 的解决方法
【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )(二)
【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )(二)
393 0
【音频处理】Melodyne 选择工具使用 ( 主工具简介 | 修改音高 | 自动吸附 | 音符长度修改 | 长度自动吸附 | 设置音符分离线 | 设置片段分离线 )(二)