【建站服务】怒江企业网站设计 - 怒江高端网站定制 - 怒江品牌网站搭建 - 上往建站-域名申请
作者: 风兰 . 阅读量: 7 . 发表时间:2022-09-21 05:52:27
上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。
怒江企业网站设计 - 怒江高端网站定制 - 怒江品牌网站搭建 - 上往建站

ce 的底层是数组指针,所以 slice a 和 s 指向的是同一个底层数组,所以当修改 s[0] 时,a 也会被修改。
package main
import "fmt"
func main() {
s := []int{1, 2, 3} // len=3, cap=3
a := s
s[0] = 888
s = append(s, 4)
fmt.Println(a, len(a), cap(a)) // 输出:[888 2 3] 3 3
fmt.Println(s, len(s), cap(s)) // 输出:[888 2 3 4] 4 6
}
ragonli
ragonli
rag***ig@gmail.com
3年前 (2019-06-04)
乱码kun
ly1***657282@gmail.com
110
当append(list, [params]),先判断 list 的 cap 长度是否大于等于 len(list) + len([params]),如果大于那么 cap 不变,否则 cap = 2 * max{cap(list), cap[params]},所以当 append(numbers, 2, 3, 4) cap 从 2 变成 6。
前面已有相关详解,很可惜关键部分把“2 * ”给漏了,在此补充。
乱码kun
乱码kun
ly1***657282@gmail.com
3年前 (2019-07-11)
Aaron_kitty
235***8645@qq.com
16
关于cap为何变为6的问题,我认为以上解释均为错,你们可以试试添加7个元素
cap就是10.
cap*2小于len(list) + len([params])则cap = len(list) + len([params])+1,反之cap=cap*2
查阅官方文档说
切片一旦初始化,就总是伴随着一个包含其元素的基本数组。 因此,切片与其数组及其它本数组的切片共享存储; 与此相反,不同的数组总是表示其不同的存储。
切片的基本数组可扩展其切片的结尾。容量是该扩展的量度: 它是切片的长度和切片往后数组的长度之和;长度达到其容量的切片可通过从原切片 (§Slices)‘切下’一个新的来创建。 切片 a 的容量可使用内建函数 cap(a) 获取。
并未指出规律性,以上规律是我个人总结。
Aaron_kitty
Aaron_kitty
235***8645@qq.com
3年前 (2019-07-16)
疏林如有诉
191***4098@qq.com
14
我觉得前面关于 cap 为什么会变成6的问题的解答都不太正确。
当添加 6 个元素时按照上面的说法 cap 的值应该分别为 12,9;但是经过实践得到的 cap 值为 8,可见以上几种说法都不是很全面。
经过多个数据的实验我发现 cap 的值只能为偶数。
实验数据如下:
当起始cap为2时,添加2个元素时cap为4,添加3个元素时cap为6,添加4个元素时cap为6,添加5个元素时cap为8,添加6个元素时cap为8,添加7个元素时cap为10,添加8个元素时cap为10……
当起始cap为1时,添加2个元素时cap为4,添加3个元素时cap为4,添加4个元素时cap为6,添加5个元素时cap为6,添加6个元素时cap为8,添加7个元素时cap为8,添加8个元素时cap为10……
所以我总结出来的经验是,添加元素后当len[list]+len[params]>cap时;cap的值需要修改。
若len[list]+len[params]为偶数,则cap=len[list]+len[params]
若len[list]+len[params]为奇数,则cap=len[list]+len[params]+1
以上为个人总结经验。
疏林如有诉
疏林如有诉
191***4098@qq.com
3年前 (2019-08-01)
Raindeavor
wyw***ele@163.com
20
关于 cap 为何变为 6 的问题,我认为楼上解释也不对,哈哈。
1、当同时添加多个元素时:
len(list)+len([params]) 为偶数:cap=len(list)+len([params])
len(list)+len([params]) 为奇数:cap=len(list)+len([params])+1
即 cap 始终为偶数。
2、当一个一个添加元素时:
len(list)+1<=cap: cap=cap
len(list)+1>cap: cap=2*cap
即 cap 总是呈 2 倍的增加(也是偶数)。
以上规律是我观察输出后的个人总结,初学 Go,没查文档什么的,总结的有问题还请楼下指出,嘿嘿。
Raindeavor
Raindeavor
wyw***ele@163.com
3年前 (2019-08-02)
Eternity味道
271***298@qq.com
9
关于切片容量 cap,当切片容量不够时,cap 会自动扩容到 2 倍:
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* 允许追加空切片 */
怒江企业网站设计 - 怒江高端网站定制 - 怒江品牌网站搭建 - 上往建站
上往建站提供搭建网站,域名注册,官网备案服务,网店详情页设计,企业网店,专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管,网页美工排版,致力于域名申请,竞价托管,软文推广,全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机,网站推广,百度竞价托管,网站建设,上网建站推广服务,网络公司有哪些等业务,专业团队服务,效果好。
服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)
关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站



tSlice(slice) array[1] = 100 printSlice(slice)}func printSlice(x []int){ fmt.Printf("len=%d cap=%d slice=%v ", len(x), cap(x), x)}以上代码执行输出结果为:
Noah
lh_***9@126.com
gibson1112
185***72536@163.com
切片内部结构:
struct Slice{ byte* array; // actual data uintgo len; // number of elements uintgo cap; // allocated number of elements};第一个字段表示 array 的指针,是真实数据的指针第二个是表示 slice 的长度,第三个是表示 slice 的容量。
所以 unsafe.Sizeof(切片)永远都是 24。
当把 slice 作为参数,本身传递的是值,但其内容就 byte* array,实际传递的是引用,所以可以在函数内部修改,但如果对 slice 本身做 append,而且导致 slice 进行了扩容,实际扩容的是函数内复制的一份切片,对于函数外面的切片没有变化。
package mainimport ("fmt""unsafe")func main() { slice_test := []int{1, 2, 3, 4, 5} fmt.Println(unsafe.Sizeof(slice_test)) fmt.Printf("main:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test)) slice_value(slice_test) fmt.Printf("main:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test)) slice_ptr(&slice_test) fmt.Printf("main:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test)) fmt.Println(unsafe.Sizeof(slice_test))}func slice_value(slice_test []int) { slice_test[1] = 100 // 函数外的slice确实有被修改 slice_test = append(slice_test, 6) // 函数外的不变 fmt.Printf("slice_value:%#v,%#v,%#v ", slice_test, len(slice_test), cap(slice_test))}func slice_ptr(slice_test *[]int) { // 这样才能修改函数外的slice *slice_test = append(*slice_test, 7) fmt.Printf("slice_ptr:%#v,%#v,%#v ", *slice_test, len(*slice_test), cap(*slice_test))}结果如下:
24main:[]int{1, 2, 3, 4, 5},5,5slice_value:[]int{1, 100, 3, 4, 5, 6},6,10main:[]int{1, 100, 3, 4, 5},5,5slice_ptr:[]int{1, 100, 3, 4, 5, 7},6,10main:[]int{1, 100, 3, 4, 5, 7},6,1024gibson1112
185***72536@163.com
ragonli
rag***ig@gmail.com
slice 的底层是数组指针,所以 slice a 和 s 指向的是同一个底层数组,所以当修改 s[0] 时,a 也会被修改。
package mainimport "fmt"func main() { s := []int{1, 2, 3} // len=3, cap=3 a := s s[0] = 888 s = append(s, 4) fmt.Println(a, len(a), cap(a)) // 输出:[888 2 3] 3 3 fmt.Println(s, len(s), cap(s)) // 输出:[888 2 3 4] 4 6}