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 []int
    for _, 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 main

import (
    "fmt"
    "sort"
)

// 定义一个 Student 结构体
type Student struct {
    Name  string
    Score 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 将对象编码为 JSON
    return 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.WaitGroup
    for 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,不喜轻喷~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC图形函数学习12——位图操作函数

位图即后缀为bmp的图形文件&#xff0c;MFC中有专门的函数处理这种格式的图形文件。这些函数只能处理作为MFC资源的bmp图&#xff0c;没有操作文件的功能&#xff0c;受限较多&#xff0c;一般常作为程序窗口界面图片、显示背景图片等用途。有关位图操作的步骤、相关函数等介绍…

钟睒睒的“傲慢与偏见”

文章内容根据网络内容整理形成 最近&#xff0c;钟睒睒关于绿瓶水不适合长期饮用的言论&#xff0c;在网上引起了一番新的热议&#xff0c;让刚平静不久的包装饮用水竞争&#xff0c;再次掀起一阵波澜&#xff0c;同时&#xff0c;其对于企业家直播带货的等系列看法&#xff0c…

比亚迪降价令背后的反思,创新还是压榨?

科技新知 原创作者丨依蔓 编辑丨蕨影 比亚迪要求供应商明年起降价10%&#xff1f; 近日&#xff0c;网传一封有关比亚迪乘用车要求供应商降价的邮件&#xff0c;署名为比亚迪集团执行副总裁、乘用车首席运营官何志奇。 邮件称&#xff0c;2025年市场竞争将更加激烈&#xff0…

自媒体图文视频自动生成软件|03| 页面和结构介绍

代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; 视频图片生成器 一个基于 Python 和 Web 的工具&#xff0c;用于生成带有文字和语音的视频以及图片。支持多种尺寸、…

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前&#xff0c;请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…

逻辑处理器核心指纹修改

navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义&#xff1a; third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…

Linux下的火墙管理及优化

从功能角度来讲 防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) 通过netfiler来管理kernel space中的策略 netfilter简介 Netfilter是Lin…

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址&#xff0c;点击启用 第三步 重启 Chrome&#xff1a;设置完成后&#xff0c;点击页面底部的 “Relaunch” 按钮&#xff0c;重新启动 Chrome 浏览器&#xff0c;使更改生效。

【Vue】Ego商城项目跟做

技术栈 Vue全家桶&#xff1a;Vue VueRouter Vuex Axios ElementUI 依赖安装 网络请求&#xff1a;npm install --save axios --no-fund Element&#xff1a;vue add element 后端相关依赖&#xff1a;npm install --save express cors mysql --no-fund token&#xff1a;np…

ALSA(4) --- CPU DAI实践

CPU_DAI实践 物理拓扑图 上图可知&#xff0c;从dma过来数据&#xff0c;会保存在DAI的一个FIFO队列中&#xff0c;数据是并行过来的各个通道数据&#xff0c;经过shift移位寄存器&#xff0c;再经过P2S并行转串行&#xff0c;再经过DAVC音量控制输出到GPIO端口 音频数据接口…

【开篇】.NET开源 ORM 框架 SqlSugar 系列

01. 前言 ☘️ 1.1 什么是ORM? 对象-关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;面向对象的开发方法是当今企业级应用开发环境中的主流开发方法&#xff0c;关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对…

EtherCAT Coe对象创建与通信

目录 前言使用SSC工具生成XML填充读写函数测试 前言 EtherCAT协议栈生成参考https://blog.csdn.net/qq_42039294/article/details/144061669 本文默认大家有EtherCAT基础的移植经验 使用SSC工具生成XML 首先确保COE是开启的 打开表格&#xff0c;编辑内容如下 更多的数据类…

Axure农业农村数据可视化大屏模板分享

在当今信息技术飞速发展的时代&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;凭借其高度的自定义能力和丰富的交互设计功能&#xff0c;在农业农村数据可视化领域展现出强大的潜力。本文将详细介绍A…

conda、pip同时安装包引起混乱问题剖析

一句话总结&#xff1a; 安装版本不一致时会有两个.dist-info文件夹&#xff08;举例&#xff1a;scapy-2.6.1.dist-info和scapy-2.4.3.dist-info&#xff09;&#xff0c;conda list和pip list依靠这两个文件夹进行包的识别&#xff08;疑似pip list识别老版本&#xff0c;co…

vue实现滚动条滑动到底部分页调取后端接口加载数据

一、案例效果 二、前提条件 接口返回数据 三、案例代码 子组件 const $emit defineEmits([cloneItem, updateList]);const props defineProps({rightList: {type: Array,},chartTableData: {type: Array as () > ChartListType[],},deleteChartInfo: {type: Object,}…

redis 底层数据结构

概述 Redis 6 和 Redis 7 之间对比&#xff1a; Redis6 和 Redis7 最大的区别就在于 Redis7 已经用 listpack 替代了 ziplist. 以下是基于 Redis 7基础分析。 RedisObject Redis是⼀个<k,v>型的数据库&#xff0c;其中key通常都是string类型的字符串对象&#xff0c;⽽…

arm rk3588 onnx转rknn

一、环境部署&#xff1a; https://github.com/airockchip/rknn_model_zoo/tree/main/examples/yolo11 从该网址下载yolo11的模型。支持80种类型检测 二、下载模型 进入examples/yolo11/model文件夹&#xff0c;执行 ./download_model.sh 如图&#xff1a; 三、模型转换…

Flutter 3.24.5安装配置——2024年11月26日

目录 1️⃣前置安装使用环境配置步骤安装Flutter SDK安装Android SDK修改文件默认安装位置&#xff08;.gradle, AVD&#xff09;开始项目 2️⃣执行结果&#x1fab2;Bug找不到**.jar文件 &#x1f517;参考链接 1️⃣前置安装 使用环境 Windows 11IDEA 2024.2.3Flutter 3.2…

Pytest-Bdd-Playwright 系列教程(13):钩子(hooks)

Pytest-Bdd-Playwright 系列教程&#xff08;13&#xff09;&#xff1a;钩子&#xff08;hooks&#xff09; 前言一、什么是钩子&#xff1f;二、Pytest-Bdd 提供的钩子一览三、钩子用法详解1. pytest_bdd_before_scenario2. pytest_bdd_after_scenario3. pytest_bdd_before_s…

23种设计模式-生成器(Builder)设计模式

文章目录 一.什么是生成器设计模式&#xff1f;二.生成器模式的特点三.生成器模式的结构四.生成器模式的优缺点五.生成器模式的 C 实现六.生成器模式的 Java 实现七.代码解析八. 总结 类图&#xff1a; 生成器设计模式类图 一.什么是生成器设计模式&#xff1f; 生成器模式&am…