文章目录
- 1. make
- 1.1 概述
- 1.2 示例(make切片)
- 1.3 示例(make map)
- 1.4 示例(make 通道)
 
- 2. new
- 2.1 概念
- 2.2 示例(new 切片)
- 2.3 示例(new和make对比)
- 2.4 示例(new map)
- 2.5 示例(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}




















