私はちょうど覚えていますに行きました。私は関数にslices
を渡すことに疑問を持っています。スライスのコピーを関数に渡すには?
私は間違っていないんだ場合、私はこのような何かのであればslices
は、ゴーに参照によって渡されます
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5}
fmt.Println(slice)
testSlice(slice)
fmt.Println(slice)
}
func testSlice(slice []int) {
slice[0] = 5
slice[4] = 1
}
をtestSlice
機能は、実際に元slice
の値が変更されますので、参照渡し(デフォルト)。
slice
のコピーをtestSlice
の機能に直接渡すことは簡単な方法ですか?
私はslice
のコピーを作成するには、このような何かを行うことができますを確認します。
package main
import "fmt"
func main() {
slice := []int{1, 2, 3, 4, 5}
fmt.Println(slice)
testSlice(slice)
fmt.Println(slice)
}
func testSlice(slice []int) {
var newSlice []int
for i := 0; i < len(slice); i++ {
newSlice = append(newSlice, slice[i])
}
newSlice[0] = 5
newSlice[4] = 1
}
しかし、それはそれらのそれぞれをコピーし、元のslice
内のすべての値を通過する必要があり、それはいないようですすばらしい解決策になる。
ありがとう@Nevermore、これは 'スライス'をコピーするよりエレガントな方法です。念のため。 'スライス'コピーを関数に直接渡すことはできません。唯一の方法は、新しい 'slice 'を手動で作成し、オリジナルの' slice'から値をコピーすることです。私は 'C++ 'から来ているので私はそれを求めているだけで、参照や値渡しでベクトルを渡すことができます。 – KelvinS
@KelvinSalton goには「参照渡し」という概念は全くありません。すべてが価値によって渡されます。スライスとは、基本となる配列への記述子です。配列のその部分のコピーが必要な場合は、コピーを作成する必要があります。Goの焦点は、「エレガントな」または「構文的な砂糖」ではなく「明示的」である: – Volker
ありがとう@Volker、それはずっとはっきりしている。 – KelvinS