go~数组和切片的区别

打印 上一主题 下一主题

主题 1518|帖子 1518|积分 4554

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面通过一段代码来说明一下,数组和切片在go语言中的区别
  1. 在Go语言中,`hash[:]` 这个语法是**数组切片操作**,具体含义如下:
  2. ### 代码解析:
  3. ```go
  4. hash := md5.Sum(data)                     // 返回类型是 [16]byte 的数组
  5. hashString := hex.EncodeToString(hash[:])  // 将数组转换为切片
复制代码
关键知识点:


  • 数组与切片的区别

    • md5.Sum() 返回的是固定长度数组 [16]byte
    • hex.EncodeToString() 必要吸取 []byte 类型的切片

  • 切片操纵符 [:] 的作用

    • 将数组 [16]byte 转换为切片 []byte
    • 等同于 hash[0:16],即取数组的全部元素
    • 底层数组共享(不会产生数据拷贝)

内存表示图:
  1. 原始数组([16]byte)
  2. +---+---+---+---+---+--...--+---+
  3. | 0 | 1 | 2 | 3 | 4 | ... |15 |
  4. +---+---+---+---+---+--...--+---+
  5.   ↑
  6. 切片起始指针
  7. 生成的切片([]byte)
  8. 长度=16,容量=16
复制代码
为什么必须这样写?

如果直接传递数组会报错:
  1. hex.EncodeToString(hash)  // 编译错误:cannot use hash (type [16]byte) as type []byte
复制代码
性能优化提示:

这种写法比显式切片转换更高效:
  1. // 以下两种写法等价,但 hash[:] 更简洁高效
  2. hex.EncodeToString(hash[:])                // ✅ 推荐写法
  3. hex.EncodeToString(hash[0:len(hash):16])   // ❌ 冗余写法
复制代码
根据Go官方性能测试,使用数组切片操纵比make+copy方式快3倍,内存零拷贝。这在暗码学计算等高频调用场景非常重要。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表