跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • go slice defaults 这里是坑还是如此设计?
未分類
3 5 月 2020

go slice defaults 这里是坑还是如此设计?

go slice defaults 这里是坑还是如此设计?

資深大佬 : saltsugar 42

// https://tour.golang.org/moretypes/10

package main

import “fmt”

func main() { s := []int{1, 2, 3, 4, 5, 6}

s = s[1:4] fmt.Println(s)  s = s[:5] fmt.Println(s) // 这里 s 接上面的起点 2,但是终点却是 6 ?  s = s[1:] fmt.Println(s)  

}

////output

[2 3 4]

[2 3 4 5 6]

[3 4 5 6]

大佬有話說 (12)

  • 資深大佬 : doylecnn

    下标从 0 开始呀,哪里坑了?

  • 資深大佬 : catror

    这是设计,边界不超过 cap 就行

  • 資深大佬 : ArJun

    这种赋值操作一般不推荐吧,你使用的始终是一个对象

  • 資深大佬 : lostpg

    下表从零开始,end 的值是末尾元素下标+1。这种用法有梗的

  • 資深大佬 : lostpg

    @lostpg 看岔了,忽略

  • 資深大佬 : petelin

    第二个用法我其实挺惊讶的
    我一直以为边界是 len 这样看是 cap

  • 主 資深大佬 : saltsugar

    @doylecnn 是下标结尾哈

    @catror 直觉上理解,slice 前后边界应该是限定了。
    比如第三次 slice 的首边界就在原来基础上+1 了。
    如果第二次 slice 能将上一个尾部扩展的话,那么首边界却不能往前移动,这点反直觉吧

    @ArJun 是不推荐。反直觉啊
    @petelin 对

  • 資深大佬 : ethego

    数组越界了,所以取到了 slice 外面的东西,这时候是未定义行为,取到任何东西都不奇怪。只是这里 slice 没有发生拷贝,取到了原地址后面的东西了。

  • 資深大佬 : ethego

    至于取分片为什么没有拷贝或者不做越界检查当然是为了性能,所以挺合理的

  • 資深大佬 : zhyl

    切片和数组是不同的. 两种类型能够索引数据的范围都是在 len(x)之内的.
    但是切片可以通过重新切片来扩展它的 len, 重新切片允许的范围是其底层数组决定的, 它等于切片的 cap.
    不存在数组越界和未定义行为这种说法.

  • 資深大佬 : ethego

    @zhyl 嗯,试了下你说的是对的

  • 資深大佬 : zhuyuefeng

    这么解释不知道合不合适:

    // origin
    s := []int{1, 2, 3, 4, 5, 6}

    s = s[1:4]
    // 此时 s 是原数组的切片,其内容就是[2 3 4],索引 index 1, 2, 3 的值
    // 但原数组的 cap 比现在的切片大,所以目前是可以扩展的
    // [2 3 4]
    fmt.Println(s)

    s = s[:5]
    // 进行重切片,此时发现原切片不够大,但底层数组的 cap 够,也就增加了后面的 6,就是 index=4 的值
    fmt.Println(s)
    // [2 3 4 5 6]

    s = s[1:]
    // 此时又重新切片 去掉第一个元素 index=0,也就是 2,那么返回的数据就是[3 4 5 6]
    fmt.Println(s)
    // [3 4 5 6]

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具