التعامل مع المصفوفات في Go
في Go، المصفوفات هي أنواع قيمة، وتعيين مصفوفة إلى أخرى يؤدي إلى إنشاء نسخة من جميع عناصرها. ينطبق هذا حتى عند تمرير مصفوفة إلى دالة، حيث أنها ستتلقى نسخة بدلاً من مرجع الذاكرة.السؤال الأصلي
تم طرح استفسار بخصوص الكود التالي:
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)
}
}
أعرب المؤلف عن ارتباكه بشأن سبب تأثر arr2 بالوظيفة العشوائية، على الرغم من توقعهم أن يكون arr2 وarr كيانين مختلفين.توضيح
تنبع المشكلة من سوء فهم بين المصفوفات والشرائح.المصفوفات مقابل الشرائح
المصفوفات هي مجموعات ذات طول ثابت من القيم، في حين أن الشرائح هي مراجع ديناميكية للصفائف الأساسية. في مثال التعليمات البرمجية المقدم، لم يتم استخدام أي صفائف.Slice Manipulationالسطر arr := []int{1, 2, 3, 4, 5} ينشئ شريحة تشير إلى صفيف أساسي مجهول. يقوم السطر arr2 := arr ببساطة بتكرار هذا المرجع، مما يؤدي إلى إشارة كل من arr وarr2 إلى نفس المصفوفة الأساسية. وظيفة خلط ورق اللعب، يتم إنشاء نسخة من الشريحة، وليس المصفوفة الأساسية. يتم تعديل هذه النسخة بواسطة الوظيفة، ولهذا السبب يتأثر arr2 أيضًا عندما يتم تعديل arr.
الاستنتاجفي Go، تتصرف الشرائح كمراجع إلى المصفوفات الأساسية. يؤدي تعيين شريحة إلى أخرى إلى نسخ المرجع، وليس المصفوفة الأساسية. يعد هذا المفهوم ضروريًا لفهم معالجة الشرائح في Go.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3