当前位置: 首页 > news >正文

Go 语言常用工具方法总结

在 Go 语言开发中,常常需要进行一些常见的类型转换、字符串处理、时间处理等操作。本文将总结一些常用的工具方法,帮助大家提高编码效率,并提供必要的代码解释和注意事项(go新人浅浅记录一下,以后来翻看🤣)。

1. 类型转换

1.1 整数与字符串之间的转换

1.1.1 int 转 string
import "strconv"// IntToString 将 int 转换为 string
func IntToString(i int) string {return strconv.Itoa(i)
}

说明strconv.Itoa 是 Go 标准库中的函数,用于将整数转换为字符串。

1.1.2 int64 转 string
// Int64ToString 将 int64 转换为 string
func Int64ToString(i int64) string {return strconv.FormatInt(i, 10) // 10 表示以十进制格式转换
}

注意FormatInt 的第二个参数是基数,常用的有 10(十进制)、16(十六进制)等。

1.1.3 string 转 int
// StringToInt 将 string 转换为 int
func StringToInt(s string) (int, error) {return strconv.Atoi(s) // Atoi 是 "ASCII to integer" 的缩写
}

注意:如果字符串无法转换为整数,将返回错误。

1.1.4 string 转 int64
// StringToInt64 将 string 转换为 int64
func StringToInt64(s string) (int64, error) {return strconv.ParseInt(s, 10, 64) // 10 表示十进制,64 表示返回值的位数
}

注意ParseInt 的第三个参数指定了返回值的位数,通常使用 64。

1.2 浮点数与字符串之间的转换

1.2.1 float64 转 string
// Float64ToString 将 float64 转换为 string
func Float64ToString(f float64) string {return strconv.FormatFloat(f, 'f', -1, 64) // 'f' 表示以十进制格式输出
}

说明FormatFloat 的第二个参数控制输出格式,第三个参数控制小数点后位数,-1 表示使用默认。

1.2.2 string 转 float64
// StringToFloat64 将 string 转换为 float64
func StringToFloat64(s string) (float64, error) {return strconv.ParseFloat(s, 64) // 64 表示返回值的位数
}

注意:如果字符串无法转换为浮点数,将返回错误。

2. 字符串处理

2.1 字符串拼接

import "strings"// JoinStrings 将字符串切片拼接为一个字符串
func JoinStrings(strs []string, sep string) string {return strings.Join(strs, sep) // sep 是分隔符
}

说明Join 方法可以高效地拼接字符串,避免使用 + 运算符造成的性能损失。

2.2 字符串分割

import "strings"
// SplitString 将字符串按分隔符分割为切片
func SplitString(s, sep string) []string {return strings.Split(s, sep) // 返回分割后的字符串切片
}

注意:如果分隔符不存在,返回的切片将包含原字符串。

2.3 字符串去空格

import "strings"
// TrimString 去除字符串两端的空格
func TrimString(s string) string {return strings.TrimSpace(s) // 去除前后空格
}

说明TrimSpace 会去除字符串两端的所有空白字符。

2.4 字符串替换

import "strings"
// ReplaceString 替换字符串中的子串
func ReplaceString(s, old, new string, n int) string {return strings.Replace(s, old, new, n) // n 为替换次数,-1 表示替换所有
}

注意:如果 old 不在 s 中,返回的字符串与原字符串相同。

3. 时间处理

3.1 获取当前时间

import "time"// GetCurrentTime 获取当前时间
func GetCurrentTime() time.Time {return time.Now() // 返回当前时间
}

说明time.Now() 返回当前的本地时间。

3.2 时间格式化

// FormatTime 格式化时间为字符串
func FormatTime(t time.Time, layout string) string {return t.Format(layout) // layout 是时间格式,例如 "2006-01-02 15:04:05"
}

注意:Go 的时间格式化使用特定的布局,必须使用 2006-01-02 15:04:05 这种格式。

Tips
Go 标准库中没有直接提供时间格式常量,但可以通过定义常量来提高代码的可读性

const (DateFormat       = "2006-01-02"TimeFormat       = "15:04:05"DateTimeFormat   = "2006-01-02 15:04:05"FullDateFormat   = "Mon Jan 2 15:04:05 MST 2006"ChineseDateFormat = "2006年01月02日 15时04分05秒"
)

引出一个小问题:

Go 语言在时间处理方面的设计与 Java 等其他语言里的有所不同?没有一组常量或格式符号(如yyyy, MM,dd)等符号。

Go 语言的设计哲学强调简洁和明确。Go 的时间格式化使用的是一个固定的时间布局(Mon Jan 2 15:04:05 MST 2006),而不是使用一组常量或格式符号(如 yyyy, MM, dd 等)。这种设计使得时间格式化的方式非常直观,因为开发者可以直接看到格式化的样子,而不需要记住一堆格式符号。

3.3 字符串转时间

// StringToTime 将字符串转换为时间
func StringToTime(s, layout string) (time.Time, error) {return time.Parse(layout, s) // layout 必须与字符串格式一致
}

注意:如果字符串格式不符合布局,将返回错误。

4. 数组和切片处理

4.1 切片去重

// UniqueInts 从切片中去重
func UniqueInts(ints []int) []int {m := make(map[int]struct{}) // 使用 map 来记录出现过的元素var result []intfor _, v := range ints {if _, exists := m[v]; !exists {m[v] = struct{}{}result = append(result, v) // 只添加未出现过的元素}}return result
}

说明:使用 map 去重,时间复杂度为 O(n)。

4.2 切片排序

import "sort"// SortInts 对切片进行排序
func SortInts(ints []int) {sort.Ints(ints) // 使用 sort 包的 Ints 方法进行排序
}

注意sort.Ints 会对原切片进行排序,若需要保留原切片,请先复制。

4.2.1. 自定义排序
package mainimport ("fmt""sort"
)// 定义一个 Student 结构体
type Student struct {Name  stringScore int
}func main() {// 创建一个 Student 切片students := []Student{{"Alice", 85},{"Bob", 92},{"Charlie", 78},{"David", 88},}// 使用 sort.Slice 对切片进行排序sort.Slice(students, func(i, j int) bool {return students[i].Score < students[j].Score // 按分数升序排序})// 打印排序后的切片fmt.Println("按分数排序后的学生切片:")for _, student := range students {fmt.Printf("%s: %d\n", student.Name, student.Score)}
}

输出

按分数排序后的学生切片:
Charlie: 78
Alice: 85

小结

对于基本数据类型的切片,可以使用 sort.Intssort.Strings 等函数进行排序。

对于自定义数据类型的切片,可以通过实现 sort.Interface 接口来进行排序,或者使用 sort.Slice 函数来简化排序过程。

sort.Slice 提供了一种更简洁的方式来对切片进行排序,特别是在处理简单的排序逻辑时。

5. 错误处理

5.1 检查错误并处理

import "log"// CheckError 检查错误并处理
func CheckError(err error) {if err != nil {log.Println(err) // 打印错误日志}
}

说明:在 Go 中,错误处理是非常重要的,建议在每个可能出错的地方都进行错误检查。

6. JSON 处理

6.1 对象转 JSON

import "encoding/json"// StructToJSON 将结构体转换为 JSON 字符串
func StructToJSON(v interface{}) (string, error) {jsonData, err := json.Marshal(v) // Marshal 将对象编码为 JSONreturn string(jsonData), err
}

注意:如果对象中包含不可导出的字段,Marshal 将忽略这些字段。

6.2 JSON 转对象

// JSONToStruct 将 JSON 字符串转换为对象
func JSONToStruct(data string, v interface{}) error {return json.Unmarshal([]byte(data), v) // Unmarshal 将 JSON 解码为对象
}

注意:确保传入的对象是指针类型,以便 Unmarshal 能够正确填充数据。

7. 文件操作

7.1 读取文件

import ("io/ioutil""os"
)// ReadFile 读取文件内容
func ReadFile(filename string) (string, error) {data, err := ioutil.ReadFile(filename) // 读取文件return string(data), err
}

注意ioutil.ReadFile 会一次性读取整个文件,适合小文件。

7.2 写入文件

// WriteFile 将字符串写入文件
func WriteFile(filename, data string) error {return ioutil.WriteFile(filename, []byte(data), os.ModePerm) // 写入文件
}

注意os.ModePerm 表示文件的权限,通常使用默认权限即可。

8. 并发处理

8.1 使用 WaitGroup 等待多个 goroutine 完成

import ("sync"
)// WaitForGoroutines 等待多个 goroutine 完成
func WaitForGoroutines(goroutines int) {var wg sync.WaitGroupfor i := 0; i < goroutines; i++ {wg.Add(1) // 增加 WaitGroup 计数go func(i int) {defer wg.Done() // 完成时减少计数// 执行任务}(i)}wg.Wait() // 等待所有 goroutine 完成
}

说明sync.WaitGroup 是用于等待一组 goroutine 完成的同步原语。

总结

以上是 Go 语言中一些常用的工具方法的汇总。这些方法涵盖了类型转换、字符串处理、时间处理、数组和切片处理、错误处理、JSON 处理、文件操作以及并发处理等常见场景。通过这些工具方法,开发者可以提高编码效率,减少重复代码的编写。

一些小 tips

  • 在进行类型转换时,务必检查返回的错误,确保数据的有效性。
  • 字符串处理时,注意使用合适的分隔符和格式,避免因格式不匹配导致的错误。
  • 在并发编程中,确保对共享资源的访问是安全的,避免数据竞争。
  • 处理 JSON 时,确保结构体的字段是可导出的,以便正确编码和解码。

老 Java 初入 Go,不喜轻喷~~

相关文章:

Go 语言常用工具方法总结

在 Go 语言开发中&#xff0c;常常需要进行一些常见的类型转换、字符串处理、时间处理等操作。本文将总结一些常用的工具方法&#xff0c;帮助大家提高编码效率&#xff0c;并提供必要的代码解释和注意事项&#xff08;go新人浅浅记录一下&#xff0c;以后来翻看&#x1f923;&…...

ThingsBoard规则链节点:GCP Pub/Sub 节点详解

目录 引言 1. GCP Pub/Sub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 事件通知 3.4 任务调度 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0…...

【Linux】select,poll和epoll

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符fd&#xff0c;一旦某个描述符就绪(一般是读就绪或者写就绪)&#xff0c;系统会通知有I/O事件发生了&#xff08;不能定位是哪一个&#xff09;。但sel…...

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…...

python怎样运行js语句

1. 安装 pip install PyExecJS # 需要注意&#xff0c; 包的名称&#xff1a;PyExecJS 2. 简单使用 import execjs execjs.eval("new Date") 返回值为&#xff1a; 2018-04-04T12:53:17.759Z execjs.eval("Date.now()") 返回值为&#xff1a;152284700108…...

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域&#xff0c;选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5&#xff08;Unreal Engine 5&#xff09;作为两大主流3D软件&#xff0c;各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…...

JAVA实现将PDF转换成word文档

POM.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...

前端-Git

一.基本概念 Git版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…...

如何分析Windows防火墙日志

Windows防火墙&#xff0c;也被称为Windows Defender Firewall&#xff0c;是一种内置的安全功能&#xff0c;可以主动监控和分析运行Windows操作系统的计算机上通过Windows防火墙的网络流量&#xff0c;主要目的是作为计算机和互联网或其他网络之间的屏障&#xff0c;使管理员…...

工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景

GPT-4o Realtime API 发布&#xff0c;语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互&#xff1a; 允许应用程序实时接收并响应语音和文本输入。自然语音生成&#xff1a; 减少 AI 技术生成的语音…...

学习笔记041——Elastic Search的学习与使用以及SpringBoot整合

文章目录 1、Elastic Search介绍1.1、ES 的数据结构1.2、ES 为什么查询快1.3、CRUD 2、Spring Boot 整合 ES 1、Elastic Search介绍 ‌Elasticsearch‌是一个分布式的、基于RESTful API的搜索和分析引擎&#xff0c;广泛用于大规模数据存储和快速检索。它最初由Shay Banon于20…...

R安装rgdal报错 解决办法

尝试了网上很多办法&#xff0c;不知道哪一步解决了&#xff0c;记录一下所有步骤&#xff1a; 1. 尝试github安装 options(repos c(CRAN "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))install.packages("devtools")library(devtools)devtools::in…...

【智能制造-46】人机工程(工厂自动化)

工作空间设计 设备布局规划 根据人体测量学数据&#xff0c;合理安排自动化设备、生产线和工作区域的布局。例如&#xff0c;考虑工人的操作空间和活动范围&#xff0c;确保他们能够舒适地接近和操作设备。在汽车装配车间&#xff0c;机器人和工人的工作区域应划分明确&#…...

C#笔记(5)

一、winform项目与窗体控件 1、部分类的使用 好处&#xff1a;让自动生成的代码后置&#xff0c;我们编写程序的代码显得更加简洁 特点&#xff1a;在最后编译的时候&#xff0c;仍然编译成一个窗体类。 窗体和控件的基本使用 3、Event事件&#xff08;委托--》事件&#…...

【软件国产化】| Windows和Linux下文件名后缀是否区分大小写

今天在开发过程中遇到了个软件在Linux系统和Windows系统下功能表现不一致的bug&#xff0c;具体表现为&#xff1a; 插入一张图片&#xff08;A文件夹中的001.jpg&#xff09;&#xff0c;然后使用“图片替换”功能&#xff0c;用B文件夹中的图片&#xff08;B文件夹中的001.JP…...

讨论JAVA、JVM与Spring

Q1: 作为一个JAVA开发人员&#xff0c;对于jvm肯定不陌生&#xff0c;但很多人对它不陌生也仅止于概念上&#xff0c;而且对概念也是模糊不清的&#xff0c;但jvm实际是java程序运行在其中的实际存在的环境&#xff0c;对它的理解应该要是具象化的。 我们还是从一项技术产生的…...

【04】MySQL数据库和数据表的基本操作详解与实例

文章目录 一、连接MySQL服务器二、数据库的基本操作2.1数据库的基本操作1. 创建数据库2. 选择数据库3. 删除数据库4.查询所有数据库5.修改数据库的字符集 2.2 数据表的基本操作1. 创建数据表2. 查看数据表结构3. 删除数据表4. 修改数据表5. 插入数据6. 查询数据7. 更新数据8. 删…...

Spring中实现动态数据源切换,基于AbstractRoutingDataSource

背景 在项目开发过程中&#xff0c;我们可能会遇到一个场景&#xff1a;某个类型数据源有多个数据源实例&#xff0c;需要我们按照不同的请求切换到不同数据源去。 而目前绝大多数java应用都是基于Spring框架来开发&#xff0c;我们很多时候相关的数据源连接都是交给了Spring框…...

StarRocks-join优化

1、背景 有两个大表&#xff0c;都是6kw级别上下的&#xff0c;通过SR然后包装了一个接口对外提供查询&#xff0c;当前的问题是&#xff0c;这样大的join查询会导致BE直接宕机。并且这个sql很有代表性&#xff0c;我截图如下&#xff1a; 这个表是个单分区&#xff0c;所以直接…...

js 高亮文本中包含的关键词标红

在开发中&#xff0c;遇到需要将文本中包含的关键字高亮的情况&#xff0c;可以做以下处理。 <div class"title"v-html"highlightKeywords(item.title, state1.tags1.concat(state2.tags2).concat(state3.tags3))"> </div> ...... ...... con…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...