千家信息网

golang中slice怎么用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下golang中slice怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!slice 结构定义type
千家信息网最后更新 2026年11月02日golang中slice怎么用

小编给大家分享一下golang中slice怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

slice 结构定义

type slice struct {

array unsafe.Pointer

len int

cap int

}

创建slice

// maxSliceCap returns the maximum capacity for a slice.

func maxSliceCap(elemsize uintptr) uintptr {

if elemsize < uintptr(len(maxElems)) {

return maxElems[elemsize]

}

return _MaxMem / elemsize

}

func makeslice(et *_type, len, cap int) slice {

// NOTE: The len > maxElements check here is not strictly necessary,

// but it produces a 'len out of range' error instead of a 'cap out of range' error

// when someone does make([]T, bignumber). 'cap out of range' is true too,

// but since the cap is only being supplied implicitly, saying len is clearer.

// See issue 4085.

// 计算最大可分配长度

maxElements := maxSliceCap(et.size)

if len < 0 || uintptr(len) > maxElements {

panic(errorString("makeslice: len out of range"))

}

if cap < len || uintptr(cap) > maxElements {

panic(errorString("makeslice: cap out of range"))

}

// 分配连续区间

p := mallocgc(et.size*uintptr(cap), et, true)

return slice{p, len, cap}

}

slice 扩容

// cap 目标容量

func growslice(et *_type, old slice, cap int) slice {

if et.size == 0 {

if cap < old.cap {

panic(errorString("growslice: cap out of range"))

}

// append should not create a slice with nil pointer but non-zero len.

// We assume that append doesn't need to preserve old.array in this case.

return slice{unsafe.Pointer(&zerobase), old.len, cap}

}

newcap := old.cap

doublecap := newcap + newcap

if cap > doublecap {

newcap = cap

} else {

// 小于1024,*2扩容

if old.len < 1024 {

newcap = doublecap

} else {

// 大于1024,*1.25

for newcap < cap {

newcap += newcap / 4

}

}

}

var lenmem, newlenmem, capmem uintptr

const ptrSize = unsafe.Sizeof((*byte)(nil))

switch et.size {

case 1:

lenmem = uintptr(old.len)

newlenmem = uintptr(cap)

capmem = roundupsize(uintptr(newcap))

newcap = int(capmem)

case ptrSize:

lenmem = uintptr(old.len) * ptrSize

newlenmem = uintptr(cap) * ptrSize

capmem = roundupsize(uintptr(newcap) * ptrSize)

newcap = int(capmem / ptrSize)

default:

lenmem = uintptr(old.len) * et.size

newlenmem = uintptr(cap) * et.size

capmem = roundupsize(uintptr(newcap) * et.size)

newcap = int(capmem / et.size)

}

if cap < old.cap || uintptr(newcap) > maxSliceCap(et.size) {

panic(errorString("growslice: cap out of range"))

}

var p unsafe.Pointer

if et.kind&kindNoPointers != 0 {

p = mallocgc(capmem, nil, false)

memmove(p, old.array, lenmem)

// The append() that calls growslice is going to overwrite from old.len to cap (which will be the new length).

// Only clear the part that will not be overwritten.

memclrNoHeapPointers(add(p, newlenmem), capmem-newlenmem)

} else {

// Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan uninitialized memory.

p = mallocgc(capmem, et, true)

if !writeBarrier.enabled {

memmove(p, old.array, lenmem)

} else {

for i := uintptr(0); i < lenmem; i += et.size {

typedmemmove(et, add(p, i), add(old.array, i))

}

}

}

// 新slice

return slice{p, old.len, newcap}

}

以上是"golang中slice怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

篇文章 内容 分配 最大 不怎么 区间 大部分 容量 更多 目标 知识 结构 行业 资讯 资讯频道 长度 频道 参考 学习 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 广州百单互联网科技有限公司 互联网科技深圳 互联网下的科技发展 深圳互联网科技公司 互联网医疗科技 善班互联网科技有限公司 卓越科技互联网 招聘 太原新华互联网科技学校怎么样 银川新华互联网科技学校地址 广州优美互联网科技 互联网系的金融科技公司 玉溪互联网科技怎么选 互联网媒体平台算高科技产业 科技互联网海报 深圳无忧互联网科技 领航科技大厦互联网公司 广东鹅鹅鹅互联网科技有限公司 互联网高科技行业有哪些企业 互联网领先科技成果宣传视频 与互联网科技公司 北京互联网络科技有限公司 南京欣网互联网科技 互联网科技缩写 互联网科技小额贷款 华脉科技工业互联网产品 深圳前海聚择互联网科技有限公司 宇信科技在杭州互联网排第几 山东亿川互联网科技有限责任公司 小牛互联网科技有限公司地址
0