ماذا يطبع البرنامج التالي؟
package main
type Book struct {
Pages int
}
func f() int {
var books = []Book{{555}}
for _, book := range books {
book.Pages = 999
}
return books[0].Pages
}
func g() int {
var books = []*Book{{555}}
for _, book := range books {
book.Pages = 999
}
return books[0].Pages
}
func main() {
println(f(), g())
}
الخيارات:
- 999 999
- 555 999
- 999 555
- 555 555
الإجابة: 555 999
شغِّله على Go play.
النقاط الأساسية:
- في الحلقة، يُنسخ كل عنصر من عناصر الحاوية إلى متغير التكرار الثاني، وتعديل متغير التكرار لا يغيّر قيم عناصر الحاوية.
- قيمة البنية تملك حقولها. وعند نسخ قيمة بنية، تُنسخ جميع حقولها أيضًا.
- المؤشر إلى قيمة بنية لا يملك حقول قيمة البنية. إنه يشير إلى قيمة البنية فقط، أي إنه يشير إلى حقول قيمة البنية فقط. وعند نسخ مؤشر، لا تُنسخ القيم التي يشير إليها المؤشر. وبعد النسخ، تشير نسخة المؤشر إلى القيم نفسها التي يشير إليها المؤشر الأصلي.