2017-08-10 28 views
-2

我知道,你可以通過安全得到一個切片的第圍棋

test := []int{0, 1, 2, 3, 4} 
subsection := test[:2] 

獲得圍棋的一個切片的第但是,如果你嘗試類似

subsectionError := test[:10] 

你會得到超出界限的錯誤。目前我正在做類似

length := 10 
if len(test) < length { 
    length = len(test) 
} 
safeSubsection := test[:length] 

爲了避免這個錯誤,但是有沒有更好的方法來做到這一點?對我來說,這感覺很尷尬,但是一般來說,Go似乎是一個非常明確的語言。

+4

恕我直言,這是在去做的方式。否則,「更好」,「哈克」,聽起來像你正在捕魚的東西,這主要是基於意見的。 – Krom

+3

如何檢查你是否正在訪問內存越界「哈克」?這是作爲內存安全語言的一部分,不依賴於SIGSEGV來表明你不應該訪問這些地址。 – JimB

+0

這也是一種罕見的情況,您需要某個切片的切片,但不知道或不在意原始切片的長度或切片的長度是否與您請求的長度相同。我猜這是截斷一個字符串,在這種情況下,我會使用'fmt.Sprintf'而不是切片。 – Adrian

回答

0

在Go中,答案往往是隱藏一個函數或方法中的醜陋。例如,分功能,

package main 

import "fmt" 

func min(x, y int) int { 
    if y < x { 
     return y 
    } 
    return x 
} 

func main() { 
    test := []int{0, 1, 2, 3, 4} 
    fmt.Println(test) 
    sub := test[:min(10, len(test))] 
    fmt.Println(sub) 
} 

輸出:

[0 1 2 3 4] 
[0 1 2 3 4] 
0

如果你發現自己經常這樣做,和醜陋惹惱你,你可以做一個切片類型,而不是放一些方便的方法上這個。如果你有很多方便的方法來操作列表(比如min,max,head,contains等),這很有用。我用它來添加包含字符串或int切片。

package main 

import (
    "fmt" 
) 

type Ints []int 

func (i Ints) Head(count int) Ints { 
    if count > len(i) { 
     count = len(i) 
    } 
    return i[:count] 
} 


func main() { 

    test := Ints{0, 1, 2, 3, 4} 
    fmt.Printf("First 2 %v\n", test.Head(2)) 
    fmt.Printf("First 10 %v\n", test.Head(10)) 
} 

https://play.golang.org/p/OkCjHdlj0u

如果你只是做了一次,它可能不值得,如果你有相同的列表上運行幾個循環,這可能是。當然,這是一個可以在Go中使用更復雜的通用容器的領域。