golang最近遇到的一些坑

xjlgxlgx發表於2019-10-23
最近沒有學到什麼新知識,但是遇到不少坑,寫篇部落格記錄一下

首先是range的坑

有一天我想跑個迴圈將一個結構體切片中所有元素的指標存到一個新的陣列中

package main

import "fmt"

type Student struct {
	name string
	age int

}
func main()  {
	var studentsptr []*Student
	var students []Student
	student1 := Student{
		name: "zhangsan",
		age:  10,
	}
	student2 := Student{
		name: "lisi",
		age:  11,
	}
	student3 := Student{
		name: "wangwu",
		age:  12,
	}
	students = append(students,student1,student2,student3)
	for _,student := range students {
		studentsptr=append(studentsptr, &student)
	}
	fmt.Println(studentsptr)
}複製程式碼

按照我預想的的是這樣將students裡面所有的student的地址存進studentptr

結果輸出是

[0xc00009a000 0xc00009a000 0xc00009a000]複製程式碼

說明這裡的range前的student只建立了一次,迴圈只是將它重修賦值而已

為了達到目的我們只能構建一個臨時的中間量

package main

import "fmt"

type Student struct {
	name string
	age int

}
func main()  {
	var studentsptr []*Student
	var students []Student
	student1 := Student{
		name: "zhangsan",
		age:  10,
	}
	student2 := Student{
		name: "lisi",
		age:  11,
	}
	student3 := Student{
		name: "wangwu",
		age:  12,
	}
	students = append(students,student1,student2,student3)
	for _,student := range students {
		var studentTemp Student
		studentTemp=student
		studentsptr=append(studentsptr, &studentTemp)
	}
	fmt.Println(studentsptr)
}複製程式碼

結果為

[0xc00000c080 0xc00000c0a0 0xc00000c0c0]複製程式碼

這樣就能將地址儲存下來,並且能對其進行操作

post中的?會被轉義成%3f

+空格/?%&=#
%2B%20%2F%3F%25%26&3D%23
var post_Str = apply_name.replace(/\+/g, "%2B");//"+"轉義
var post_Str= post_Str.replace(/\&/g, "%26");//"&"
var post_Str= post_Str.replace(/\#/g, "%23");//"#"

當時拼url的時候?id=xxxxxx會變成%3fxxxxx

就需要轉義了

Unmarshal時一定需要傳指標

Unmarshal一定要穿指標並且一定要保證結構體裡的成員變數為大寫開頭(廢話)否則這兩點缺一個都會倒是會導致轉換失敗

使用指標型別前一定要想到時否為空

比如userPtr是user的指標型別,你需要username的時候一定判斷

username = userptr.name複製程式碼

這時候一定要需要思考這裡的指標是否會nil否則會報panic的

最後的最後git commit之前一定要go fmt!!!!

提交之前一定要默唸三遍(被組長說了好幾遍了)


相關文章