

【Go】那么多数值类型,应该选哪个?
source link: https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【Go】那么多数值类型,应该选哪个?
Go
内置很多种数值类型,往往初学者不知道编写程序如何选择,使用哪种数值类型更有优势。
内置的数值类型有:uint8
、 uint16
、 uint32
、 uint64
、 uint
、 int8
、 int16
、 int32
、 int64
、 int
。
从类型名称上可以很好了解到类型的大小,这个非常直观,uint
和 int
这两种类型是不带大小的,那么它们的大小会根据编译参数 GOARCH=amd64
平台决定的。
我最早设计的一个go的项目,当时设计系统使用采用最小类型原则,几乎使用了大多数数值类型,很少使用 uint
和 int
类型,后来遇到很多问题,标准库和三方库函数都接收 int
、 uint
、 int64
、uint64
, 一些代码生成工具, 比如 protobuf
生成类型是 int32
,一些三方系统大多数也是 int
类型,这时候与其它组件件的交互就需要 类型转换, 类型转换成本是很高的,导致程序性能并没有预期的好。
上面一个小故事(事故)警醒大家不要一味的根据数据的大小选择数值类型,而要考虑数值的用来做什么,后面会有哪些交互,需要调用哪些函数等等,是不是选择数值具体使用什么类型很复杂呢?并不是这样,考虑的越少,选择越简单,下面有一些近些年的总结。
- 需要原子操作的数值根据数据大小选择
int32
、int64
、uint32
、uint64
。因为原子类型的操作包天生支持这些类型。 - 需要与代码生成的交互的数据,可以看生成的代码具体使用哪种类型,做一下参考。
- 需要调用大多数标准库函数进行处理,选这个
int
(我们的程序大多数跑在64位系统上,如果运行在32系统,且类型可能会超过int32
可以选择int64
) 。 - 有些时候可能我们需要一个无符号数据且比较大优先选用
uint
和uint64
。 - 只和自己的函数交互以及一些不关注具体类型的包(
json
、fmt
)交互式时,按数值使用范围选择最小类型。
我现在写代码一些特殊场景如原子操作会针对使用的包选择具体类型,偶尔会使用uint64
,往往是一些按位做一些复杂计算的数据,也都局限在局部逻辑上,与其它模块或者系统交互的都会使用 int
类型,这样可以大幅度降低数值类型的类型转换问题,从而从空间换取时间,获得更好的程序性能。
不得不说说 Go
语言神奇的 int
类型,为什么需要这样一个编程是无法确定具体长度的类型呢,而需要在编译时确定呢,有什么好处呢。
往往我们写程序是不太关注数值类型的,或者说我们程序中很多数值不会超过 int32
的最大值(往往我们的程序运行在 32 或 64位平台上),这个时候很多三方库都可以使用 int
作为交互类型,不用把一个函数为每种类型数值都写一遍,能简化标准库。我们也能写出更容易维护、简洁的系统。
Recommend
-
81
非对称竞技游戏如《第5人格》《黎明杀机》与传统的moba竞技类游戏相比,在数值设计上的重点差异是什么?这类游戏数值设计应该从什么方面入手,核心难点是什么?在数值调试过程中有没什么体验标杆可作为参考?
-
25
原文链接: https://blog.thinkeridea.com/... Go 内置很多种数值类型,往往初学者不知道编写程序如何选择...
-
36
-
59
常量 常量声明 常量是程序在编译时就确定的值,程序在执行时不能修改常量的值。声明常量使用关键字const。在声明常量时,需要对常量赋值。 const 名称 类型 = 值 或 const 名称 = 值 自动做类型...
-
9
同时搞定Android和iOS的Dart语言(3):数值类型
-
5
答案公布:EPA>WLTP>NEDC>CLTC前段时间有同学问到我现在电动车的续航标准这么多,我该信哪个?确实之前从人们都知道的 NEDC 到现在不少车企开始用的 CLTC,续航的标准已经不止一家了,在很多人眼中 NEDC 就已经很「虚标」了,现在更是摸不...
-
8
【笔记】JS字符串类型转换成数值类型 ...
-
5
一、JS中的数值类型 众所JS爱好友周知,JS中只有一个总的数值类型——number,它包含了整型、浮点型等数值类型。其中,浮点数的实现思想有点复杂,它把一个数拆成两部分来存储。第一部分是有效位数,也可以称作系数、分数或者尾数;第...
-
9
常见的20种网络安全攻击类型,你知道哪个? 作者:何威风 2022-11-08 07:24:16 恶意软件是恶意软件的总称,因此单词开头的“mal”。恶意软件会感染计算机并在其通过时改变其运行方式、破坏数据或监视用户或网络流量...
-
7
1.数值列表 列表非常适合用于存储数字集合,而python提供了很多工具,可帮助我们高速地处理数字列表。 1.1 range函数 python的range函数能够轻松的生成连续一系列数字。 其语法格式:range(第一个...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK