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

2024-09-02 07:48
文章标签 类型 go 应该 数值

本文主要是介绍【Go】那么多数值类型,应该选哪个?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文链接:https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html

Go 内置很多种数值类型,往往初学者不知道编写程序如何选择,使用哪种数值类型更有优势。

内置的数值类型有:uint8uint16uint32uint64uintint8int16int32int64int

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

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

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

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

我现在写代码一些特殊场景如原子操作会针对使用的包选择具体类型,偶尔会使用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】那么多数值类型,应该选哪个?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129408

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性