ไป - ตัวชี้

คำแนะนำใน Go นั้นง่ายและสนุกในการเรียนรู้ งานการเขียนโปรแกรม Go บางอย่างดำเนินการได้ง่ายกว่าด้วยพอยน์เตอร์และงานอื่น ๆ เช่นการโทรโดยการอ้างอิงไม่สามารถทำได้โดยไม่ใช้พอยน์เตอร์ ดังนั้นจึงจำเป็นต้องเรียนรู้คำแนะนำเพื่อเป็นโปรแกรมเมอร์ Go ที่สมบูรณ์แบบ

ดังที่คุณทราบทุกตัวแปรคือตำแหน่งหน่วยความจำและตำแหน่งหน่วยความจำทุกแห่งจะมีที่อยู่ที่กำหนดไว้ซึ่งสามารถเข้าถึงได้โดยใช้ตัวดำเนินการเครื่องหมายและ (&) ซึ่งหมายถึงที่อยู่ในหน่วยความจำ พิจารณาตัวอย่างต่อไปนี้ซึ่งจะพิมพ์ที่อยู่ของตัวแปรที่กำหนด -

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

Address of a variable: 10328000

คุณจึงเข้าใจว่าที่อยู่หน่วยความจำคืออะไรและจะเข้าถึงได้อย่างไร ตอนนี้ให้เราดูว่าพอยน์เตอร์คืออะไร

ตัวชี้คืออะไร?

pointerเป็นตัวแปรที่มีค่าเป็นที่อยู่ของตัวแปรอื่นเช่นที่อยู่โดยตรงของตำแหน่งหน่วยความจำ เช่นเดียวกับตัวแปรหรือค่าคงที่คุณต้องประกาศตัวชี้ก่อนจึงจะสามารถใช้เพื่อจัดเก็บที่อยู่ตัวแปรได้ รูปแบบทั่วไปของการประกาศตัวแปรพอยน์เตอร์คือ -

var var_name *var-type

ที่นี่ typeเป็นประเภทฐานของตัวชี้ ต้องเป็นประเภทข้อมูล C ที่ถูกต้องและvar-nameคือชื่อของตัวแปรพอยน์เตอร์ เครื่องหมายดอกจัน * ที่คุณใช้ในการประกาศตัวชี้เป็นเครื่องหมายดอกจันเดียวกับที่คุณใช้ในการคูณ อย่างไรก็ตามในคำสั่งนี้จะใช้เครื่องหมายดอกจันเพื่อกำหนดตัวแปรเป็นตัวชี้ ต่อไปนี้เป็นการประกาศตัวชี้ที่ถูกต้อง -

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

ชนิดข้อมูลจริงของค่าของพอยน์เตอร์ทั้งหมดไม่ว่าจะเป็นจำนวนเต็มจำนวนทศนิยมหรืออื่น ๆ จะเหมือนกันเป็นเลขฐานสิบหกแบบยาวที่แสดงแอดเดรสหน่วยความจำ ข้อแตกต่างเพียงอย่างเดียวระหว่างพอยน์เตอร์ของชนิดข้อมูลที่แตกต่างกันคือชนิดข้อมูลของตัวแปรหรือค่าคงที่ที่ตัวชี้ชี้ไป

วิธีใช้พอยน์เตอร์

มีการดำเนินการที่สำคัญบางอย่างซึ่งเรามักจะดำเนินการโดยใช้พอยน์เตอร์: (ก) เรากำหนดตัวแปรพอยน์เตอร์ (b) กำหนดแอดเดรสของตัวแปรให้กับพอยน์เตอร์และ (ค) เข้าถึงค่าที่แอดเดรสที่เก็บไว้ในตัวแปรพอยน์เตอร์ .

การดำเนินการทั้งหมดนี้ดำเนินการโดยใช้ตัวดำเนินการยูนารี * ที่ส่งคืนค่าของตัวแปรที่อยู่ตามที่อยู่ที่ระบุโดยตัวถูกดำเนินการ ตัวอย่างต่อไปนี้สาธิตวิธีดำเนินการเหล่านี้ -

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Nil Pointers ใน Go

ไปที่คอมไพเลอร์กำหนดค่า Nil ให้กับตัวแปรพอยน์เตอร์ในกรณีที่คุณไม่มีแอดเดรสที่แน่นอนที่จะกำหนด สิ่งนี้ทำได้ในช่วงเวลาของการประกาศตัวแปร ตัวชี้ที่กำหนดค่าศูนย์เรียกว่า anil ตัวชี้

ตัวชี้ศูนย์เป็นค่าคงที่โดยมีค่าเป็นศูนย์ที่กำหนดไว้ในไลบรารีมาตรฐานต่างๆ พิจารณาโปรแกรมต่อไปนี้ -

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -

The value of ptr is 0

ในระบบปฏิบัติการส่วนใหญ่โปรแกรมไม่ได้รับอนุญาตให้เข้าถึงหน่วยความจำที่อยู่ 0 เนื่องจากหน่วยความจำนั้นสงวนไว้โดยระบบปฏิบัติการ อย่างไรก็ตามที่อยู่หน่วยความจำ 0 มีความสำคัญเป็นพิเศษ เป็นการส่งสัญญาณว่าตัวชี้ไม่ได้ตั้งใจให้ชี้ไปยังตำแหน่งหน่วยความจำที่สามารถเข้าถึงได้ แต่ตามแบบแผนถ้าตัวชี้มีค่าศูนย์ (ศูนย์) จะถือว่าชี้ไปที่ความว่างเปล่า

ในการตรวจหาตัวชี้ศูนย์คุณสามารถใช้คำสั่ง if ได้ดังนี้ -

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

ไปที่ตัวชี้ในรายละเอียด

พอยน์เตอร์มีแนวคิดมากมาย แต่ใช้งานง่ายและมีความสำคัญต่อการเขียนโปรแกรม Go แนวคิดของพอยน์เตอร์ต่อไปนี้ควรชัดเจนสำหรับโปรแกรมเมอร์ Go -

ซีเนียร์ No แนวคิดและคำอธิบาย
1 ไป - อาร์เรย์ของพอยน์เตอร์

คุณสามารถกำหนดอาร์เรย์เพื่อเก็บพอยน์เตอร์ได้หลายตัว

2 ไป - ชี้ไปที่ตัวชี้

Go ช่วยให้คุณมีตัวชี้บนตัวชี้และอื่น ๆ

3 ส่งพอยน์เตอร์ไปยังฟังก์ชันใน Go

การส่งผ่านอาร์กิวเมนต์โดยการอ้างอิงหรือตามที่อยู่ทั้งสองทำให้อาร์กิวเมนต์ที่ส่งผ่านสามารถเปลี่ยนแปลงได้ในฟังก์ชันการเรียกโดยฟังก์ชันที่เรียกว่า