【Go】那么多数值类型,应该选哪一个?

原文连接:https://blog.thinkeridea.com/...html

Go 内置不少种数值类型,每每初学者不知道编写程序如何选择,使用哪一种数值类型更有优点。编程

内置的数值类型有:uint8uint16uint32uint64uintint8int16int32int64intjson

从类型名称上能够很好了解到类型的大小,这个很是直观,uintint 这两种类型是不带大小的,那么它们的大小会根据编译参数 GOARCH=amd64 平台决定的。ide

我最先设计的一个go的项目,当时设计系统使用采用最小类型原则,几乎使用了大多数数值类型,不多使用 uintint 类型,后来遇到不少问题,标准库和三方库函数都接收 intuintint64uint64, 一些代码生成工具, 好比 protobuf 生成类型是 int32,一些三方系统大多数也是 int 类型,这时候与其它组件件的交互就须要 <span style="color:red">类型转换</span>, 类型转换成本是很高的,致使程序性能并无预期的好。函数

上面一个小故事(事故)警醒你们不要一味的根据数据的大小选择数值类型,而要考虑数值的用来作什么,后面会有哪些交互,须要调用哪些函数等等,是否是选择数值具体使用什么类型很复杂呢?并非这样,考虑的越少,选择越简单,下面有一些近些年的总结。工具

  • 须要原子操做的数值根据数据大小选择 int32int64uint32uint64。由于原子类型的操做包天生支持这些类型。
  • 须要与代码生成的交互的数据,能够看生成的代码具体使用哪一种类型,作一下参考。
  • 须要调用大多数标准库函数进行处理,选这个 int (咱们的程序大多数跑在64位系统上,若是运行在32系统,且类型可能会超过 int32 能够选择 int64) 。
  • 有些时候可能咱们须要一个无符号数据且比较大优先选用 uintuint64
  • 只和本身的函数交互以及一些不关注具体类型的包(jsonfmt)交互式时,按数值使用范围选择最小类型。

我如今写代码一些特殊场景如原子操做会针对使用的包选择具体类型,偶尔会使用uint64,每每是一些按位作一些复杂计算的数据,也都局限在局部逻辑上,与其它模块或者系统交互的都会使用 int 类型,这样能够大幅度下降数值类型的类型转换问题,从而从空间换取时间,得到更好的程序性能。性能

不得不说说 Go 语言神奇的 int 类型,为何须要这样一个编程是没法肯定具体长度的类型呢,而须要在编译时肯定呢,有什么好处呢。ui

每每咱们写程序是不太关注数值类型的,或者说咱们程序中不少数值不会超过 int32 的最大值(每每咱们的程序运行在 32 或 64位平台上),这个时候不少三方库均可以使用 int 做为交互类型,不用把一个函数为每种类型数值都写一遍,能简化标准库。咱们也能写出更容易维护、简洁的系统。idea

转载:spa

本文做者: 戚银(thinkeridea

本文连接: https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html

版权声明: 本博客全部文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!

相关文章
相关标签/搜索