ما سلوك البرنامج التالي؟
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".