收藏此站 联系我们 网站
当前位置:首页» 网络推广 » 【建站服务】专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-嘉兴上往建站-域名申请

【建站服务】专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-嘉兴上往建站-域名申请

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

网站建设

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


专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-嘉兴上往建站

网站建设.png

  1.   770***908@qq.com

    2年前 (2020-06-09)
  2.    是小飞呀

      211***3262@qq.com

       参考地址

    26

    可以通过查看$GOROOT/src/runtime/slice.go源码,其中扩容相关代码如下:

    newcap := old.cap
    doublecap := newcap + newcapif cap > doublecap {    newcap = cap} else {    if old.len < 1024 {        newcap = doublecap
        } else {        // Check 0 < newcap to detect overflow        // and prevent an infinite loop.        for 0 < newcap && newcap < cap {            newcap += newcap / 4        }        // Set newcap to the requested cap when        // the newcap calculation overflowed.        if newcap <= 0 {            newcap = cap
            }    }}

    从上面的代码可以看出以下内容:

    需要注意的是,切片扩容还会根据切片中元素的类型不同而做不同的处理,比如intstring类型的处理方式就不一样。

    是小飞呀

       是小飞呀

      211***3262@qq.com

       参考地址

    2年前 (2020-08-18)
    • 首先判断,如果新申请容量(cap)大于2倍的旧容量(old.cap),最终容量(newcap)就是新申请的容量(cap)。

    • 否则判断,如果旧切片的长度小于1024,则最终容量(newcap)就是旧容量(old.cap)的两倍,即(newcap=doublecap),

    • 否则判断,如果旧切片长度大于等于1024,则最终容量(newcap)从旧容量(old.cap)开始循环增加原来的1/4,即(newcap=old.cap,for {newcap += newcap/4})直到最终容量(newcap)大于等于新申请的容量(cap),即(newcap >= cap)

    • 如果最终容量(cap)计算值溢出,则最终容量(cap)就是新申请容量(cap)。

  3.    dopsie

      850***208@qq.com

    6

    楼上对于扩容后的容量说明都在发生扩容的代码逻辑中,没有说明这段代码中的参数 cap(申请容量) 是怎么计算的 。

    经过多次的测试,我这边猜测是在 append 发生扩容时,申请容量是 原切片容量 + 追加的长度,如果是单数则 +1,再将这个容量传入扩容的方法进行判断,以讨论的 cap 变为6的代码为例:

    原切片为 []int{1, 2} ,长度为2(记为 len1 = 2),容量为2(记为 cap1 =2)。

    追加的长度为 {3, 4, 5},长度为3(记为 len2= 3),此时进行扩容,申请容量为6(记为 cap2 = cap1+len2,cap2 为单数,则+1,cap2 = 6),将 cap2 带入楼上的扩容判断逻辑。

    申请容量 cap2 大于2倍的旧容量(cap1 = 2),则newcap = cap2 = 6

    部分测试打印如下:

    len=0 cap=0 slice=[]len=2 cap=2 slice=[0 1]    // len1 = 2,cap1 = 2len=5 cap=6 slice=[0 1 2 3 4]    // len2 = 3,cap2 = cap1+len2 = 5,单数+1,cap2 = 6len=0 cap=0 slice=[]len=2 cap=2 slice=[0 1]   // len1 = 2,cap1 = 2len=6 cap=6 slice=[0 1 2 3 4 5]    // len2 = 3,cap2 = cap1+len2 = 6
    dopsie

       dopsie

      850***208@qq.com

    2年前 (2021-01-26)
  4.    多喝热水

      610***322@qq.com

    2

    关于 append 会让切片与其他相关切片脱钩的问题:

    package mainimport "fmt"func main() {
       x := make([]int, 4)
       a := x[:2]
       a[0] = 1   
       fmt.Println(a)
       fmt.Println(x)
       a = append(a, 2)
       a[0] = 0   
       fmt.Println(a)
       fmt.Println(x)
       fmt.Printf("切片a的地址:%p
    ", a)
       fmt.Printf("切片x的地址:%p
    ", x)
       fmt.Println()
    
       y := make([]int, 4)
       b := y
       b[0] = 1   
       fmt.Println(b)
       fmt.Println(y)
       b = append(b, 2)
       b[0] = 0   
       fmt.Println(b)
       fmt.Println(y)
       fmt.Printf("切片b的地址:%p
    ", b)
       fmt.Printf("切片y的地址:%p
    ", y)


于楼上所讨论的 cap 由 2-> 6,根据查阅文档,可以得出一个结论:通过 append() 函数向数组中添加元素,首先 cap 会以二倍的速度增长,如果发现增长 2 倍以上的容量可以满足扩容后的需求,那么 cap*2,否则就会看扩容后数组的 length 是多少 cap=length+1。


go语言初学者

   go语言初学者


  Bao***_snow@163.com


3年前 (2019-10-21)

   bullet


  jia***angyu@163.com


   参考地址


2

以 s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 为例:


建议:做 slice 截取时建议用两个参数,尤其是从底层数组进行切片操作时,因为这样在进行第一次 append 操作时,会给切片重新分配空间,这样减少切片对数组的影响。


结论:s = s[low : high : max] 切片的三个参数的切片截取的意义为 low 为截取的起始下标(含), high 为窃取的结束下标(不含 high),max 为切片保留的原切片的最大下标(不含 max);即新切片从老切片的 low 下标元素开始,len = high - low, cap = max - low;high 和 max 一旦超出在老切片中越界,就会发生 runtime err,slice out of range。另外如果省略第三个参数的时候,第三个参数默认和第二个参数相同,即 len = cap。


package main

 

import "fmt"

 

func main(){

    s := []int {0, 1, 2, 3, 4, 5, 6,7, 8, 9}

 

    s = s[1:9:10]

    fmt.Println(s)

    fmt.Println(len(s))

    fmt.Println(cap(s))

}

运行结果:


[1 2 3 4 5 6 7 8]

8

9

修改 max 值,发生越界错误:


package main

 

import "fmt"

 

func main(){

    s := []int {0, 1, 2, 3, 4, 5, 6,7, 8, 9}

 

    s = s[1:9:13]  // 修改 max 值为 13

    fmt.Println(s)

    fmt.Println(len(s))

    fmt.Println(cap(s))

}

执行后,错误信息如下:


panic: runtime error: slice bounds out of range


goroutine 1 [running]:

bullet

   bullet


  jia***angyu@163.com


   参考地址


3年前 (2020-01-10)

   da蘑菇大


  860***289@qq.com


7

append 会让切片和与他相关的切片脱钩,但地址不变:


package main


import (

    "fmt"

)


func main() {

    a := []int{1, 2, 3, 4}

    b := a

    printSlice(a, "part1  a")

    printSlice(b, "part1  b")

    fmt.Printf(" ")


    a[0] = 9

    printSlice(a, "part2  a")

    printSlice(b, "part2  b")

    fmt.Printf(" ")


    a = append(a, 5)

    a[0] = 1

    printSlice(a, "part3  a")

    printSlice(b, "part3  b")

    fmt.Printf(" ")


    c := a


专业网站建设-网站设计-网站制作与网站开发-高端品牌企业宣传策划-嘉兴上往建站


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


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

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