make()、new()

@

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)
}
  • 结果
map[势力:西蜀 姓名:孔明 职业:军师]

1.4 示例(make 通道)

  • 语法示例
ch := make(chan string)
  • 代码
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) //在学习携程同步之前,我们先用sleep等待携程结束
}
  • 结果
刘备
关羽
张飞
赵云
马超
黄忠

2. new

2.1 概念

  • 作用

new方法也是一个分配内存的内置函数。

  • 返回值

分配内存地址的指针。

  • 语法
func new(Type) *Type

2.2 示例(new 切片)

  • 语法示例
mSlice := new([]string)
  • 完整示例
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一个实例slicePointermake一个实例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)
}
  • 结果
&map[势力:西蜀 姓名:孔明 职业:军师]
  • 给map中添加成员
  • 因为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)
}
  • 结果
打印结构体:&{name:刘备 age:28}

posted on   运维开发玄德公  阅读(16)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示