@
1. make
1.1 概述
用于分配 slice、map、chanel 类型的内存。
返回数据本身(而new返回指针地址)
| func make(t Type, size ...IntegerType) Type |
1.2 示例(make切片)
| mSlice := make([]string,3) |
| package main |
| |
| import "fmt" |
| |
| func main() { |
| mSlice := make([]string,3) |
| mSlice[0] = "刘备" |
| mSlice[1] = "关羽" |
| mSlice[2] = "张飞" |
| fmt.Println(mSlice) |
| } |
1.3 示例(make map)
| package main |
| |
| import "fmt" |
| |
| func main() { |
| mMap := make(map[string]string) |
| mMap["姓名"] = "孔明" |
| mMap["职业"] = "军师" |
| mMap["势力"] = "西蜀" |
| fmt.Println(mMap) |
| } |
1.4 示例(make 通道)
| package main |
| |
| import ( |
| "fmt" |
| "time" |
| ) |
| |
| func main() { |
| ch := make(chan string) |
| names := []string{"刘备","关羽","张飞","赵云","马超","黄忠"} |
| |
| go func() { |
| for _,name := range names { |
| ch <- name |
| time.Sleep(1*time.Second) |
| } |
| close(ch) |
| }() |
| go func() { |
| for c := range ch { |
| fmt.Println(c) |
| } |
| }() |
| time.Sleep(8*time.Second) |
| |
| } |
2. new
2.1 概念
new方法也是一个分配内存的内置函数。
分配内存地址的指针。
2.2 示例(new 切片)
| package main |
| |
| import "fmt" |
| |
| func main() { |
| |
| mSlice := new([]string) |
| mSlice = &[]string{"刘备","关羽","张飞"} |
| fmt.Printf("mSlice 的类型为: %T\n打印结果:%+v",mSlice,mSlice) |
| |
| } |
| mSlice 的类型为: *[]string |
| 打印结果:&[刘备 关羽 张飞] |
2.3 示例(new和make对比)
new
一个实例slicePointer
,make
一个实例sliceData
。然后打印两个示例类型。
| package main |
| |
| import "fmt" |
| |
| func main() { |
| |
| slicePointer := new([]string) |
| sliceData := make([]string,3) |
| fmt.Printf("slicePointer 的类型为: %T\n",slicePointer) |
| fmt.Printf("sliceData 的类型为: %T\n",sliceData) |
| |
| } |
| slicePointer 的类型为: *[]string |
| sliceData 的类型为: []string |
如上可见:new的实例类型为切片的指针,make的实例为切片
2.4 示例(new map)
| package main |
| |
| import "fmt" |
| |
| func main() { |
| |
| |
| mapPointer := new(map[string]string) |
| mapPointer = &map[string]string{"姓名":"孔明","职业":"军师","势力":"西蜀"} |
| fmt.Println(mapPointer) |
| } |
- 因为new出来的是一个指针,因此你单独添加成员不能写
mapPointer["姓名"]="孔明"
或者*mapPointer["姓名"]="孔明"
或者mapPointer["姓名"]=&"孔明"
或者什么乱七八糟的想法。
- 你只能make一个实例,然后让指针指向这个实例的内存地址。
| package main |
| |
| import "fmt" |
| |
| func main() { |
| |
| |
| mapPointer := new(map[string]string) |
| |
| mapDate := make(map[string]string) |
| mapDate["姓名"] = "孔明" |
| mapDate["职业"] = "军师" |
| mapDate["势力"] = "西蜀" |
| |
| mapPointer = &mapDate |
| fmt.Println(mapPointer) |
| } |
2.5 示例(new 结构体)
| package main |
| |
| import "fmt" |
| |
| type myStruct struct { |
| name string |
| age int |
| } |
| |
| func main() { |
| structPointer := new(myStruct) |
| structPointer = &myStruct{ |
| name: "刘备", |
| age: 28, |
| } |
| fmt.Printf("打印结构体:%+v",structPointer) |
| } |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码