Go内建方法

1 make

  • 1 创建 slice、map、chan
  • 2 返回引用类型

slice: 切片,类似数组,但是切片是可以扩容的
map:与java语言的map类似,键值对
chan:管道,用于两个线程之间的数据通信

chan和slice的数据类型后的数字意义是不同的,一个是数组的数量,一个是缓存的数量

代码示例

// 创建切片
func makeSlice()  {
	mSlice := make([]string, 3)
	mSlice[0] = "fulin.tang"
	mSlice[1] = "yanxu.long"
	mSlice[2] = "leyan.tang"
	fmt.Println(mSlice);
}

// 创建map
func makeMap()  {
	mMap := make(map[int]string)
	mMap[10] = "fulin.tang"
	mMap[100] = "yanxu.long"
	fmt.Println(mMap)
}

// 创建缓存为3的chan
func makeChan()  {
	// 这里第二个参数并不是长度,而是缓存可以是3,也就是管道容量
	// 如果不带该参数,那么就是创建一个不带缓存的管道
	mChan := make(chan int, 3)
	close(mChan)
}

2 new

  • 内存置零
  • 返回传入类型的指针地址

代码示例

// netMap类型数据
func newMap()  {
	mNewMap := new(map[int]string)
	mMakeMap := make(map[int]string)
	fmt.Println("mNewMap", reflect.TypeOf(mNewMap))
	fmt.Println("mMakeMap", reflect.TypeOf(mMakeMap))
}

打印结果

mNewMap *map[int]string
mMakeMap map[int]string

3 append & delete & copy

  • slice => append & copy

  • map => delete

3.1 append

// 切片append
func appendElementForSlice()  {
	mIDSlice := make([]string, 2)
	mIDSlice[0] = "id-1"
	mIDSlice[1] = "id-2"
	fmt.Println("len=", len(mIDSlice))
	fmt.Println("cap=", cap(mIDSlice))
	mIDSlice = append(mIDSlice, "id-3")
	fmt.Println(mIDSlice)
	fmt.Println("After len=", len(mIDSlice))
	fmt.Println("After cap=", cap(mIDSlice))
}
len= 2
cap= 2
[id-1 id-2 id-3]
After len= 3 //长度
After cap= 4 //容量

性能需求高时,切片的容量尽量确认,减少不必要的内存分配步骤

3.2 copy

等长时

// 拷贝切片
func copyForSlice()  {
	mIDSliceDst := make([]string, 2)
	mIDSliceDst[0] = "id-dst-1"
	mIDSliceDst[1] = "id-dst-2"
    
	mIDSliceSrc := make([]string, 2)
	mIDSliceSrc[0] = "id-src-1"
	mIDSliceSrc[1] = "id-src-2"
    
	copy(mIDSliceDst, mIDSliceSrc)
	fmt.Println(mIDSliceDst)
}

全部拷贝

[id-src-1 id-src-2]

源小于目标时

// 拷贝切片
func copyForSlice()  {
	mIDSliceDst := make([]string, 3)
	mIDSliceDst[0] = "id-dst-1"
	mIDSliceDst[1] = "id-dst-2"
	mIDSliceDst[2] = "id-dst-3"

	mIDSliceSrc := make([]string, 2)
	mIDSliceSrc[0] = "id-src-1"
	mIDSliceSrc[1] = "id-src-2"

	copy(mIDSliceDst, mIDSliceSrc)
	fmt.Println(mIDSliceDst)
}

只拷贝源长度的数据,超出部分不拷贝

[id-src-1 id-src-2 id-dst-3]

源长度大于目标时

// 拷贝切片
func copyForSlice()  {
	mIDSliceDst := make([]string, 2)
	mIDSliceDst[0] = "id-dst-1"
	mIDSliceDst[1] = "id-dst-2"

	mIDSliceSrc := make([]string, 3)
	mIDSliceSrc[0] = "id-src-1"
	mIDSliceSrc[1] = "id-src-2"
	mIDSliceSrc[2] = "id-src-3"

	copy(mIDSliceDst, mIDSliceSrc)
	fmt.Println(mIDSliceDst)
}

只会拷贝目标长度的数据

[id-src-1 id-src-2]

3.3 delete

func deleteForMap()  {
	mIdMap := make(map[int]string)
	mIdMap[0] = "id-1"
	mIdMap[1] = "id-2"
	delete(mIdMap, 0)
	fmt.Println(mIdMap)
}

可以看到删除了对应数据

map[1:id-2]

4 panic & recover

处理异常

  • panic 抛出异常
  • recover 捕获异常

4.1 内部类

代码示例

func receivePanic()  {
	defer func() {
		message := recover()
		fmt.Println("panic message:", message)
	}()
	panic("I am a panic");
}

输出

panic message: I am a panic

4.2 封装方式

func receivePanic()  {
	defer coverPanic()
	panic("I am a panic");
}

func coverPanic()  {
	message := recover();
	switch message.(type) {
	case string:
		fmt.Println("string message:", message)
	case error:
		fmt.Println("error message:", message)
	default:
		fmt.Println("unknown panic:", message)
	}
}
string message: I am a panic

5 len & cap & close

  • len => string、 array、 slice、 map、 chan
  • cap => slice、 array、 chan
  • close => chan

5.1 len & cap

// 测试长度和容量
func getLenCap()  {
	// make(类型,长度,容量)
	mSlice := make([]string, 3, 5)
	mSlice[0] = "fulin.tang"
	mSlice[1] = "yanxu.long"
	mSlice[2] = "leyan.tang"
	mSlice = append(mSlice, "zhong.fu")
	fmt.Println("slice len: ", len(mSlice))
	fmt.Println("slice cap: ", cap(mSlice))
}
slice len:  4
slice cap:  5

5.2 close

// 关闭chan,关闭后就不能往里写数据了,可以控制一些业务
func closeChan()  {
	mChan := make(chan int, 1)
	defer close(mChan)
	mChan <- 1
	// 业务流程
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值