golang最近遇到的一些坑

436 阅读2分钟
最近没有学到什么新知识,但是遇到不少坑,写篇博客记录一下

首先是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!!!!

提交之前一定要默念三遍(被组长说了好几遍了)