go-标准函数库(持续更新)

本文详细介绍了Go语言中的数学、格式化、字符串操作、映射、数组、切片、排序、随机数、反射、运行时信息以及错误处理等标准函数库的使用示例。
摘要由CSDN通过智能技术生成

go标准函数库文档

package baseDemo

import (
	"demo/baseDemo/utils"
	"errors"
	"fmt"
	"log"
	"math"
	"math/rand"
	"reflect"
	"runtime"
	"slices"
	"sort"
	"strconv"
	"strings"
	"sync"
	"testing"
	"time"
	"unsafe"
)

// 全局变量声明
var (
	arr1      = [5]int{1, 2, 3, 4, 5}
	slice1    = []int{1, 2, 3, 4, 5}
	pointArr1 = [5]utils.Point{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}}
)

func TestMath(t *testing.T) {
	num1 := math.Max(1, 2) //最大值  浮点型
	num2 := math.Min(1, 2) //最小值
	num3 := math.Abs(-1.0) //绝对值
	num4 := rand.Intn(50)  //5 0内的随机整数
	num5 := max(1, 2, 9)

	num6 := num5 % 10   //取余
	num7 := num6 ^ num5 //异或
	fmt.Println(num1, num2, num3, num4, num5, num6, num7)
}

func TestFmt(t *testing.T) {
	fmt.Printf("hello world\n")
	fmt.Println("hello world")

	err := fmt.Errorf("error") //错误消息格式化
	fmt.Println(err)

	str1 := fmt.Sprintf("hello %s", "小明")
	str2 := fmt.Sprintf("%b - %d", 16, 16) // %b:2进制  %d:10进制

	fmt.Println(str1, str2)

}

func TestScan(t *testing.T) {
	var str1 string
	fmt.Println("请输入字符串:")
	fmt.Scanln(&str1)

	var str2, str3, str4 string
	fmt.Println("请按照格式输入字符串:")
	fmt.Scanf("%s %s %s", &str2, &str3, &str4) //按照固定格式输入
	fmt.Println()
}

func TestStrings(t *testing.T) {
	str1 := "hello world"      //字符串初始化
	str2 := str1[0]            //访问字符
	length := len(str1)        //获取字符长度
	str3 := &strings.Builder{} //创建空字符串
	str3.WriteByte('h')        //追加字符
	str3.WriteString("el")     //追加字符串
	str7 := str1[1:2]          //字符串截取
	for i := range str1 {      //遍历字符串
		fmt.Println(i)
	}

	index1 := strings.IndexByte(str1, 'a')         // 字符首次出现下标,-1:不存在
	index2 := strings.Index(str1, "wo")            // 字符串首次出现下标,-1:不存在
	count1 := strings.Count(str1, "h")             //子字符串出现次数
	str4 := strings.Repeat("h", 10)                //重复拼接字符
	str5 := strings.ToUpper(str1)                  //转为大写
	str8 := strings.Replace(str1, "wo", "WWOO", 1) // 替换n个字符串(-1表示全部)
	str6 := strings.ReplaceAll(str5, "()", "o")    //批量替换字符串
	str9 := strings.TrimSpace(str1)                //去除首尾空格
	str10 := strings.Trim(str1, " ")               //去除首位指定字符串
	arr1 := strings.Split(str1, " ")               // 分割字符串并转换为整数并存储在intArr切片中
	bool1 := strings.Contains("hello world", "wo") //是否包含子字符串
	bool2 := strings.EqualFold("go", "GP")         //比较字符串是否相等(不区分大小写)
	bool3 := strings.HasPrefix(str1, "hel")        //判断字符串是否以指定字符开头
	fmt.Println(str1, str2, length, index1, count1,
		str4, str5, str6, str7, str8, str9, str10,
		arr1, bool1, bool2, bool3, index2)
}

func TestStrconv(t *testing.T) {
	//其他类型转string(少用,推荐fmt.Sprintf)
	str1 := strconv.FormatInt(int64(100), 2) //10进制转其他进制
	str2 := strconv.FormatFloat(float64(3.14), 'f', 10, 64)
	str3 := strconv.FormatBool(true)

	bool1, _ := strconv.ParseBool("true")
	num1, _ := strconv.ParseInt("10001", 2, 64)
	num2, _ := strconv.Atoi("66") //字符串转数字
	str4 := strconv.Itoa(66)      //数字转字符串
	fmt.Println(str1, str2, str3, bool1, num1, num2, str4)
}

func TestMap(t *testing.T) {
	map1 := make(map[string]int) //初始化数组
	map2 := map[string]int{}
	map3 := map[string]int{"name": 0}
	map4 := map[int]struct{}{}
	map5 := map[string]utils.Point{
		"小明": {1, 2},
		"小红": {3, 3},
	}

	map3["age"] = 3     //新增元素
	delete(map3, "eee") //移除元素
	tmp := map3["age"]  //访问元素  , 不存在则为默认值,如 int为0
	v, ok := map3["id"] // ok表示是否存在
	length := len(map3)

	//map线程不安全,并发时需要上锁和解锁
	var mu sync.Mutex
	mu.Lock()
	map3["money"] = 15
	mu.Unlock()

	fmt.Println(map1, map2, map3, tmp, ok, v, length,
		map4, map5)
}

func TestArray(t *testing.T) {

	var arr9 [10][10]int               // 指定长度的申明,长度必须是常量,不能是变量
	arr2 := [3]int{16, 2, 3}           //初始化数组
	arr4 := []byte(strconv.Itoa(1234)) //整形转字符数组(ascll码 int32) integer to array
	arr10 := [2]utils.Point{{1, 2}, {3, 3}}
	slice1 := arr2[0:3]
	arr11 := (*[3]int)(slice1) //切片转数组
	arr12 := [3]int(slice1)    //切片转数组

	arr3 := arr2[1:2]   //数组截取
	length := len(arr1) //获取数组长度

	fmt.Println(arr1, arr2, arr3, length, arr4,
		arr9, arr10, arr11, arr12)

}

/*
slice 变长数组
*/
func TestSlices(t *testing.T) {
	var slice5 []int               // 切片声明,不用写长度
	slice4 := []int{1, 2, 3, 4, 5} //切片声明
	slice1 := make([]int, 10)      //初始化切片 10容量
	slice2 := make([]int, 6, 10)   //初始化切片  6长度  10容量
	slice3 := arr1[2:4]            //数组转切片(左闭右开)
	slice3 = append(slice3, 10)    //往切片追加元素
	slices.Sort(slice1)            //数组排序
	slices.Reverse(slice1)         //数组翻转

	str1 := "hello world"  //字符串初始化
	slice6 := []byte(str1) //字符串转为byte切片
	str2 := string(slice6) //byte切片转字符串

	slice7 := []int{0, 0, 0, 0}
	copy(slice7[1:], slice4[1:]) //拷贝数组

	slice4 = append(slice4, 10, 11)    //增加切片元素
	slice4 = append(slice4, slice4...) //...表示将元素枚举出来

	sort.Ints(slice4) //切片排序

	len1 := len(slice1) //获得切片长度
	cap1 := cap(slice1) //获得切片容量

	fmt.Println(slice1, slice2, slice3, slice4, slice5, slice6,
		str2, len1, cap1)
}

func TestSort(t *testing.T) {
	arr1 := []utils.Point{{2, 5}, {9, 4}, {1, 100}}
	//自定义排序
	sort.Slice(arr1, func(i, j int) bool {
		return arr1[i].X > arr1[j].X
	})

	fmt.Println(arr1)
}

func TestRand(t *testing.T) {

	num1 := rand.Int() //生成随机整数

	fmt.Println(num1)
}

func TestReflect(t *testing.T) {
	a := 1
	reflect.ValueOf(a).IsZero() //判断是否为0
	//	reflect.ValueOf(a).IsNil()   //判断是否为空
	reflect.ValueOf(a).IsValid() //待完善
}

func TestRuntime(t *testing.T) {
	fmt.Println(runtime.GOMAXPROCS(-1)) //设置协程最大可使用CPU数
	fmt.Println(runtime.NumGoroutine()) //当前系统CPU数
}

func TestUnsafe(t *testing.T) {
	intLen := unsafe.Sizeof(int(8))

	arr2 := [5]int{1, 2, 3, 4, 5}
	slice1 := arr2[:]
	slice2 := unsafe.Slice(&arr2[0], 5) //基于数组地址创建切片,切片里数据改变,原数组也会改变
	slice2[2] += 10
	slice1[1] += 10
	fmt.Println(intLen, arr2, slice1, slice2)
}

// 自定义错误
func TestErrors(t *testing.T) {
	err1 := errors.New("err1")
	err2 := errors.New("err2")
	err3 := errors.Join(err1, err2)
	if errors.Is(err3, err1) {
		fmt.Println("err1")
	}
}

func TestLog(t *testing.T) {
	log.Println("log1")
	log.Fatalln("log fatalln") //执行之后会再执行os.exit退出程序
}

func TestDate(t *testing.T) {
	now := time.Now()
	nowString := now.String()
	year := now.Year()
	month := now.Month()
	monthNumber := int(month)
	day := now.Day()
	hour := now.Hour()
	minute := now.Minute()
	second := now.Second()

	nowString1 := fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second)
	nowString2 := now.Format("2006-1-02 15:04:05")
	nowString3 := now.Format("2006-1-02")
	nowString4 := now.Format("15:04:05")
	fmt.Println(now, nowString, year, month, monthNumber, day, hour, minute,
		second, nowString1, nowString2, nowString3, nowString4)

}

// 内置函数,无需导入包
func TestBuildIn(*testing.T) {
	length := len("hello world")
	num1 := new(int) //new分配内存,返回对应类型的指针
	slice1 := make([]int, 4, 8)
	fmt.Println(length, num1, slice1)
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作为Go语言初学者,以下是一些重要的知识点和建议,可以帮助你开始学习和使用Go语言: 1. 安装和设置Go环境:首先,确保在计算机上安装了Go语言的最新版本,并设置好相关的环境变量。可以从官方网站(https://golang.org)下载安装程序并按照说明进行安装。 2. 了解基本语法和数据类型:学习Go语言的基本语法,包括变量声明、函数定义、条件语句、循环语句等。掌握Go语言的基本数据类型,如整型、浮点型、字符串、布尔型等。 3. 学习函数和包:函数是Go语言的基本构建块之一。了解如何定义和调用函数,并理解函数的参数和返回值。此外,了解如何使用包(package)来组织和重用代码。 4. 并发编程:Go语言内置了强大的并发编程支持。学习使用goroutine和channel进行并发编程,以实现高效的并发处理和协作。 5. 错误处理:Go语言鼓励使用显式的错误处理机制。学习使用错误类型和错误处理函数来处理可能发生的错误,并避免潜在的错误。 6. 标准库和第三方库:探索Go语言标准库,了解如何使用其中的功能和工具。此外,也要了解常用的第三方库,它们提供了许多有用的功能和工具,可以加快开发速度。 7. 学习常用的工具和技术:Go语言有许多强大的工具和技术可用于开发。学习使用Go工具链(如go build、go run、go test等),以及版本管理工具(如git)和构建工具(如Makefile)等。 8. 实践和项目:通过实践和参与项目,将所学的知识应用到实际中。可以尝试解决一些小型的编程问题,或者参与开源项目,以提高自己的编程能力和经验。 9. 阅读文档和教程:Go语言有丰富的文档和教程资源可供学习。阅读官方文档、博客文章、书籍和在线教程,可以帮助你更深入地理解和掌握Go语言的知识和技巧。 10. 加入社区和交流:加入Go语言的社区,与其他开发者交流和分享经验。参加本地的Go语言用户组、在线论坛或社交媒体群组,可以获取更多资源、解答问题,并与其他Go开发者建立联系。 记住,持续学习和实践是掌握任何编程语言的关键。通过不断地编写代码、阅读文档和参与项目,你将逐渐掌握和提高Go语言的技能。祝你在学习Go语言的过程中取得成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值