GO 入门学习记录 20240704

学习渠道、go版本与IDE

 《Head First Go语言程序设计》

go 1.20 win64 版本,IDE:LiteIDE

报错记录

(1)fmt.Printf(fmt.Sprintf("Percent sign2: %0.2f %d %% \n", 77.7, 100));使用fmt.Printf承接fmt.Sprintf和%%后,所赋值的字符串带了一个"!(MISSING)"

详细报错记录:fmt.Printf和fmt.Sprint可以使用%来格式化输出,其中%%表示一个百分号,若只有一个%,程序不会报错,但字符串的%对应位置的多出一个"!(MISSING)"表示格式符缺失,fmt.Sprint将%%已经转换为%,于是fmt.Printf只能接收到一个%,导致字符串与预期输出不一致

解决方案:

使用fmt.Print或fmt.Println去承接fmt.Sprintf的返回值,若出现%的连续格式化输出问题得用偶数个%%,例如fmt.Printf(fmt.Sprintf("Percent sign2: %0.2f %d %%%% \n", 77.7, 100));便不会出现字符串带个"!(MISSING)"的尾巴

重点记录

(1)在指针学习中对于函数返回类型是指针的思考,书上案例如下:

func createPointer() *float64{
	var myFloat := 66.6
	return &mtFloat
}
func main() {
	var myFloatPointer *float64 = createPointer()
	fmt.Println(*myFloatPointer)

}

错误思路记录:调用createPointer时,createPointer中myFloat申请了一个存储空间A,但myFloat只是一个局部变量,它的作用域在createPointer函数结束后也同步结束。而myFloatPointer存储的是存储空间A的地址,导致存储空间A没有被占用,那么存储空间A可能会被释放从而被改写。

思路修正:经过资料查询,go编译器会做逃逸分析(escape analysis),即认为myFloat局部变量从createPointer中逃逸了,myFloat的存储空间A会受到保护不会被内存回收。因为当前代码作用域下仍有存储空间A的访问路径,即*myFloatPointer。
PS:如果一个变量是指针类型,golang在保护这个指针的同时还会保护指针指向的地址中的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值