学习渠道、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在保护这个指针的同时还会保护指针指向的地址中的内容。