【Go】那么多数值类型,应该选哪个?
原文链接:https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html
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
作为交互类型,不用把一个函数为每种类型数值都写一遍,能简化标准库。我们也能写出更容易维护、简洁的系统。
转载:
本文作者: 戚银(thinkeridea)
本文链接: https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
【Go】那么多数值类型,应该选哪个?的更多相关文章
- MySQL数据类型——数值类型
1.1.1 整型 整型 占用字节 范围 范围 tinyint 1 -27~27-1 -128~127 smallint 2 -215~215-1 -32768~32767 mediumint 3 -2 ...
- { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型
MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...
- day41——数值类型、完整性约束
day41 数值类型 整数类型 有符号的设置 mysql> create table t1(id tinyint); # 默认有符号,即数字前有正负号 无符号的设置 mysql> crea ...
- Python黑帽编程2.2 数值类型
Python黑帽编程2.2 数值类型 数值类型,说白了就是处理各种各样的数字,Python中的数值类型包括整型.长整型.布尔.双精度浮点.十进制浮点和复数,这些类型在很多方面与传统的C类型有很大的区 ...
- MySQL的数值类型,时间
数值类型 整数型 tinyint smallint mediumint int|integer bigint 注意: 1, 如何选择数据类型,我们的原则是:够用就行!尽量的选择占用内存小的整型 ...
- .Net判断一个对象是否为数值类型探讨总结(高营养含量,含最终代码及跑分)
前一篇发出来后引发了积极的探讨,起到了抛砖引玉效果,感谢大家参与. 吐槽一下:这个问题比其看起来要难得多得多啊. 大家的讨论最终还是没有一个完全正确的答案,不过我根据讨论结果总结了一个差不多算是最终版 ...
- .Net判断一个对象是否为数值类型
这乍一听是个很简单的事,但突然搞起来还真有点无从下手的感觉. 首先当然是通过GetType()方法反射获取其类型信息,然后对其进行分析,但是类型信息Type中并没有简单地给出这么一个属性进行判断. 老 ...
- C++中string转化为常用数值类型
//模板类 用于将string类型转化为 常用数值类型 template <class Type> Type stringToNum(const string& str) { is ...
- MySQL(7):数值类型
1. 数值类型
随机推荐
- Java中String连接性能的分析【转】
[转]http://www.blogjava.net/javagrass/archive/2010/01/24/310650.html 总结:如果String的数量小于4(不含4),使用String. ...
- Spring mvc 整合PageHelper
Integer page=queryBean.getPage(); Integer pageSize=queryBean.getPageSize(); response.setContentType( ...
- GWAS文献解读:The stability of educational achievement across school years is largely explained by genetic factors
方法 从NPD(英国数据库,收集有关学生在学年中学业成绩的数据)和TEDS(英国国家课程指南报告成绩数据库,由国家教育研究基金会和资格与课程管理局制定标准化核心学术课程)数据库获得双胞胎的学业成绩数据 ...
- postgres 基本操作
登陆: $ psql -U <user> -d <dbname> 数据库操作: $ \l //查看库 $ \c <dbname> //切换库 // ...
- Hadoop生态圈-zookeeper完全分布式部署
Hadoop生态圈-zookeeper完全分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客部署是建立在Hadoop高可用基础之上的,关于Hadoop高可用部署请参 ...
- wxpython多线程通信的应用-实现边录音边绘制音谱图
#!bin/bash/python # -*- coding=utf-8 -*- from __future__ import division import threading import wx ...
- 第六节:框架搭建之EF的Fluent Api模式的使用流程
一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...
- [物理学与PDEs]第4章第2节 反应流体力学方程组 2.4 反应流体力学方程组的数学结构
1. 粘性热传导反应流体力学方程组是拟线性对称双曲 - 抛物耦合组. 2. 理想反应流体力学方程组是一阶拟线性对称双曲组 (取 ${\bf u},p,S,Z$ 为未知函数). 3. 右端项具有间 ...
- java8 按对象属性值分组
Map<String, List<User>> userMap = list.stream().collect(Collectors.groupingBy(User::getG ...
- LCA学习笔记
写在前面 目录 一.LCA的定义 二.暴力法求LCA 三.倍增法求LCA 四.树链剖分求LCA 五.LCA典型例题 题目完成度 一.LCA的定义 LCA指的是最近公共祖先.具体地,给定一棵有根树,若结 ...