Go new 和 make的区别
1.new 返回的是指针类型,所以一般用于给非引用类型(int,string,array等)
package main //定义一个struct type Person struct { Name string Age int } func main() { p1 := Person{ Name: fmt.Sprintf("你好呀:%v", "张三"), Age: 18, } fmt.Printf("type:%T,value:%v\n", p1, p1) // 取出变量的内存地址,也就是指针,是通过&变量名 // 也就是 &p1 fmt.Printf("type:%T,value:%v\n", &p1, p1) // new 返回的是指针类型 p2 := new(Person) // 指针类型访问这个类型的属性和方法 // 可以通过 (*p2).Name // 也可以通过 p2.Name ,这种方式其实是Go的语法糖,本质上还是通过 (*p2).Name p2.Name = fmt.Sprintf("你好呀:%v", "李四") (*p2).Name = fmt.Sprintf("你好呀:%v", "王五") p2.Age = 20 fmt.Printf("type:%T,value:%v\n", p2, p2) // 通过指针找到变量,是通过*变量名 // 也就是 *p2 fmt.Printf("type:%T,value:%v\n", *p2, p2) }
2. make 用于引用类型(map,slice,channel),一般多用于初始化
// map的初始化 maps := make(map[string]string, 10) // channel的初始化 channel := make(chan string, 10)
// 在 后台 API 返回数据 // 如果没有数据,一般返回 {} // 如果是需要分页的,没有数据一般返回[], 这里 make slice,size 为 0,json 序列化的时候就会返回[] var a any bytes, _ := json.Marshal(a) fmt.Println(string(bytes)) // will return null // 这里 struct{} ,json 序列化的时候就会返回 {} var s struct{} bytes, _ = json.Marshal(s) fmt.Println(string(bytes)) // will return {} var b []any bytes, _ = json.Marshal(b) fmt.Println(string(bytes)) // will return null // 这里 make slice,size 为 0,json 序列化的时候就会返回[] slic := make([]any, 0) bytes, _ = json.Marshal(slic) fmt.Println(string(bytes)) // will return []