تدعم لغة Go المؤشرات مما يسمح لك بتمرير مراجع للقيم والسجلات داخل برنامجك.
package main
import "fmt"
سنوضح كيف تعمل المؤشرات مقارنة بالقيم باستخدام دالتين: zeroval و zeroptr. zeroval لها معامل من نوع int لذا سيتم تمرير المعاملات لها بالقيمة (by value). ستحصل zeroval على نسخة من ival مختلفة عن تلك الموجودة في الدالة المستدعية.
func zeroval(ival int) {
ival = 0
}
zeroptr في المقابل لها معامل من نوع *int مما يعني أنها تأخذ مؤشراً لـ int. كود *iptr داخل متن الدالة يقوم بـ “إلغاء المرجعية” (dereferences) للمؤشر من عنوان ذاكرته إلى القيمة الحالية الموجودة في ذلك العنوان. تعيين قيمة لمؤشر تم إلغاء مرجعيته يغير القيمة في العنوان المشار إليه.
func zeroptr(iptr *int) {
*iptr = 0
}
func main() {
i := 1
fmt.Println("initial:", i)
zeroval(i)
fmt.Println("zeroval:", i)
صيغة &i تعطي عنوان الذاكرة لـ i أي مؤشراً لـ i.
zeroptr(&i)
fmt.Println("zeroptr:", i)
يمكن طباعة المؤشرات أيضاً.
fmt.Println("pointer:", &i)
}
دالة zeroval لا تغير قيمة i في main لأنها تعمل على نسخة، ولكن zeroptr تفعل ذلك لأنها تملك مرجعاً لعنوان الذاكرة لهذا المتغير.
تشغيل البرنامج:
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100 المثال التالي: النصوص والرموز (Strings and Runes).