Pointer berguna karena beberapa alasan. Pointer memungkinkan kontrol atas tata letak memori (memengaruhi efisiensi cache CPU). Di Go kita dapat mendefinisikan struktur di mana semua anggota berada dalam memori yang berdekatan:
type Point struct {
x, y int
}
type LineSegment struct {
source, destination Point
}
Dalam hal ini Point
struktur disematkan di dalam LineSegment
struct. Tetapi Anda tidak selalu dapat menyematkan data secara langsung. Jika Anda ingin mendukung struktur seperti pohon biner atau daftar tertaut, Anda perlu mendukung beberapa jenis penunjuk.
type TreeNode {
value int
left *TreeNode
right *TreeNode
}
Java, Python, dll. Tidak memiliki masalah ini karena tidak memungkinkan Anda untuk menyematkan tipe komposit, jadi tidak perlu membedakan secara sintaks antara penyematan dan penunjuk.
Masalah dengan struktur Swift / C # diselesaikan dengan petunjuk Go
Alternatif yang mungkin untuk mencapai hal yang sama adalah dengan membedakan antara struct
dan class
seperti yang dilakukan C # dan Swift. Tetapi ini memang memiliki batasan. Meskipun Anda biasanya dapat menentukan bahwa suatu fungsi menggunakan struct sebagai inout
parameter untuk menghindari penyalinan struct, fungsi tersebut tidak memungkinkan Anda untuk menyimpan referensi (pointer) ke struct. Ini berarti Anda tidak akan pernah bisa memperlakukan struct sebagai tipe referensi ketika Anda merasa berguna misalnya untuk membuat pengalokasi kumpulan (lihat di bawah).
Alokasi Memori Kustom
Dengan menggunakan pointer, Anda juga dapat membuat pengalokasi pool Anda sendiri (ini sangat disederhanakan dengan banyak pengecekan dihapus untuk hanya menunjukkan prinsip):
type TreeNode {
value int
left *TreeNode
right *TreeNode
nextFreeNode *TreeNode; // For memory allocation
}
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
}
Tukar dua nilai
Pointer juga memungkinkan Anda untuk mengimplementasikan swap
. Itu menukar nilai dari dua variabel:
func swap(a *int, b *int) {
temp := *a
*a = *b
*b = temp
}
Kesimpulan
Java tidak pernah dapat sepenuhnya menggantikan C ++ untuk pemrograman sistem di tempat-tempat seperti Google, sebagian karena kinerja tidak dapat disetel ke tingkat yang sama karena kurangnya kemampuan untuk mengontrol tata letak dan penggunaan memori (cache miss mempengaruhi kinerja secara signifikan). Go bertujuan untuk menggantikan C ++ di banyak area dan karenanya perlu mendukung petunjuk.