【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

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英