最近没有学到什么新知识,但是遇到不少坑,写篇博客记录一下
首先是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");//"#"
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!!!!
提交之前一定要默念三遍(被组长说了好几遍了)