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.Ints、sort.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 语言开发中,常常需要进行一些常见的类型转换、字符串处理、时间处理等操作。本文将总结一些常用的工具方法,帮助大家提高编码效率,并提供必要的代码解释和注意事项(go新人浅浅记录一下,以后来翻看🤣&…...
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 是一个开源的物联网平台࿰…...
【Linux】select,poll和epoll
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符fd,一旦某个描述符就绪(一般是读就绪或者写就绪),系统会通知有I/O事件发生了(不能定位是哪一个)。但sel…...
Qt程序发布及打包成exe安装包
参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…...
python怎样运行js语句
1. 安装 pip install PyExecJS # 需要注意, 包的名称:PyExecJS 2. 简单使用 import execjs execjs.eval("new Date") 返回值为: 2018-04-04T12:53:17.759Z execjs.eval("Date.now()") 返回值为:152284700108…...
汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?
在汽车渲染领域,选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5(Unreal Engine 5)作为两大主流3D软件,各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…...
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版本控制系统时一个分布式系统,是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景:多人开发管理代码;异地开发,版本管理,版本回滚。 Git 的三个区域&a…...
如何分析Windows防火墙日志
Windows防火墙,也被称为Windows Defender Firewall,是一种内置的安全功能,可以主动监控和分析运行Windows操作系统的计算机上通过Windows防火墙的网络流量,主要目的是作为计算机和互联网或其他网络之间的屏障,使管理员…...
工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景
GPT-4o Realtime API 发布,语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互: 允许应用程序实时接收并响应语音和文本输入。自然语音生成: 减少 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的搜索和分析引擎,广泛用于大规模数据存储和快速检索。它最初由Shay Banon于20…...
R安装rgdal报错 解决办法
尝试了网上很多办法,不知道哪一步解决了,记录一下所有步骤: 1. 尝试github安装 options(repos c(CRAN "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))install.packages("devtools")library(devtools)devtools::in…...
【智能制造-46】人机工程(工厂自动化)
工作空间设计 设备布局规划 根据人体测量学数据,合理安排自动化设备、生产线和工作区域的布局。例如,考虑工人的操作空间和活动范围,确保他们能够舒适地接近和操作设备。在汽车装配车间,机器人和工人的工作区域应划分明确&#…...
C#笔记(5)
一、winform项目与窗体控件 1、部分类的使用 好处:让自动生成的代码后置,我们编写程序的代码显得更加简洁 特点:在最后编译的时候,仍然编译成一个窗体类。 窗体和控件的基本使用 3、Event事件(委托--》事件&#…...
【软件国产化】| Windows和Linux下文件名后缀是否区分大小写
今天在开发过程中遇到了个软件在Linux系统和Windows系统下功能表现不一致的bug,具体表现为: 插入一张图片(A文件夹中的001.jpg),然后使用“图片替换”功能,用B文件夹中的图片(B文件夹中的001.JP…...
讨论JAVA、JVM与Spring
Q1: 作为一个JAVA开发人员,对于jvm肯定不陌生,但很多人对它不陌生也仅止于概念上,而且对概念也是模糊不清的,但jvm实际是java程序运行在其中的实际存在的环境,对它的理解应该要是具象化的。 我们还是从一项技术产生的…...
【04】MySQL数据库和数据表的基本操作详解与实例
文章目录 一、连接MySQL服务器二、数据库的基本操作2.1数据库的基本操作1. 创建数据库2. 选择数据库3. 删除数据库4.查询所有数据库5.修改数据库的字符集 2.2 数据表的基本操作1. 创建数据表2. 查看数据表结构3. 删除数据表4. 修改数据表5. 插入数据6. 查询数据7. 更新数据8. 删…...
Spring中实现动态数据源切换,基于AbstractRoutingDataSource
背景 在项目开发过程中,我们可能会遇到一个场景:某个类型数据源有多个数据源实例,需要我们按照不同的请求切换到不同数据源去。 而目前绝大多数java应用都是基于Spring框架来开发,我们很多时候相关的数据源连接都是交给了Spring框…...
StarRocks-join优化
1、背景 有两个大表,都是6kw级别上下的,通过SR然后包装了一个接口对外提供查询,当前的问题是,这样大的join查询会导致BE直接宕机。并且这个sql很有代表性,我截图如下: 这个表是个单分区,所以直接…...
js 高亮文本中包含的关键词标红
在开发中,遇到需要将文本中包含的关键字高亮的情况,可以做以下处理。 <div class"title"v-html"highlightKeywords(item.title, state1.tags1.concat(state2.tags2).concat(state3.tags3))"> </div> ...... ...... con…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
