收藏此站 联系我们 网站
当前位置:首页» 网站推广 » 【建站服务】怒江企业网站设计 - 怒江高端网站定制 - 怒江品牌网站搭建 - 上往建站-域名申请

【建站服务】怒江企业网站设计 - 怒江高端网站定制 - 怒江品牌网站搭建 - 上往建站-域名申请

作者: 风兰 . 阅读量: 7 . 发表时间:2022-09-21 05:52:27

网站建设
​

上往建站提供服务器空间服务商,百度快照排名,网站托管,百度推广运营,致力于设计外包服务与源代码定制开发,360推广,搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


怒江企业网站设计 - 怒江高端网站定制 - 怒江品牌网站搭建 - 上往建站

网站建设.png

  1. tSlice(slice)
       array[1] = 100
       printSlice(slice)}func printSlice(x []int){
       fmt.Printf("len=%d cap=%d slice=%v
    ", len(x), cap(x), x)}

    以上代码执行输出结果为:

    len=5 cap=5 slice=[1 2 3 4 5]len=4 cap=4 slice=[2 3 4 5]len=4 cap=4 slice=[100 3 4 5]
    Noah

       Noah

      lh_***9@126.com

    3年前 (2019-05-05)
  2.    gibson1112

      185***72536@163.com

    48

    切片内部结构:

    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,1024
    gibson1112

       gibson1112

      185***72536@163.com

    3年前 (2019-05-21)
  3.    ragonli

      rag***ig@gmail.com

    13

    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}


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(各城市商务人员可上门服务)


关键词:网站建设,企业网站,网站制作,网页设计,高端网站建设,企业网站制作,网页制作,制作网站,网站设计,高端网页设计,高端网站设计,做网站,自适应网站

全国服务热线
18114747181
二维码
手机端二维码
上往建站
地址:全国各地都有驻点商务 |  网站建设:上往建站
在线咨询QQ:1120768800
 
QQ在线咨询
售前咨询热线
18114747181
营销顾问
营销顾问
售后服务热线
400-000-1116
售后服务
售后服务