2016-10-29 113 views
0

在使用Go切片時,我似乎無法將自己的頭圍繞在索引的符號上。Go切片的索引符號背後的想法是什麼?

給出片段s

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

我現在想創建一個新的切片s2 = [2 3]

s2 := s[1:3] // s2 = [2 3] 

現在,訪問此值時我應該經歷的思考過程是什麼?我是否從索引1開始讀取值,直到幷包括切片的第三個元素?或者,我是否正在讀取索引1中的值,但不包括索引3

我不開始於索引1和上升到索引3和我也不是起始於1位置和上升到位置3作爲這兩個將導致具有3個元素s2

這個符號背後的想法是什麼?

回答

2

規格相關部分:Slice expressions

對於一個字符串,數組,指針陣列,或切片a,初級表達

a[low : high] 

構造一個子串或切片。 指數lowhigh選擇操作數a的哪些元素出現在結果中。 結果的索引從0開始,長度等於high - low

所以s2 := s[1:3]創建具有長度3 - 1 = 2新的片,所以它會包含2個元素:s[1]s[2]

當切割片,low應該是要包括(包括)的第一個元素的索引,high應該是將被incuded的最後一個元素(high的指數是獨家)。

所以,如果你想要的結果包括的元素[2, 3],您需要提供切片指數13

s2 := s[1:3] // will be [2, 3] 

可能是什麼困惑的是,在你的片的元素與1啓動,但索引始於0

對於包容性的排他性指數背後的原因,請參閱相關的問題:In a Go slice, why does s[lo:hi] end at element hi-1?

+0

你可以看到它在這裏工作 - HTTPS://play.golang。org/p/AwYUsn3mON – SRC

+0

@SRC是的,我看到了,您對此有何疑問? 's1'是隻有一個元素的slice,'s [2]'是一個索引表達式,表示第二個(0索引)的元素,它是'3'。 – icza

+0

也許我的榜樣選得不好。我很清楚單個值訪問和創建新片之間的區別。我其實是想知道指數背後的想法是如何工作的,因爲它看起來第一個值是一個索引,而第二個值是從1開始的元素的位置。我更新了這個問題。 – sge

相關問題