2017-08-03 9 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

ここに私がそれを見る場所が1つしかない。この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のそれはあなたが2つのスライスを持っているが)実際に読むことをお勧めしますこれを行う。 https://play.golang.org/p/cJgfYGS78H

p.s .:上で定義した内容v := []byte {1, 2, 3}はスライスなので、配列はここにはありません。ここでは、スライスの一部を読み上げた後の違いを理解するのに役立つものがあります。

+0

'v' *を渡すと、新しいスライス値*も作成されます。どちらの場合も、同じ基本配列を参照するスライスのコピーを渡します。 2つのアプローチの間には実際的な違いはありません。 – Adrian

+0

あなたは間違っています@adrian私は決してvを渡しても値を作成しないと言ったことはありません。だから私はあなたがこれをどこから選んだのかわかりません - 関数への渡しは常にGoの値渡しでコピーを作成します。ただし、v [:]を実行すると、**スライスの追加コピー(おそらく冗長なコピー)が発生します** - わからない場合は調査してください。私はそれを関数に渡すことについて全く話していません。たぶん、私は関数の例を全く含めてはいけません!したがって、「vがスライスの場合、vとv [:]の間に違いはありません」ということは間違っています。 – Ravi

+0

関数に渡すか、別の変数に代入するかにかかわらず、どちらかの方法でコピー*を作成します。私はそれが正しいので、それを修正していない - * vがスライスであるときに違いはない*。 – Adrian

関連する問題