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)可以对其进行排序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF--php伪协议结合Base64绕过

Base64绕过 在ctf中,base64是比较常见的编码方式,在做题的时候发现自己对于base64的编码和解码规则不是很了解,并且恰好碰到了类似的题目,在翻阅了大佬的文章后记录一下,对于base64编码的学习和一个工具 base64编码是…

虚拟网卡驱动和DM9000C移植

网卡驱动程序框架 网卡驱动程序“收发功能”: 只要把上层的数据发给网卡,从网卡来的数据构造成包给上层即可。网卡只需要 “socket”编程,不需要打开某设备。 驱动程序都是以面向对象的思想写的,都有相关的结构体。 编程步骤 …

image compare pyqt 实现

默认显示image1, 鼠标滑动滚动条切换图片显示 可视化效果: image_compare.py import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QVBoxLayout, QHBoxLayout from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QPixmap, QPainte…

【单片机基础】定时器/计数器的工作原理

单片机中的定时器/计数器(Timer/Counter)是用于时间测量和事件计数的重要模块。它们可以用来生成精确的延时、测量外部信号的频率或周期、捕获外部事件的时间戳等。理解定时器/计数器的工作原理对于单片机编程和系统设计非常重要。以下是定时器/计数器的…

在自动驾驶进行大数据量因果推理实验时,如何减少无用功,提高实验效率?

在对实验结果做反事实推理时,通常需要对数据进行多次循环,然后对多次循环的结果进行处理,如果只在最后结果结束时,再进行处理,可能会由于反事实过程中某个参数设置错误,导致整个反事实实验出现错误&#xf…

浅谈软件开发中的yield关键字:从餐厅服务理解异步编程之美

在现代软件开发中,处理大量数据流时经常会遇到性能和内存消耗的问题。传统的编程方式往往是一次性获取所有数据,这就像餐厅厨师要把所有菜品做完才上菜一样,既不高效也不够灵活。而yield关键字的出现,为我们提供了一种优雅的解决方…

绕过CDN寻找真实IP

在新型涉网案件中,我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集,但是现在网站大多都部署了CDN,将资源部署分发到边缘服务器,实现均衡负载,降低网络堵塞,让用户能够更快地访问自…

前后端请求响应

引入 在之前的例子中,我们编写了一个简单的web类,我们运行启动类,启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类,其并未实现某个接口或继承某个类&…

深度学习:神经网络中的损失函数的使用

深度学习:神经网络中的损失函数的使用 损失函数是监督学习中的关键组成部分,用于衡量模型预测值与真实值之间的差异。优化算法(如梯度下降)通过最小化损失函数来调整模型参数,以提高模型的预测精度。以下是几种常用的…

ThreeJS入门(142):THREE.WebGLRenderTarget 知识详解,示例代码

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas&#xf…

GitLab 部署和配置指南

GitLab 部署和配置指南 1. GitLab 容器配置概述 在部署 GitLab 时,可能涉及以下几部分内容: 内置 Nginx 的配置和调整。HTTPS 证书的申请、使用和续期。通过 FRP 映射内网服务到外部服务器。阿里云服务器的 Nginx 配置和反向代理。 本文将完整涵盖这…

Streamlit + AI大模型API实现视频字幕提取

简介 在本文中,我将带你探讨如何使用Streamlit和AI大模型API来实现视频字幕提取的技术。Streamlit是一个开源的Python库,用于快速构建数据应用的Web界面,而AI大模型API,如OpenAI,提供了强大的语言处理能力&#xff0c…

SpringBoot - spring.profiles.active最佳实践

文章目录 Pre概述为什么需要多环境配置多环境配置实现步骤1. 配置文件准备2. 激活特定环境方法1:命令行参数方法2:环境变量方法3:IDE 配置方法4:全局配置文件默认设置 3. 配置文件加载顺序配置生效的原理 4. 常见问题多个配置文件…

深入理解 Vue 3 中的 emit

深入理解 Vue 3 中的 emit 在 Vue 3 中,组件通信是开发中非常重要的一部分,其中通过 emit 实现父子组件通信是最常见的方式之一。emit 的作用是:子组件可以通过触发自定义事件将数据传递给父组件。 在本篇文章中,我们将从以下几…

C++结构型设计模式之适配器模式概述

适配器模式的意图和动机 意图:适配器模式(Adapter Pattern)是一种结构型设计模式,其意图是将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。 动机&#xff1a…

网安瞭望台第2期:零日漏洞密集爆发、2024年常见网络安全漏洞类型及分析

国内外要闻 Ubuntu 服务器 Needrestart 软件包惊现严重安全漏洞 近日,Ubuntu 服务器(自 21.04 版本起默认安装)的 Needrestart 软件包被曝存在多个可追溯至数十年前的安全漏洞。这些漏洞允许本地攻击者在无需用户交互的情况下获取根…

【Linux】apt 关闭 ssl 认证

【注意】apt 关闭 ssl 认证可能会引起软件安装风险,请尽量避免关闭。 执行以下命令可以实现全局关闭 sll 验证。 echo Acquire::https::Verify-Peer "false"; >> /etc/apt/apt.conf.d/99disable-signature-verificationecho Acquire::https::Verif…

Java前端基础——CSS

一、CSS介绍 1.1 什么是CSS CSS(Cascading Style Sheet),层叠样式表,用于控制页面的样式. CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 1.2 基本语法规范 选择器 {⼀条/N条声明} • 选择器决定针…

浅议Flink中的通讯工具: Akka

在Flink中,各个组件之间需要频繁交换数据和控制信息。Flink选择了基于Actor模型的Akka框架作为通信基础。 Akka是什么 Actor模型 Actor模型是用于单个进程中并发的场景。 在Actor模型中: ActorSystem负责管理actor生命周期 将每个实体视为独立的 Ac…

Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…