Golang学习历程【第三篇 基本数据类型类型转换】

news2024/12/23 7:49:12

Golang学习历程【第三篇 基本数据类型】

  • 1. 总览
  • 2. 基本数据类型
    • 2.1 整型
    • 2.2 浮点型
    • 2.2 布尔型
    • 2.3 字符
    • 2.4 字符串
      • 2.4.1 常用定义方式
      • 2.4.2 转移字符
      • 2.4.3 常用方法
      • 2.4.3 字符串中字符替换
  • 3. 类型转换
    • 3.1 整型与整型转化
    • 3.2 浮点数与整型转换
    • 3.3 其他类型与string类型转换
    • 3.4 strconv 字符串类型转换工具
      • 3.4.1 strconv.Atoi(字符串转int) 和 strconv.Itoa(int转字符串)
      • 3.4.2 strconv.Parse 字符串解析为其他类型
      • 3.4.3 strconv.Format 数字格式化为string
      • 3.4.4 其他方法

1. 总览

Go语言中数据类型分为:基本数据类型和复合数据类型

基本数据类型:整型,浮点型,布尔型,字符串
复合数据类型:数组,切片,结构体,函数,map,通道(channel)、接口等

2. 基本数据类型

2.1 整型

类型范围占用空间有无符号
int8 − 2 7 -2^7 27~ 2 7 − 1 2^7-1 2711个字节
int16 − 2 15 -2^{15} 215~ 2 15 − 1 2^{15}-1 21512个字节
int32 − 2 31 -2^{31} 231~ 2 31 − 1 2^{31}-1 23114个字节
int64 − 2 63 -2^{63} 263~ 2 63 − 1 2^{63}-1 26318个字节
uint8 0 0 0~ 2 8 − 1 2^8-1 2811个字节
uint16 0 0 0~ 2 16 − 1 2^{16}-1 21612个字节
uint32 0 0 0~ 2 32 − 1 2^{32}-1 23214个字节
uint64 0 0 0~ 2 64 − 1 2^{64}-1 26418个字节

特殊类型

类型描述
uint32位操作系统上为uint32,64位操作系统上为uint64
int32位操作系统上为int32,64位操作系统上为int64
uintptr无符号整型,用于存放一个指针
简单示例:
var (
	num1 int  = 666
	num2 uint = 666
	// 以下赋值可选最大值,math 为math包,使用即自动引入
	num1 int  = 666
	num2 uint = 666
	// 以下赋值可选最大值
	num3  int8   = math.MaxInt8
	num4  int16  = math.MaxInt16
	num5  int32  = math.MaxInt32
	num6  int64  = math.MaxInt64
	num7  uint8  = math.MaxUint8
	num8  uint16 = math.MaxUint16
	num9  uint32 = math.MaxUint32
	num10 uint64 = math.MaxUint64
)
fmt.Println(num1, num2, num3, num4, num5, num6, num7, num8, num9, num10)

结果:

666 666 127 32767 2147483647 9223372036854775807 255 65535 4294967295 18446744073709551615

2.2 浮点型

Go语言支持两种浮点数:float32和float64,遵循IEEE 745标准。32位操作系统中,默认为float32;64位操作系统中默认为float64。

  • float32:-3.4e38~3.4e38 ,占用4个字节
  • float64:-1.8e308~1.8e308,占用8个字节
// 1. 基本定义
var num1 float32 = 1.06
num2 := 3.1415926
// 保留小数据,可以使用%.nf或者%0.nf 指定保留n位小数,
fmt.Printf("原样输出:%v; 默认保留6位小数: %f; 指定保留3为小数: %0.3f \n", num1, num2, num2)
// 2. 其他常用样例
var (
	num3 float32 = 3.1415926
	num4 float64 = 1.113
	num5         = 3.14e2  // 使用科学计数法表示,3.14*10^2 的值:为314
	num6         = 3.14e-2 // 使用科学计数法表示,3.14*10-2 的值:为0.0314
)
fmt.Println(num3, num4, num5, num6)

结果:

原样输出:1.06; 默认保留6位小数: 3.141593; 指定保留3为小数: 3.142 
3.1415925 1.113 314 0.0314

2.2 布尔型

bool值仅有两个值:true和false。声明不赋值,默认为false

var (
	bool1 bool
	bool2 = true
)
fmt.Println(bool1, bool2)

结果:

false true

2.3 字符

字符是单个数值,属于int类型,Go语言中有两种表示:byte和rune

  • byte: int类型,代表ASCII码的值
  • rune: int类型,代表UTF-8编码

注:UTF-8的国际通用编码,是ASCII码的扩展,包括了各国的常用的语言文字</font
常用示例:

var a = 'A'
var a = 'A'
// 使用%c输出字符
fmt.Printf("字符ASCII值:%v; 原样编码:%c \n", a, a)
var (
	b = 'B'
	c = '你'
	d = "this" // 可以获取字符串中的单个字符
)
fmt.Printf("%c,%c,%c,%c,%c,%c", b, c, d[0], d[1], d[2], d[3])

结果:

字符ASCII值:65; 原样编码:A 
B,你,t,h,i,s      

2.4 字符串

2.4.1 常用定义方式

// 字符串定义
var val1 string = "hello world"
var val2 = "你好 go"
val3 := "Good"
fmt.Println(val1, val2, val3)
// 字符串val2中2个中文,3个英文(空格也算);共2*3+3=9个字符,可通过len函数获取
fmt.Println(len(val2))
// 多行字符串:会原样输出
var info = `姓名:张三
年龄:18`
fmt.Println(info)

结果:

hello world 你好 go Good
9
姓名:张三
        年龄:18

字符串中,英文字母占一个字节,中文占用3个字节。可使用len函数打印字符串字节长度

2.4.2 转移字符

转义符号使用\表示
常用的转义字符有:

  1. \r:回车符(返回行首)
  2. \n:换行符(跳至下一行同列)
  3. \t:制表符(可用于整齐输出一系列值)
  4. \':单引号,输出'
  5. \":双引号,输出"
  6. \\:反斜杠,输出\
var val1 string = "hello\r"
var val2 string = "world\n"
var val3 string = "hello world\t"
var val4 string = "'hello' \\ \"world\""
/*
	var1:\r 回车符,hello输出结束后回车,光标移动至当前行首,意味着清空hello值
	val2: \n 换行符,world输出之后换行
	val3: \t 制表符,hello world简易理解为一个大的空格,格式美观,自带对齐
	val4: Go语言中'可以直接写在"内部,\\输出\, \" 转义字符,输出"
*/
fmt.Println(val1, val2, val3, val4)

结果:

 world
 hello world     'hello' \ "world"

2.4.3 常用方法

方法名基本上为常用英文名缩写,各语言基本通用,使用多了自然熟记

方法描述
len获取字符串长度
+或fmt.Springf拼接字符串
strings.Split拆分字符串
strings.Contains获取字符串长度
strings.HasPrefix,strings.HasSuffix获取字符串长度
strings.Index,strings.LastIndex获取字符串长度
strings.Join获取字符串长度
strings.ToLower字符串全转小写
strings.ToUpper字符串全转大写
示例:
var val = "Hello World"
// 1. len求长度
length := len(val)
fmt.Printf("%s长度: %d\n", val, length)

// 2. + 拼接字符串,Sprint中S代表返回字符串,同理含有:Sprinf、Sprinln,与Prinf、Prinln类似,区别在于S开头函数代表返回字符串,可用变量接收
str1 := val + "小明"
str2 := fmt.Sprint(val, "小红")
fmt.Printf("+拼接:%s;\tSprint函数拼接: %s \n", str1, str2)

// 3. 字符串拆分结果为:切片(类似于数组);参数为(<原字符串>, <切片字符串>),示例中将Hello World以空格拆分为Hello和World
splitVal := strings.Split(val, " ") // 切片结果为[Hello World]
// 4. Join将切片拼接成新的字符串;参数为(<原字符串>, <连接符>)
newStr := strings.Join(splitVal, ",") //
fmt.Printf("切片值:%v;\tJoin连接成新的字符串: %s \n", splitVal, newStr)

// 5.字符串是否包含子串,Contains参数为(<原字符串>,<子串>)
bool1 := strings.Contains(val, "Hello")
bool2 := strings.Contains(val, "Hello")
fmt.Printf("是否包含Hello:%v;\t是否包含olleH: %v \n", bool1, bool2)

// 6. 前缀判断:HasPrefix ,参数为(<原字符串>,<子串>); 后缀判断:HasSuffix,参数(<原字符串>,<子串>)
bool3 := strings.HasPrefix(val, "He")
bool4 := strings.HasPrefix(val, "llo")
bool5 := strings.HasSuffix(val, "World")
bool6 := strings.HasSuffix(val, "Wor")
fmt.Printf("前缀包含He:%v;\t前缀包含llo: %v\t后缀包含World:%v;\t后缀包含Wor: %v \n", bool3, bool4, bool5, bool6)

// 7. 返回子串在原字符串首次出现的位置,Index,从前向后查找;LastIndex,从后向前查找,参数都为(<原字符串>,<子串>)。结果:查询到,返回下标值,查询不到,返回-1。注:下标从0开始
index1 := strings.Index(val, "o")
index2 := strings.LastIndex(val, "o")
index3 := strings.Index(val, "a")
fmt.Printf("o从前到后查询在第%v位;\to从后到前查询在第%v位\ta从前到后查询在第%v位\n", index1, index2, index3)
// 8. strings.ToLower和strings.ToUpper
str3 := strings.ToLower(val)
str4 := strings.ToUpper(val)
fmt.Printf("全小写: %v;\t全大写:%v\n", str3, str4)

运行结果

Hello World长度: 11
+拼接:Hello World小明; Sprint函数拼接: Hello World小红
切片值:[Hello World];  Join连接成新的字符串: Hello,World
是否包含Hello:true;    是否包含olleH: true
前缀包含He:true;       前缀包含llo: false      后缀包含World:true;    后缀包含Wor: false 
o从前到后查询在第4位;   o从后到前查询在第7位    a从前到后查询在第-1位
全小写hello world;      全大写HELLO WORLD

温馨提示:这里的len、split、contains、prefix、suffix、index、join、lower、upper等所表示的含义在各个编程语言大同小异,只要通一门语言,其他也就简单了

2.4.3 字符串中字符替换

	// 字符串中替换字符
	var val1 = "hello xioaming"
	byteStr := []byte(val1) // 英文字符 转成byte数组类型即可,然后替换值
	byteStr[0] = 'a'
	fmt.Println(string(byteStr)) // string(byteStr)为将数组转成字符串返回,fmt.Println再打印输出结果
	var val2 = "你好小明"
	runeStr := []rune(val2) // 包含中文字符 需要转成rune数组类型即可,然后替换值
	runeStr[0] = '我'
	fmt.Println(string(runeStr))

结果:

aello xioaming
我好小明

3. 类型转换

数字类型装换有两种:低精度转高精度,高精度转低精度
注:高精度转低精度,慎用,由于类型表示范围不同,可能造成精度丢失

3.1 整型与整型转化

示例:

// 进度转换可通过 int8(<整型>),int16(<整型>),int32(<整型>),int64(<整型>)转换
// 1. 低精度转高精度
var a int8 = 127
b := int64(a)
fmt.Printf("a=%v,类型:%T\tb=%v,类型:%T \n", a, a, b, b)
// 2. 高精度转低精度
var c int64 = 127
d := int16(c)
fmt.Printf("a=%v,类型:%T\tb=%v,类型:%T \n", c, c, d, d)

结果:

a=127,类型:int8        b=127,类型:int64 
a=127,类型:int64       b=127,类型:int16

3.2 浮点数与整型转换

示例:

// 3. 整型转浮点型,可通过 float32(<整型>),float64(<整型>),浮点数转浮点数据也可以这样操作
var e int16 = 256
f := float32(e)
fmt.Printf("a=%v,类型:%T\tb=%v,类型:%T \n", e, e, f, f)
// 4. 浮点型转整型
var g float64 = 3.145
h := int16(g) // 注:类型会丢失,不是四舍五入,直接截取整数部分
fmt.Printf("a=%v,类型:%T\tb=%v,类型:%T \n", g, g, h, h)

结果:

a=256,类型:int16       b=256,类型:float32 
a=3.145,类型:float64   b=3,类型:int16 

3.3 其他类型与string类型转换

var (
	intV   = 123
	folatV = 3.145
	boolV  = true
	charV  = 'A'
)
// 1. 通过 fmt.Sprintf进行转换
str1 := fmt.Sprintf("%d", intV)   // 转换int
str2 := fmt.Sprintf("%f", folatV) // 转换float
str3 := fmt.Sprintf("%t", boolV)  // 转换 bool
str4 := fmt.Sprintf("%c", charV)  // 转换 字符
fmt.Println(str1, str2, str3, str4)

结果:

123 3.145000 true A

3.4 strconv 字符串类型转换工具

3.4.1 strconv.Atoi(字符串转int) 和 strconv.Itoa(int转字符串)

简单记忆:i(int) ,itoa中i在首字母,表示int转string。atoi中i在末尾,表示string转int

var str = "123"
// 1. 将string转换为int类型,strconv.Atoi(<string>), 返回类型有两个:<转换数据,异常err>
num1, _ := strconv.Atoi(str)
fmt.Printf("转化值:%v\t类型:%T\n", num1, num1)
// 2. 将int类型转换为string, strconv.Itoa(<int>),类型必须int,返回类型有一个:<string>
var num2 int64 = 456
str2 := strconv.Itoa(int(num2))
fmt.Printf("转化值:%v\t类型:%T\n", str2, str2)

结果:

转化值:123     类型:int
转化值:456     类型:string

3.4.2 strconv.Parse 字符串解析为其他类型

strconv.Parse能将将字符串解析为指定类型,前提:允许转换

var (
	str1 = "256"
	str2 = "3.145"
	str3 = "true"
)
// 以下的bitSize参数感觉意义不大,返回值有特定的返回类型
/*
	1. ParseInt
		params
			参数1: string数据
			参数2:base 指定进制,取值范围是 2 到 36。如果 base 为 0
			参数3:bitSize 指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64
		return
			int64: 返回始终为int64数值
			err: 转换失败后返回的失败信息
*/
num1, _ := strconv.ParseInt(str1, 10, 0)
fmt.Printf("转化值:%v\t类型:%T\n", num1, num1)
/*
	2. ParseFloat
		params
			参数1: string数据
			参数2:bitSize 指定了返回值的类型,32 表示 float32,64 表示 float64;
		return
			float64: 返回始终为float64数值
			err: 转换失败后返回的失败信息
*/
num2, _ := strconv.ParseFloat(str2, 32)
fmt.Printf("转化值:%0.3f\t类型:%T\n", num2, num2)
/*
	3. ParseBool
		params
			参数1: string数据
		return
			bool: 返回始终为bool数值
			err: 转换失败后返回的失败信息
*/
boo, _ := strconv.ParseBool(str3)
fmt.Printf("转化值:%v\t类型:%T\n", boo, boo)

结果:

转化值:256     类型:int64
转化值:3.145   类型:float64
转化值:true    类型:bool  

3.4.3 strconv.Format 数字格式化为string

var (
	intV   = 123
	floatV = 3.145e2
	booV   = true
)
// 以下的bitSize参数感觉意义不大,返回值有特定的返回类型
/*
	1. FormatInt
		params
			参数1: int64数据
			参数2:base 指定进制,取值范围是 2 到 36。如果 base 为 0
		return
			string: 返回始终为string数值
*/
str1 := strconv.FormatInt(int64(intV), 10)
fmt.Printf("转化值:%v\t类型:%T\n", str1, str1)
/*
	2. FormatFloat
		params
			参数1: float64数据
			参数2:格式化类型
					 'b' (-ddddp±ddd, 二进制指数),
					 'e' (-d.dddde±dd, 十进制e指数),
					 'E' (-d.ddddE±dd, 十进制E指数),
					 'f' (-ddd.dddd, 无指数),
					 'g' ('e'表示大指数,'f'表示其他指数),
					 'G' ('E'表示大指数,'F'表示其他指数),
					 'x' (-0xd.ddddp±ddd, 十六进制分数和二进制指数 小写),
					 'X' (-0Xd.ddddP±ddd, 十六进制分数和二进制指数 大写).
			参数3:保留的小数点位数,四舍五入。-1代表不对小数点格式化处理
			参数4:bitSize 指定了返回值的类型,32 表示 float32,64 表示 float64;
		return
			string: 返回始终为string数值
*/
str2 := strconv.FormatFloat(floatV, 'f', -1, 64)
fmt.Printf("转化值:%v\t类型:%T\n", str2, str2)
/*
	3. FormatFloat
		params
			参数1: bool数据
		return
			string: 返回始终为string数值
*/
str3 := strconv.FormatBool(booV)
fmt.Printf("转化值:%v\t类型:%T\n", str3, str3)

结果:

转化值:123     类型:string
转化值:314.5   类型:string
转化值:true    类型:string

3.4.4 其他方法

其他还包含strconv.Append(字符换追加)、strconv.IsPrint(是否可打印) 和 strconv.IsGraphic(是否图形字符)、strconv.Quote(字符串转义) 和 strconv.Unquote(取出转义)、strconv.CanBackquote(判断是否可以表示为单行反引号字符串)等。
这里学习到这,不做详细示例分析,有印象即可,需要时再学习;可参考链接


上一篇:Golang学习历程【第二篇 fmt包&变量、常量的定义】
下一篇:Golang学习历程【第四篇 运算符&流程控制】

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

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

相关文章

图解HTTP-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

【Go】-限流器的四种实现方法

目录 关于限流和限流器 固定窗口限流器 滑动窗口限流器 漏桶限流器 令牌桶限流器 总结 关于限流和限流器 限流&#xff08;Rate Limiting&#xff09;是一种控制资源使用率的机制&#xff0c;通常用于防止系统过载和滥用。 限流器&#xff08;Rate Limiter&#xff09;是…

CTF_1

CTF_Show 萌新赛 1.签到题 <?php if(isset($_GET[url])){system("curl https://".$_GET[url].".ctf.show"); }else{show_source(__FILE__); }?> 和 AI 一起分析 1.if(isset($_GET[url]))检查GET请求中是否存在名为url的参数。 curl 2.curl…

[文献阅读] Unsupervised Deep Embedding for Clustering Analysis (无监督的深度嵌入式聚类)

文章目录 Abstract:摘要聚类深度聚类 KL散度深度嵌入式聚类(DEC)KL散度聚类软分配&#xff08;soft assignment&#xff09;KL散度损失训练编码器的初始化聚类中心的初始化 实验评估总结 Abstract: This week I read Unsupervised Deep Embedding for Clustering Analysis .It…

记录:virt-manager配置Ubuntu arm虚拟机

virt-manager&#xff08;Virtual Machine Manager&#xff09;是一个图形用户界面应用程序&#xff0c;通过libvirt管理虚拟机&#xff08;即作为libvirt的图形前端&#xff09; 因为要在Linux arm环境做测试&#xff0c;记录下virt-manager配置arm虚拟机的过程 先在VMWare中…

使用C语言编写UDP循环接收并打印消息的程序

使用C语言编写UDP循环接收并打印消息的程序 前提条件程序概述伪代码C语言实现编译和运行C改进之自由设定端口注意事项在本文中,我们将展示如何使用C语言编写一个简单的UDP服务器程序,该程序将循环接收来自指定端口的UDP消息,并将接收到的消息打印到控制台。我们将使用POSIX套…

Spring Boot 教程之三十六:实现身份验证

如何在 Spring Boot 中实现简单的身份验证&#xff1f; 在本文中&#xff0c;我们将学习如何使用 Spring设置和配置基本身份验证。身份验证是任何类型的安全性中的主要步骤之一。Spring 提供依赖项&#xff0c;即Spring Security&#xff0c;可帮助在 API 上建立身份验证。有很…

什么样的LabVIEW控制算自动控制?

自动控制是指系统通过预先设计的算法和逻辑&#xff0c;在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整&#xff0c;达到预期目标的过程。LabVIEW作为一种图形化编程工具&#xff0c;非常适合开发自动控制系统。那么&#xff0c;什么样的LabVIEW控制算作“自动…

GFPS扩展技术原理(七)-音频切换消息流

音频切换消息流 Seeker和Provider通过消息流来同步音频切换能力&#xff0c;触发连接做切换&#xff0c;获取或设置音频切换偏好&#xff0c;通知连接状态等等。为此专门定义了音频切换消息流Message Group 为0x07&#xff0c;Message codes如下&#xff1a; MAC of Audio s…

视频直播点播平台EasyDSS与无人机技术的森林防火融合应用

随着科技的飞速发展&#xff0c;无人机技术以其独特的优势在各个领域得到了广泛应用&#xff0c;特别是在森林防火这一关键领域&#xff0c;EasyDSS视频平台与无人机技术的融合应用更是为传统森林防火手段带来很大的变化。 一、无人机技术在森林防火中的优势 ‌1、快速响应与高…

机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及RRT四种算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1贪婪搜索算法原理 4.2最安全距离算法原理 4.3RPM 算法原理 4.4 RRT 算法原理 5.完整程序 1.程序功能描述 机器人路径规划和避障算法matlab仿真,分别对比贪婪搜索,最安全距离,RPM以及R…

【论文笔记】Visual Alignment Pre-training for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时&#xff0c;发现引入了一个 wallpaper 库&#xff0c;这个库的入口文件是 index.js&#xff0c;但是 package.json 文件下的 type:"module"&#xff0c;这样造成了无论你使用 import from 还是 require&…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功&#xff0c;接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…

C++-----函数与库

数学中的函数与编程中的函数对比 数学中的函数 - 数学函数是一种映射关系&#xff0c;例如&#xff0c;函数\(y f(x)x^{2}\)&#xff0c;对于每一个输入值\(x\)&#xff0c;都有唯一确定的输出值\(y\)。它侧重于描述变量之间的数量关系&#xff0c;通常通过公式来表示这种关系…

带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)

适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式适配器模式&#xff08;Adapter Pattern&#xff09;概述talk is cheap&#xff0c; show you my code总结 适配器模式 适配器模式&#xff08;Adapter Pattern&#xff09;是面向对象软件设计中的一种结构型设计…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

初等函数整理

1.幂函数 2.指数函数 3.对数函数

【C/C++】手搓项目中常用小工具:日志、sqlit数据库、Split切割、UUID唯一标识

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将写到一些手搓常用工具&#xff0c;方便在项目中的使用&#xff0c;并且在手搓的过程中一些函数如&#xff1a;日志 宏中的__VA_ARGS__接收可变参…

路径规划之启发式算法之二十一:狼群算法(Wolf Pack Algorithm,WPA)

狼群算法(Wolf Pack Algorithm,WPA)是一种模拟狼群捕食行为及其猎物分配方式的群体智能优化算法。它由吴虎胜等人在2013年提出,算法采用了基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。它通过抽象狼群搜索、围攻以及更新换代的三种行为方式来实…