golang中的数组与切片

golang中,当用数组去初始化一个切片时,数组的地址即为&slice[0],例子如下:

package main

import (
	"fmt"
	"math/rand"
	"net"
	"os"
	"time"
	"unsafe"
)

func main() {
	for {
		pcRecvMag()
		time.Sleep(time.Second)
	}
}

func pcRecvMag() {
	var buf [20]byte
	readFromUDP(buf[0:])
	pcHandleMsg(&buf)
}

func pcHandleMsg(p2byteArray *[20]byte) {
	fmt.Printf("byteArray pointer:%v\n", unsafe.Pointer(p2byteArray))
	fmt.Println(*p2byteArray)
}

func readFromUDP(b []byte) {
	b[0] = (byte)(rand.Intn(255))
	b[1] = (byte)(rand.Intn(255))
	fmt.Printf("len:%d, cap:%d\n", len(b), cap(b))
	fmt.Printf("slice0 pointer:%v\n", &b[0])
}
输出结果:

len:20, cap:20

slice0 pointer:0x115ad940

byteArray pointer:0x115ad940

[86 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

len:20, cap:20

slice0 pointer:0x1157a340

byteArray pointer:0x1157a340

[122 254 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

len:20, cap:20

slice0 pointer:0x115ad9e0

byteArray pointer:0x115ad9e0

[151 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]


这一点可以用slice的数据结构来解释,如下图所示:

这个是 slice 的数据结构,它很简单,一个指向真实 array 地址的指针 ptr ,slice 的长度 len 和容量 cap 。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值