Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah mengubah suai tatasusunan di dalam fungsi dalam Go juga mengubah pembolehubah yang diberikan kepada tatasusunan yang sama di luar fungsi?

Mengapakah mengubah suai tatasusunan di dalam fungsi dalam Go juga mengubah pembolehubah yang diberikan kepada tatasusunan yang sama di luar fungsi?

Susan Sarandon
Susan Sarandonasal
2024-10-26 01:25:28706semak imbas

Why does modifying an array inside a function in Go also change a variable assigned to the same array outside the function?

Rawatan Tatasusunan dalam Go

Dalam Go, tatasusunan ialah nilai, bukan rujukan. Oleh itu, memberikan satu tatasusunan kepada yang lain akan menyalin semua elemen. Selain itu, menghantar tatasusunan kepada fungsi akan memberikan salinan, bukan penunjuk.

Contoh Penjelasan Kod

Pertimbangkan contoh kod berikut:

package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}

Dalam kod ini, fungsi shuffle mengambil tatasusunan sebagai input dan mengocok elemennya. Walau bagaimanapun, walaupun kami menetapkan tatasusunan asal kepada pembolehubah baharu arr2 sebelum memanggil shuffle, perubahan yang dibuat kepada arr dalam fungsi ditunjukkan dalam arr2.

Slices vs. Arrays

Pergi membezakan antara kepingan dan tatasusunan. Walaupun tatasusunan ialah senarai nilai panjang tetap, kepingan ialah rujukan kepada tatasusunan asas. Dalam contoh kod, kedua-dua arr dan arr2 merujuk kepada tatasusunan asas yang sama. Akibatnya, sebarang pengubahsuaian yang dibuat pada arr juga digunakan pada arr2. Untuk mencipta salinan tatasusunan yang berbeza, hirisan mesti diperuntukkan menggunakan make:

arr := []int{1, 2, 3, 4, 5}
arr2 := make([]int, len(arr))
copy(arr2, arr)

Dalam versi yang dikemas kini ini, arr2 bukan lagi rujukan kepada tatasusunan asal, jadi pengubahsuaian yang dibuat kepada arr tidak akan menjejaskan arr2.

Atas ialah kandungan terperinci Mengapakah mengubah suai tatasusunan di dalam fungsi dalam Go juga mengubah pembolehubah yang diberikan kepada tatasusunan yang sama di luar fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn