اختبارات

ثابت 4

ما سلوك البرنامج التالي؟


package main

import "unsafe"

const S = "go" // S[1]-S[0] == 8

func main() {
	var x *[8][8]byte
	println(unsafe.Sizeof((*x)[S[1]-S[0]][S[1]-S[0]]))
}

الخيارات:

  • يطبع 1.
  • يُصاب بـ panic في وقت التشغيل.
  • يفشل في التصريف.

الإجابة: يطبع 1.

شغِّله على Go play.

النقاط الأساسية:

  • بالنسبة إلى نص ثابت S، تُعامَل عبارة S[i] دائماً كقيمة غير ثابتة (يرجى قراءة مقال النصوص في Go أو كتاب تفاصيل ونصائح Go). لذا يُصرَّف البرنامج.
  • تُقيَّم استدعاءات unsafe.Sizeof في وقت التصريف. ولا تُستخدم في عمليات التقييم سوى معلومات النوع الخاصة بالمعطيات. ولا تُقيَّم التعبيرات *x وS[1]-S[0] وغيرها أبداً في وقت التشغيل. لذا لن يحدث أي panic من نوع "index out of range".