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

Go语言24小时极速学习教程(三)常见标准库用法

常见标准库

常见标准库即Go语言自带的库,这里的所有包都可以通过import直接引入,如果你觉得实在是不好用,那么请先保证你学会了标准库的基础上,再学一下Gookit,特别是其中的GoUtil,千万不要轻易自己去造轮子。

1. fmt包

如果参加go语言相关算法竞赛,这个包里的以下几个函数是必学。平时工作中输出基本全用Println就足够了,主要为了打日志,平时的输入要么是接口传进来、要么是界面输入的。

  • 格式化输出
    • fmt.Println():用于打印输出内容并换行,可接受多个不同类型的参数,类似于JavaScript的console.log,例如:fmt.Println("你好", 123)
    • fmt.Printf():按照指定的格式化字符串输出内容。例如:fmt.Printf("我是 %s ,我已经 %d 岁了。\n", "萌萌", 3),其中%s用于格式化字符串,%d用于格式化整数。
    • fmt.Errorf():同样也是按格式化输出,只不过是将输出内容输出到错误流上。(主流操作系统的控制台由三个流构成,即输入流、输出流、错误流)
  • 格式化输入
    • fmt.Scan():从标准输入流读取用户输入,按照空格分割并将值赋给相应的变量。例如:var name string; var age int; fmt.Scan(&name, &age)

2. os和bufio包

  • 文件操作
    • 打开文件:file, err := os.Open("test.txt"),如果文件不存在会返回错误。
    • 创建文件:file, err := os.Create("new.txt")
    • 读取文件内容:
      • 可以使用bufio包结合os包来高效读取。例如:
file, err := os.Open("test.txt")
if err!= nil {panic(err)
}
defer file.Close()
reader := bufio.NewReader(file)
line, _, err := reader.ReadLine()
if err!= nil {panic(err)
}
fmt.Println(string(line))

写入文件内容:

file, err := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY, 0600)
if err!= nil {panic(err)
}
defer file.Close()
_, err = file.WriteString("这是新追加的一行\n")
if err!= nil {panic(err)
}
  • 获取操作系统相关信息
    • os.Getenv("PATH"):获取环境变量PATH的值。
    • os.Args:获取命令行参数,os.Args[0]是程序名,os.Args[1:]是传入的参数,这一点上和Java以及C#很不一样,我们往往都是通过main方法的参数来获取命令行传递的参数,而Go则是通过os包来获取命令行参数。

3. strings包

  • 字符串操作
    • 字符串查找:strings.Contains("hello world", "world"),返回true,用于判断一个字符串是否包含另一个字符串。
    • 字符串替换:strings.Replace("hello world", "world", "golang", 1),将"world"替换为"golang"一次。
    • 字符串分割:parts := strings.Split("a,b,c", ","),按照逗号分割字符串,得到["a", "b", "c"]
    • 字符串连接:result := strings.Join([]string{"a", "b", "c"}, "-"),将字符串切片用-连接起来,得到"a - b - c"

4. time包

  • 时间获取与格式化
    • 获取当前时间:now := time.Now()
    • 时间格式化:fmt.Println(now.Format("2006-01-02 15:04:05")),一定一定要注意!Go语言中格式化时间的常量2006-01-02 15:04:05是固定写法,不知为什么。
    • 时间计算:
now := time.Now()
later := now.Add(time.Hour * 2)
fmt.Println(later)

5. net包

  • Socket通信
    TCP服务器:
ln, err := net.Listen("tcp", ":8080")
if err!= nil {panic(err)
}
for {conn, err := ln.Accept()if err!= nil {panic(err)}go handleConnection(conn)
}

TCP客户端:

conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err!= nil {panic(err)
}
_, err = conn.Write([]byte("你好啊,看没看到我?"))
if err!= nil {panic(err)
}
  • 访问HTTP接口
    采用Get方式获取响应数据
package main
import ("fmt""io/ioutil""net/http"
)
func main() {// 发起GET请求resp, err := http.Get("http://example.com")if err!= nil {fmt.Printf("请求出错: %v\n", err)return}defer resp.Body.Close()// 读取响应体内容body, err := ioutil.ReadAll(resp.Body)if err!= nil {fmt.Printf("读取响应体出错: %v\n", err)return}fmt.Printf("响应状态码: %d\n", resp.StatusCode)fmt.Printf("响应内容: %s\n", string(body))
}

采用Post方式获取响应数据

package main
import ("bytes""fmt""io/ioutil""net/http"
)
func main() {// 要发送的数据data := []byte("这是要发送的POST数据")// 创建一个POST请求resp, err := http.Post("http://example.com", "application/json", bytes.NewBuffer(data))if err!= nil {fmt.Printf("请求出错: %v\n", err)return}defer resp.Body.Close()// 读取响应体内容body, err := ioutil.ReadAll(resp.Body)if err!= nil {fmt.Printf("读取响应体出错: %v\n", err)return}fmt.Printf("响应状态码: %d\n", resp.StatusCode)fmt.Printf("响应内容: %s\n", string(body))
}

6. sync包

如果你不做高并发编程,平时只是写点自动化小工具,或者只是用现成的框架搭个MVC架构写套增删改查接口,这个包基本上用不到。你如果要做消息队列、排队导出PDF、IoT项目,那一定会用到。

互斥锁(Mutex):最简单的锁,类似于Java的synchronized

var mutex sync.Mutex
var count int
func increment() {mutex.Lock()count++mutex.Unlock()
}

读写锁(RWMutex):

var rwMutex sync.RWMutex
var data map[string]string
func readData() {rwMutex.RLock()// 读取数据操作rwMutex.RUnlock()
}
func writeData() {rwMutex.Lock()// 修改数据操作rwMutex.Unlock()
}

等待组(WaitGroup):

var wg sync.WaitGroup
func worker() {defer wg.Done()// 执行任务
}
wg.Add(3)
go worker()
go worker()
go worker()
wg.Wait()

7. encoding/json包

  • JSON处理
    结构体转JSON:
type Person struct {Name string `json:"name"`Age  int    `json:"age"`
}
p := Person{Name: "张三", Age: 25}
result, err := json.Marshal(p)
if err!= nil {panic(err)
}
fmt.Println(string(result))

JSON转结构体:

jsonStr := `{"name": "李四", "age": 30}`
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err!= nil {panic(err)
}
fmt.Println(p.Name, p.Age)

8.syscall包

用于调用当前操作系统内置的包或函数,比如我们在Windows下控制鼠标的移动,还需要golang.org/x/sys/windows的配合,这样就可以随时调用Win32API了。

import ("golang.org/x/sys/windows""syscall"
)func main() {// 获取user32.dll句柄user32, err := windows.LoadLibrary("user32.dll")if err != nil {panic(err)}defer windows.FreeLibrary(user32)// 获取SetCursorPos函数指针procSetCursorPos, err := windows.GetProcAddress(user32, "SetCursorPos")if err != nil {panic(err)}// 调用SetCursorPos函数设置鼠标位置x := int32(100)y := int32(100)syscall.Syscall(procSetCursorPos, 2, uintptr(x), uintptr(y), 0)
}

再比如下面这个从注册表取数,获取默认打印机的例子:

import ("fmt""golang.org/x/sys/windows""syscall"
)func main() {// 获取打印机信息的结构体大小var size uint32err := windows.GetPrinterData(windows.HKEY_CURRENT_USER,syscall.StringToUTF16Ptr("Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"),syscall.StringToUTF16Ptr("Device"),nil,&size)if err!= windows.ERROR_INSUFFICIENT_BUFFER {fmt.Println("获取打印机信息大小失败:", err)return}// 分配缓冲区buffer := make([]uint16, size/2)// 获取打印机信息err = windows.GetPrinterData(windows.HKEY_CURRENT_USER,syscall.StringToUTF16Ptr("Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"),syscall.StringToUTF16Ptr("Device"),(*byte)(&buffer[0]),&size)if err!= nil {fmt.Println("获取打印机信息失败:", err)return}fmt.Printf("默认打印机名称: %s\n", windows.UTF16ToString(buffer))
}

9.其他的轮子

以下是Go语言其他次常用的内置标准库:

名称作用常见用法
io用于处理输入输出操作,提供了对数据流的读写等功能io.Copy可用于将一个io.Reader的数据复制到一个io.Writer,例如将一个文件的内容复制到另一个文件。buf := make([]byte, 1024); n, err := io.ReadFull(reader, buf)用于从reader读取指定长度的数据到buf
strings处理字符串相关操作,如查找、替换、分割等strings.Contains("hello world", "world")用于判断字符串是否包含另一个字符串。strings.Replace("hello world", "world", "Go", 1)用于替换字符串中的部分内容。parts := strings.Split("a,b,c", ",")用于分割字符串。
strconv进行字符串和基本数据类型(如整数、浮点数等)之间的转换num, err := strconv.Atoi("123")将字符串转换为整数。str := strconv.Itoa(456)将整数转换为字符串。
bytes操作字节切片,类似于strings库对字符串的操作,但针对字节类型bytes.Contains([]byte("hello"), []byte("ell"))判断字节切片是否包含另一个字节切片。newBytes := bytes.Replace([]byte("hello"), []byte("ll"), []byte("LL"), 1)进行字节切片的替换。
atomic提供原子操作,用于在并发环境下安全地操作变量,如原子性的增加、减少、交换等操作var num int32 = 5; atomic.AddInt32(&num, 1)原子性地给num加1。
math提供数学相关的函数,如三角函数、对数函数、幂函数等result := math.Sqrt(9)计算9的平方根。sinVal := math.Sin(math.Pi / 2)计算正弦值。
sort用于对切片进行排序操作对于整数切片nums := []int{3, 1, 4, 1, 5, 9, 2, 6}sort.Ints(nums)可以对其进行排序。

相关文章:

Go语言24小时极速学习教程(三)常见标准库用法

常见标准库 常见标准库即Go语言自带的库,这里的所有包都可以通过import直接引入,如果你觉得实在是不好用,那么请先保证你学会了标准库的基础上,再学一下Gookit,特别是其中的GoUtil,千万不要轻易自己去造轮…...

大数据环境下的高效数据清洗策略

大数据环境下的高效数据清洗策略 在当今这个信息爆炸的时代,大数据已成为企业决策和科学研究不可或缺的重要资源。然而,数据的海量性、多样性和复杂性也给数据处理带来了前所未有的挑战,其中数据清洗是确保数据质量和后续分析准确性的关键步…...

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时,为了实现通用的CURD,在定义实体类pojo时,会尽量将能用得上的数据库字段都定义到 pojo中,但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…...

Python 3 字符串

Python 3 字符串 字符串在Python中是一种基本的数据类型,用于存储文本数据。Python中的字符串是不可变的,这意味着一旦创建了一个字符串,就不能更改其内容。字符串可以用单引号()、双引号("&#xff…...

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面,创建自己的项目 2、点击自己创建好的项目,在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…...

基于 RBF 神经网络辨识的单神经元 PID 模型参考自适应控制

这是一个基于 RBF 神经网络辨识 和 单神经元 PID 模型参考自适应控制 的系统框图,包含以下主要部分: RBF 神经网络模块:用于对系统进行辨识,输入误差 e(t)e(t)e(t) 和误差变化量 Δe(t)\Delta e(t)Δe(t),输出与系统特…...

2024年 Web3开发学习路线全指南

Web3是一个包含了很多领域的概念,不讨论币圈和链圈的划分,Web3包括有Defi、NFT、Game等基于区块链的Dapp应用的开发;也有VR、AR等追求视觉沉浸感的XR相关领域的开发;还有基于区块链底层架构或者协议的开发。 这篇文章给出的学习路…...

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库,过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 (停止mysql的命令为:sudo service mysql stop&#xff0…...

「Mac玩转仓颉内测版23」基础篇3 - 深入理解整数类型

本篇将详细讲解Cangjie中的整数类型,探讨整数的定义、操作、表示范围、进制表示、类型转换及应用场景,帮助开发者在Cangjie中灵活运用整数类型构建程序逻辑。 关键词 有符号整数与无符号整数表示范围与溢出进制表示类型转换字面量与操作 一、整数类型概…...

渗透测试导学

渗透测试导学 渗透测试概念 渗透测试是干什么? 渗透测试的定义和目的:渗透测试是一种通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全性能的评估方法。它的目的是通过识别安全问题,帮助了解当前的安全状况,从而…...

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑,并设计用户界面。下面是一步一步的简要说明: 目录: QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…...

亚马逊商品详情API接口解析,Json数据示例返回

亚马逊的商品详情API接口(如Amazon Product Advertising API)允许开发者获取商品的详细信息,包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构,以及相应的解析说明。请注意,实际返回的数据结构可能会根据…...

git根据远程分支创建本地新分支

比如我当前本地仓库有4个 remote 仓库&#xff0c;我希望根据其中的一个 <remote>/<branch> 创建本地分支&#xff1a; 先使用 github fetch <remote> 拉取 <remote> 的分支信息&#xff0c;然后在 git checkout -b 创建新分支时使用 -t <remote>…...

Android U 多任务启动分屏——SystemUI流程(更新中)

前文 Android U 多任务启动分屏——Launcher流程&#xff08;下分屏&#xff09; 前文说到通过ISplitScreen接口跨进程调用到了SystemUI进程&#xff0c;我们继续分析分屏在systemui中的实现。 wmshell实现分屏 实现ISplitScreen接口 代码路径&#xff1a;frameworks/base/…...

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手

使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介&#xff1a; Aurora是一个带UI且免费的GPT私人聊天助手&#xff0c;可切换GPT-3.5&#xff0c;4&#xff0c;4o等常用版本。用户可通过部署Aurora&#xff0c;快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…...

.NET 9与C# 13革新:新数据类型与语法糖深度解析

记录&#xff08;Record&#xff09;类型 使用方式&#xff1a; public record Person(string FirstName, string LastName); 适用场景&#xff1a;当需要创建不可变的数据结构&#xff0c;且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景&#xff1a;当数据结构需…...

2.fs文件系统模块

文章目录 [TOC](文章目录)2.5.练习-成绩管理2.5.1在files文件夹下新建成绩.txt文件2.5.2.新建对应的js文件 2.6.fs模块-路径动态拼接的问题 3.path路径模块3.1什么是path路径模块3.2.路径拼接3.3.获取路径中的文件名3.4.获取路径中的文件扩展名3.5.案例3.5.1.步骤13.5.2.调用fs…...

Ubuntu24.04LTS设置root用户可远程登录

Ubuntu24.04LTS设置root用户可远程登录 文章目录 Ubuntu24.04LTS设置root用户可远程登录1. 设置root密码2. 设置root用户可远程登录1. 查看ssh服务是否安装2. 安装ssh服务3. 再次查看ssh服务是否安装4. 配置ssh文件5. 重启ssh服务6. root远程登录 1. 设置root密码 Ubuntu安装后…...

ROS2指令总结(跟随古月居教程学习)

​ 博主跟随古月居博客进行ROS2学习&#xff0c;对ROS2相关指令进行了总结&#xff0c;方便学习和回顾。 古月居ROS2博文链接&#xff1a;https://book.guyuehome.com/ 本文会持续进行更新&#xff0c;觉得有帮助的朋友可以点赞收藏。 1. ROS2安装命令 $ sudo apt update &am…...

IPTV智慧云桌面,后台服务器搭建笔记

环境CentOs7.9 &#xff0c;安装宝塔yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 访问宝塔&#xff0c;修改服务器端口安全组端口 26029 注意&#xff01;&#xff01;&#xff01;&#xff01…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...