您的当前位置:首页>全部文章>文章详情

【Go】Golang标准库介绍(五)

CrazyPanda发表于:2024-03-05 23:34:09浏览:295次TAG:

1. runtime库 ( 运行时接口)

在 Go 语言的标准库中,runtime 包提供了与 Go 运行时系统交互的功能。

这个包包括了一些控制和查询运行时状态的函数,如协程控制、垃圾回收、程序退出等。

常用的函数:

Gosched 函数: 让出处理器给其他 goroutine 执行,以便调度器能够有效地分配时间给不同的 goroutine。
Go 函数: 用于启动一个新的 goroutine。
NumCPU 函数: 返回机器上的逻辑 CPU 核心数。
NumGoroutine 函数: 返回当前程序中活跃的 goroutine 数量。
GOMAXPROCS 函数: 用于设置或查询可同时执行的最大 CPU 核心数。
MemStats 结构和 ReadMemStats 函数: 提供了对内存使用情况的统计信息。

示例

package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	// 设置最大同时执行的 CPU 核心数
	runtime.GOMAXPROCS(2)

	// 获取机器上的逻辑 CPU 核心数
	numCPU := runtime.NumCPU()
	fmt.Println("Number of CPUs:", numCPU)

	// 启动多个 goroutine
	var wg sync.WaitGroup
	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(index int) {
			defer wg.Done()
			fmt.Printf("Goroutine %d is running on CPU %d\n", index, runtime.NumCPU())
		}(i)
	}
	wg.Wait()

	// 获取当前程序中活跃的 goroutine 数量
	numGoroutines := runtime.NumGoroutine()
	fmt.Println("Number of Goroutines:", numGoroutines)

	// 让出处理器给其他 goroutine 执行
	runtime.Gosched()

	// 输出内存统计信息
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	fmt.Printf("Allocated memory: %d bytes\n", memStats.Alloc)
	fmt.Printf("Total memory allocated: %d bytes\n", memStats.TotalAlloc)
	fmt.Printf("Heap memory allocated: %d bytes\n", memStats.HeapAlloc)
}

在这个示例中,使用了 runtime.GOMAXPROCS 设置最大同时执行的 CPU 核心数,使用 runtime.NumCPU 获取机器上的逻辑 CPU 核心数,使用 runtime.NumGoroutine 获取当前程序中活跃的 goroutine 数量。

还启动了多个 goroutine 并使用 runtime.Gosched 让出处理器给其他 goroutine 执行。最后,使用 runtime.ReadMemStats 输出内存统计信息。


2. sort库(排序接口)

在 Go 语言的标准库中,sort 包提供了对切片和用户定义的集合进行排序的功能。

它支持排序各种类型的数据,包括内置的基本数据类型以及用户定义的类型。

主要的函数和接口:

sort.Interface 接口: 用户定义的类型需要实现这个接口的三个方法(Len、Less、Swap)来支持排序。这样的类型可以被 sort 包的函数直接使用。
sort.Sort 函数: 对实现了 sort.Interface 接口的类型进行原地排序。
sort.Slice 函数: 对切片进行排序,可以接受切片、比较函数和附加参数。
sort.Search 函数: 在有序切片中查找一个元素,并返回它的索引。如果找不到,返回应该插入的位置。

示例

package main

import (
	"fmt"
	"sort"
)

// 定义一个结构体类型
type Person struct {
	Name string
	Age  int
}

// 定义一个实现 sort.Interface 接口的切片类型
type People []Person

func (p People) Len() int           { return len(p) }
func (p People) Less(i, j int) bool { return p[i].Age < p[j].Age }
func (p People) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }

func main() {
	// 基本数据类型的切片排序
	intSlice := []int{5, 2, 7, 1, 8, 3}
	sort.Ints(intSlice)
	fmt.Println("Sorted Ints:", intSlice)

	// 自定义类型的切片排序
	people := People{
		{"Alice", 25},
		{"Bob", 30},
		{"Charlie", 22},
	}
	sort.Sort(people)
	fmt.Println("Sorted People:", people)

	// 使用 sort.Slice 对切片进行排序
	strSlice := []string{"banana", "apple", "orange", "grape"}
	sort.Slice(strSlice, func(i, j int) bool {
		return len(strSlice[i]) < len(strSlice[j])
	})
	fmt.Println("Sorted Strings by Length:", strSlice)

	// 使用 sort.Search 在有序切片中查找元素
	searchSlice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	index := sort.Search(len(searchSlice), func(i int) bool {
		return searchSlice[i] >= 6
	})
	fmt.Println("Index of 6 in Sorted Slice:", index)
}

在这个示例中,使用了 sort.Ints 和 sort.Sort 对切片进行排序。

同时,定义了一个 Person 结构体和一个实现了 sort.Interface 接口的 People 类型,然后使用 sort.Sort 对自定义类型的切片进行排序。

最后,使用 sort.Slice 对字符串切片进行排序,并使用 sort.Search 在有序切片中查找元素。

这些函数和接口提供了灵活而强大的排序功能,适用于各种排序需求。


3. strings库(字符串转换、解析及实用函数)

在 Go 语言的标准库中,strings 包提供了对字符串进行操作的各种函数。

这些函数包括字符串的拼接、切割、替换、搜索等,提供了丰富的字符串处理功能。

常用的函数:

Contains 函数: 判断字符串是否包含子串。
Count 函数: 统计子串在字符串中出现的次数。
HasPrefix 和 HasSuffix 函数: 判断字符串是否以指定的前缀或后缀开始或结束。
Index 和 LastIndex 函数: 返回子串在字符串中第一次和最后一次出现的位置。
Join 函数: 将字符串切片连接成一个字符串,中间用指定的分隔符分隔。
Replace 函数: 替换字符串中的指定子串。
Split 函数: 将字符串切割成字符串切片,根据指定的分隔符。
ToLower 和 ToUpper 函数: 将字符串转换为小写或大写。

示例

package main

import (
	"fmt"
	"strings"
)

func main() {
	// Contains函数:判断字符串是否包含子串
	fmt.Println(strings.Contains("Hello, Gophers!", "Go")) // true

	// Count函数:统计子串在字符串中出现的次数
	fmt.Println(strings.Count("banana", "a")) // 3

	// HasPrefix和HasSuffix函数:判断字符串是否以指定的前缀或后缀开始或结束
	fmt.Println(strings.HasPrefix("Gopher", "Go")) // true
	fmt.Println(strings.HasSuffix("Gopher", "per")) // true

	// Index和LastIndex函数:返回子串在字符串中第一次和最后一次出现的位置
	fmt.Println(strings.Index("Hello, Gophers!", "Gophers"))    // 7
	fmt.Println(strings.LastIndex("Hello, Gophers!", "o"))       // 10

	// Join函数:将字符串切片连接成一个字符串,中间用指定的分隔符分隔
	strSlice := []string{"apple", "banana", "orange"}
	joinedString := strings.Join(strSlice, ", ")
	fmt.Println(joinedString) // apple, banana, orange

	// Replace函数:替换字符串中的指定子串
	replacedString := strings.Replace("Hello, Gophers!", "Gophers", "World", -1)
	fmt.Println(replacedString) // Hello, World!

	// Split函数:将字符串切割成字符串切片,根据指定的分隔符
	splitString := strings.Split("apple,banana,orange", ",")
	fmt.Println(splitString) // [apple banana orange]

	// ToLower和ToUpper函数:将字符串转换为小写或大写
	lowerString := strings.ToLower("GoLang")
	upperString := strings.ToUpper("GoLang")
	fmt.Println(lowerString, upperString) // golang GOLANG
}

这些函数提供了丰富的字符串处理功能,可以满足各种字符串操作的需求。


4. time库(时间接口)

在 Go 语言的标准库中,time 包提供了对时间的处理和操作功能。

time 包主要包含了表示时间的结构体、时间的格式化和解析、定时器等相关的功能。

常用的函数:

Time 类型: 表示一个具体的时间点。Time 类型的值可以通过 time.Now() 获取当前时间,也可以通过 time.Parse 解析字符串得到。
Duration 类型: 表示时间间隔,用于表示两个 Time 值之间的差异。
time.Now 函数: 获取当前时间。
time.After 和 time.Sleep 函数: 用于等待一段时间。
time.Parse 和 time.Format 函数: 用于时间格式的解析和格式化。
time.Timer 和 time.Ticker 类型: 分别表示定时器和周期性的定时器。

示例

package main

import (
	"fmt"
	"time"
)

func main() {
	// 获取当前时间
	now := time.Now()
	fmt.Println("Current Time:", now)

	// 格式化时间
	fmt.Println("Formatted Time:", now.Format("2006-01-02 15:04:05"))

	// 解析时间字符串
	parsedTime, err := time.Parse("2006-01-02", "2023-01-01")
	if err != nil {
		fmt.Println("Error parsing time:", err)
		return
	}
	fmt.Println("Parsed Time:", parsedTime)

	// 时间间隔(Duration)
	duration := 3 * time.Second
	fmt.Println("Duration:", duration)

	// 等待一段时间
	time.Sleep(2 * time.Second)
	fmt.Println("After Sleep")

	// 定时器
	timer := time.NewTimer(1 * time.Second)
	<-timer.C
	fmt.Println("Timer expired")

	// 周期性定时器
	ticker := time.NewTicker(500 * time.Millisecond)
	for i := 0; i < 5; i++ {
		<-ticker.C
		fmt.Println("Ticker Tick", i+1)
	}
	ticker.Stop()
	fmt.Println("Ticker stopped")
}

在这个示例中,使用 time.Now 获取当前时间,使用 Format 格式化时间,使用 time.Parse 解析时间字符串,使用 time.Sleep 等待一段时间,使用 time.NewTimer 创建定时器,使用 time.NewTicker 创建周期性的定时器等。


5. text库(文本模板及 Token 词法器)

在 Go 语言的标准库中,“text” 包并不存在。

只有一些与文本处理相关的包,比如 text/template 或 text/scanner。


1)text/template 包:

提供了一种简单的模板引擎,用于生成文本输出。它允许在模板中嵌入变量和控制结构,然后通过传入数据来生成最终的文本输出。

示例

package main

import (
    "os"
    "text/template"
)

func main() {
    // 定义模板
    tpl := "Hello, {{.Name}}! Today is {{.Day}}."

    // 创建模板对象
    t := template.Must(template.New("greeting").Parse(tpl))

    // 准备数据
    data := map[string]interface{}{
        "Name": "Gopher",
        "Day":  "Wednesday",
    }

    // 渲染模板
    t.Execute(os.Stdout, data)
}

2)text/scanner 包:

提供了一个用于扫描文本的基本扫描器。这个包可用于将文本分割成令牌(Token)并对其进行处理。

示例

package main

import (
	"fmt"
	"strings"
	"text/scanner"
)

func main() {
	// 创建扫描器
	var s scanner.Scanner
	s.Init(strings.NewReader("Hello, World!"))

	// 扫描并打印令牌
	for tok := s.Scan(); tok != scanner.EOF; tok = s.Scan() {
		fmt.Printf("Token: %s\n", s.TokenText())
	}
}


猜你喜欢

【Go】windows系统Go语言环境安装
1. Go语言安装包下载打开官网https://golang.google.cn/dl/,找到windows版本,点击下载,然后点击安装包安装,可自定义安装路径。2. GOROOT环境变量配置打开系统环境变量,新加GOROOT,路径就是Go安装根路径3. GOPATH环境变量添加在添加GOPATH环境变量之前,我们需要先新建一个工作区文件夹,这里笔者以GoProject命名。然后在该文件夹下分别创建src, pkg, bin三个文件夹,这三个文件夹作用如下:src: 存放源代码(go项目存放的位
发表于:2024-06-07 浏览:322 TAG:
【Go】Golang打包go项目部署到linux服务器正确方法
网上方法正确方法总结&nbsp;网上方法我们可以在终端中输入以下代码:set&nbsp;CGO_ENABLED=0 set&nbsp;GOOS=linux set&nbsp;GOARCH=amd64 go&nbsp;build&nbsp;-o&nbsp;main-linux&nbsp;main.go然后就会生成main-linux的二进制可执行文件,然后我们就可以将main-linux放到服务器中的任一目录中,然后我们就可以执行以下命令运行。&gt;&nbsp;chmod&nbsp;777&amp;nb
发表于:2024-08-06 浏览:278 TAG: #Golang
【Go】go依赖注入库samber/do使用
介绍以简单和高效而闻名的Go语言在其1.18版本中引入了泛型,这可以显着减少大量代码生成的需要,使该语言更加强大和灵活。如果您有兴趣, Go 泛型教程 是很好的学习资源。通过使用 Go 的泛型,samber/do库为依赖注入 (DI) 提供了一个很好的解决方案。依赖注入是一种重要的设计模式,它促进对象及其依赖关系之间的松散耦合,从而提高代码模块化性、可测试性和可维护性。泛型和依赖注入的结合进一步提升了 Go 在创建高效、可扩展软件方面的潜力。在本文中,您将学习如何使用 samber/do 提供依
发表于:2024-02-24 浏览:342 TAG:
【Go】Golang标准库介绍(五)
1. runtime库 ( 运行时接口)在 Go 语言的标准库中,runtime 包提供了与 Go 运行时系统交互的功能。这个包包括了一些控制和查询运行时状态的函数,如协程控制、垃圾回收、程序退出等。常用的函数:Gosched&nbsp;函数:&nbsp;让出处理器给其他&nbsp;goroutine&nbsp;执行,以便调度器能够有效地分配时间给不同的&nbsp;goroutine。 Go&nbsp;函数:&nbsp;用于启动一个新的&nbsp;goroutine。 NumCPU&nbsp;函
发表于:2024-03-05 浏览:296 TAG:
【Go】Go语言常用命令详解(三)
前言接着上一篇继续介绍Go语言的常用命令常用命令以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和管理依赖项等任务。命令描述go build编译Go程序包及其依赖项。go test运行包的测试。go run编译并运行Go程序。go clean删除编译生成的对象文件和缓存文件。go bug启动一个用于报告bug的工具。go doc显示有关包或符号的文档。go env打印有关Go环境的信息。go fix更新包以使用新的API。go fmt使用gofmt重新格式化Go包的源
发表于:2024-03-07 浏览:319 TAG:
【Go】Goland常用快捷键介绍
文章目录前言一、文件操作相关快捷键二、代码格式化相关的快捷键三、查找和定位相关的快捷键四、编辑代码相关的快捷键四、编辑器相关的快捷键总结强烈推荐专栏集锦写在最后开源软件的影响力 前言在进行Go语言开发时,熟练使用快捷键是提高效率、加快编码速度的关键。Goland作为一款强大的集成开发环境(IDE),提供了丰富的快捷键功能,可以帮助开发者更加便捷地进行代码导航、编辑、调试等操作。通过掌握这些常用的快捷键,可以更加高效地编写和管理您的Go代码,节省大量的开发时间,提高工作效率。一、文件操作相关快捷键
发表于:2024-03-06 浏览:352 TAG:
【Go】Go语言支持哪些常见函数
Go语言是一门开源的编程语言,由Google开发,在云计算和大数据领域广泛应用。它支持丰富的标准库,提供了许多常见的函数来帮助开发者编写高效、可靠的代码。在本文中,我们将探讨Go语言支持的一些常见函数,并提供具体的代码示例。1. 字符串处理函数Go语言提供了丰富的字符串处理函数,帮助开发者对字符串进行各种操作,比如拼接、分割、替换、查找等。以下是一些常见的字符串处理函数及其代码示例:package&nbsp;main &nbsp; import&nbsp;( &nbsp;&nbsp;&nbsp;
发表于:2024-03-22 浏览:304 TAG:
【Go】Go语言的特点和优势
Go语言是一种开源的编程语言,它在2009年由Google开发并在2012年正式发布。Go语言的主要设计目标是提供一种简单有效的方法来构建简单、可靠、高效的软件。&nbsp;Go语言的主要特点和优势包括:&nbsp;静态类型:Go语言是一种静态类型的语言,这意味着所有变量在编译时就必须确定其数据类型。&nbsp;自动垃圾回收:Go语言具有自动的垃圾回收机制,这意味着开发者不需要手动管理内存。&nbsp;并行进程:Go语言支持并行进程,这使得开发者可以利用多核处理器的优势来编写并发程序。&amp;nbs
发表于:2024-07-01 浏览:304 TAG:
【Go】利用Go语言实现高效的整除运算与余数计算
在编程中,整除运算和余数计算是常见的操作,特别在处理循环和数学运算时经常会用到。Go语言作为一种高效、简洁的编程语言,提供了丰富的内置函数和运算符,可以帮助我们实现高效的整除运算和余数计算。本文将介绍如何利用Go语言实现高效的整除运算和余数计算,并提供具体的代码示例。首先,我们来看一下Go语言中整除运算和余数计算的具体实现方式。在Go语言中,整除运算可以使用 &quot;/&quot; 运算符实现,余数计算可以使用 &quot;%&quot; 运算符实现。下面是一个简单的示例代码:package
发表于:2024-03-24 浏览:372 TAG:
【Go】Go语言常用命令详解(一)
前言Go语言是一种开源的编程语言,由Google开发并于2009年首次发布。它以其简洁、高效和并发性能而备受开发者的喜爱。作为一门相对年轻的语言,Go语言的学习和使用对于初学者来说可能会有一些挑战。因此,本文将介绍一些常用的Go语言命令,帮助读者更好地理解和使用这门语言。常用命令以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和管理依赖项等任务。命令描述go build编译Go程序包及其依赖项。go test运行包的测试。go run编译并运行Go程序。go clea
发表于:2024-03-07 浏览:309 TAG: