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
一个实例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)
}
- 结果
&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}