"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يؤثر خلط الشريحة على الشريحة المخصصة لها في Go؟

لماذا يؤثر خلط الشريحة على الشريحة المخصصة لها في Go؟

تم النشر بتاريخ 2024-11-11
تصفح:288

Why does shuffling a slice affect a slice assigned to it in Go?

التعامل مع المصفوفات في 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