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 2023-01-10 08:32  运维开发玄德公  阅读(14)  评论(0编辑  收藏  举报  来源

导航