2017-08-03 67 views
2

考慮到下面的代碼,我已經看到一些代碼使用這種格式v[:]傳遞全切片(不是它的一部分)作爲參數。通過全切片範圍作爲參數

v[:]v之間有什麼區別嗎?或者它只是一個開發人員的偏好?

我在下面做的測試表明我沒有區別。我錯過了什麼嗎?

package main 

import (
    "fmt" 
) 

func main() { 
    v := []byte {1, 2, 3} 

    printSliceInfo(v) 
    printSliceInfo(v[:]) 
} 

func printSliceInfo(s []byte) { 
    fmt.Printf("Len: %v - Cap: %v - %v\n", len(s), cap(s), s) 
} 

回答

3

v是片,有vv[:]之間沒有差別。當v是數組時,v[:]是覆蓋整個數組的片。

+0

所以,只是開發人員的偏好!好的,現在很清楚! – Azize

+0

我想是這樣的......我從來沒有見過在野外用v [:]'傳遞片段的情況,我不知道爲什麼有人會這麼做 - 這是沒有必要的,可能只是令人困惑。 – Adrian

+0

這裏只是我看到它的一個地方。在這個pkg中,3個示例以這種方式使用slice。 https://golang.org/pkg/crypto/rsa/#example_VerifyPKCS1v15 – Azize

-1

有差別。您可能需要閱讀Slice Expression in the Golang spec

a[:] // same as a[0 : len(a)] 

v[:]實際上是一個切片值(也就是那麼你有兩個片 - v & v [:]),所以你需要思考爲什麼你真的之前需要它這樣做。這裏有一些東西可能會幫助你瞭解差異,也許在你閱讀片段後有所瞭解:https://play.golang.org/p/cJgfYGS78H

p.s .:你上面定義的v := []byte {1, 2, 3}是一個slice,所以array不在這裏。

+0

傳遞'v' *還會創建一個新的切片值*。在這兩種情況下,您都會傳遞片的副本,這兩種情況都會引用相同的底層數組。這兩種方法之間沒有實際的區別。 – Adrian

+0

你錯了@adrian我從來沒有說過傳遞v不會創建一個值,所以我不知道你從哪裏獲取 - 傳遞給一個函數總是在Go中傳遞值並創建一個副本。但是,如果您執行v [:],**您正在創建一個額外的(可能是冗餘的)片**的副本 - 請調查它,如果您不確定。我不是在談論把它傳遞給一個函數。也許我不應該包含這個函數示例!因此,提及「當v是切片時,v和v [:]之間沒有區別 - 」是錯誤的 - 請正確地糾正它。 – Ravi

+0

無論您是將它傳遞給一個函數還是將它分配給另一個變量,它都會創建一個副本*無論哪種方式*。我沒有糾正它,因爲它是正確的 - *當'v'是一個切片時沒有區別。 – Adrian