คำชี้มีประโยชน์ด้วยเหตุผลหลายประการ ตัวชี้ช่วยให้สามารถควบคุมเค้าโครงหน่วยความจำ (มีผลต่อประสิทธิภาพของแคช CPU) ใน Go เราสามารถกำหนดโครงสร้างที่สมาชิกทั้งหมดอยู่ในหน่วยความจำที่ต่อเนื่องกัน:
type Point struct {
x, y int
}
type LineSegment struct {
source, destination Point
}
ในกรณีนี้Point
โครงสร้างที่ฝังตัวอยู่ภายในLineSegment
struct แต่คุณไม่สามารถฝังข้อมูลโดยตรงได้เสมอไป หากคุณต้องการสนับสนุนโครงสร้างเช่นต้นไม้ไบนารีหรือรายการที่เชื่อมโยงคุณต้องสนับสนุนตัวชี้บางประเภท
type TreeNode {
value int
left *TreeNode
right *TreeNode
}
Java, Python และอื่น ๆ ไม่มีปัญหานี้เนื่องจากไม่อนุญาตให้คุณฝังประเภทคอมโพสิตดังนั้นจึงไม่จำเป็นต้องแยกความแตกต่างระหว่างการฝังและการชี้ทางไวยากรณ์
ปัญหาเกี่ยวกับโครงสร้าง Swift / C # แก้ไขได้ด้วยตัวชี้ Go
ทางเลือกอื่นที่เป็นไปได้ในการทำเช่นเดียวกันคือการแยกความแตกต่างระหว่างstruct
และclass
ตามที่ C # และ Swift ทำ แต่สิ่งนี้มีข้อ จำกัด ในขณะที่คุณสามารถระบุได้ว่าฟังก์ชันใช้โครงสร้างเป็นinout
พารามิเตอร์เพื่อหลีกเลี่ยงการคัดลอกโครงสร้าง แต่ก็ไม่อนุญาตให้คุณจัดเก็บการอ้างอิง (พอยน์เตอร์) ไปยังโครงสร้าง ซึ่งหมายความว่าคุณไม่สามารถถือว่าโครงสร้างเป็นประเภทอ้างอิงได้เมื่อคุณพบว่ามีประโยชน์เช่นการสร้างตัวจัดสรรพูล (ดูด้านล่าง)
Custom Memory Allocator
การใช้พอยน์เตอร์คุณยังสามารถสร้างตัวจัดสรรพูลของคุณเองได้ (ซึ่งง่ายมากด้วยการลบเช็คจำนวนมากเพื่อแสดงหลักการ):
type TreeNode {
value int
left *TreeNode
right *TreeNode
nextFreeNode *TreeNode;
}
var pool [1024]TreeNode
var firstFreeNode *TreeNode = &pool[0]
func poolAlloc() *TreeNode {
node := firstFreeNode
firstFreeNode = firstFreeNode.nextFreeNode
return node
}
func freeNode(node *TreeNode) {
node.nextFreeNode = firstFreeNode
firstFreeNode = node
}
สลับสองค่า
พอยน์เตอร์ยังช่วยให้คุณใช้งานswap
ได้ นั่นคือการแลกเปลี่ยนค่าของสองตัวแปร:
func swap(a *int, b *int) {
temp := *a
*a = *b
*b = temp
}
สรุป
Java ไม่สามารถแทนที่ C ++ ได้อย่างสมบูรณ์สำหรับการเขียนโปรแกรมระบบในที่ต่างๆเช่น Google ส่วนหนึ่งเป็นเพราะไม่สามารถปรับแต่งประสิทธิภาพให้เป็นส่วนขยายเดียวกันได้เนื่องจากขาดความสามารถในการควบคุมรูปแบบหน่วยความจำและการใช้งาน (การพลาดแคชจะส่งผลต่อประสิทธิภาพอย่างมาก) Go มีเป้าหมายที่จะแทนที่ C ++ ในหลาย ๆ ด้านดังนั้นจึงจำเป็นต้องสนับสนุนพอยน์เตอร์