2010-11-19 35 views
5

Sau khi đọc phần sau đây tại http://golang.org/doc/effective_go.html#arrays ...Xử lý Mảng tại Gò

  • Mảng là những giá trị. Gán một mảng cho mảng khác sao chép tất cả các phần tử .
  • Cụ thể, nếu bạn chuyển một mảng vào một hàm, nó sẽ nhận được một bản sao của mảng đó, chứ không phải là con trỏ đến nó.

... Tôi hy vọng trong đoạn mã sau đó arr2 được phân biệt với arr, và main() 's arr được phân biệt với shuffle()' s arr. Ai đó có thể vui lòng giải thích lý do tại sao các mã sau shuffles arr2? Tôi biết Go vẫn còn là một ngôn ngữ trẻ; có lẽ việc điều trị mảng đã thay đổi?

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) 
     } 
} 
+0

Lưu ý: hàm 'shuffle()' của bạn nên sử dụng 'j: = rand.Intn (i + 1)' nếu bạn loại trừ xác suất của một phần tử để duy trì tại chỗ, ví dụ như trộn ngẫu nhiên '{1, 2} 'luôn luôn dẫn đến' {2, 1} 'và không bao giờ có kết quả' {1, 2} 'có thể khác. – icza

Trả lời

20

Tôi nghĩ rằng vấn đề của bạn là bạn đang bối rối mảng và lát.

Mảng là danh sách giá trị cố định. Bạn thực sự không sử dụng bất kỳ mảng nào trong ví dụ của mình. Mảng có thể được khai báo theo một vài cách:

arr1 := [3]int{1, 2, 3} // an array of 3 integers, 1-3 
arr2 := [...]int{1, 2, 3} // same as the previous line, but we're letting 
          // the compiler figure out the size of the array 
var arr3 [3]int   // a zeroed out array of 3 integers 

Bạn đang sử dụng lát. Một lát là một tham chiếu đến một mảng nằm bên dưới. Có một số cách để phân bổ lát mới:

slice1 := []int{1, 2, 3} // a slice of length 3 containing the integers 1-3 
slice2 := make([]int, 3) // a slice of length 3 containing three zero-value integers 
slice3 := make([]int, 3, 5) // a slice of length 3, capacity 5 that's all zeroed out 

Bất kỳ phân đoạn lát nào khác chỉ nhân đôi tham chiếu đến một mảng.

Bây giờ chúng ta đã thiết lập rằng, dòng

arr := []int{1, 2, 3, 4, 5} 

tạo ra một lát tham khảo một mảng tiềm ẩn nặc danh có chứa những con số 1-5.

arr2 := arr 

bản sao mà tham khảo - nó không sao chép các mảng tiềm ẩn. Vì vậy, có một mảng cơ bản và hai tham chiếu đến nó. Đó là lý do tại sao nội dung của arr2 thay đổi khi bạn sửa đổi nội dung của arr. Họ đang tham chiếu cùng một mảng.

+1

Cảm ơn bạn đã giải thích; nó có ý nghĩa bây giờ. – Timothy

Các vấn đề liên quan