Nilai vs Referensi
Pelajaran 7 dari 19 dalam kursus Fungsi dan Pointer di Golang di Coddy.
Sampai sejauh ini, kita telah mempelajari cara menggunakan parameter dan nilai yang dikembalikan dari fungsi. Dalam pelajaran ini, kita akan menjelaskan konsep penting lainnya yang perlu kita pahami saat bekerja dengan fungsi.
Mari kita lihat program seperti ini:
func main() {
a := 5
fmt.Println("value of a:", a)
sum(a)
fmt.Println("value of a after addition:", a)
}
func sum(x int) {
x = x + x
}Dalam program ini, kita mendeklarasikan variabel a, mencetak nilainya, lalu meneruskannya ke fungsi bernama sum. Fungsi ini melakukan penjumlahan 5 + 5. Menurutmu, apa hasil dari kode ini?
Mari jalankan dan lihat:
value of a: 5
value of a after addition: 5Tidak ada perubahan. Ada masalah di sini, a seharusnya bernilai 10 setelah memanggil fungsi sum, bukan?
Ternyata tidak, karena di Go, saat kita meneruskan nilai ke fungsi, kita hanya menyalinnya. Saat kita mengubah nilai tersebut, perubahan itu tidak terlihat di luar fungsi. Nilainya hanya berubah di dalam fungsi. Kita bisa melihatnya jika mencetak nilai di dalam fungsi sum:
func main() {
a := 5
fmt.Println("value of a:", a)
sum(a)
fmt.Println("value of a after addition:", a)
}
func sum(x int) {
x = x + x
fmt.Println("value inside the function:", x)
}Jika kita menjalankan ini, hasilnya:
value of a: 5
value inside the function: 10
value of a after addition: 5Artinya, nilai berubah di dalam fungsi (cakupan fungsi), tetapi di luar fungsi, nilainya tidak berubah.
Sepertinya kamu memerlukan penjelasan lebih lanjut untuk memahami ini. Mari periksa diagram berikut:
Sekarang kamu mengerti. Ini membuat variabel baru dengan alamat yang berbeda (yang juga tidak baik untuk memori !).
Inilah sebabnya kita tidak melihat perubahan, karena variabelnya berbeda😅.
Untuk mengatasi masalah ini, kita bisa menggunakan pointer alih-alih salinan nilai, seperti ini:
func main() {
a := 5
fmt.Println("value of a:", a)
sum(&a)
fmt.Println("value of a after addition:", a)
}
func sum(x *int) {
*x += *x
}Sekarang, alih-alih nilainya, kita meneruskan alamat memori sum(&a). Artinya, fungsi akan bekerja dengan variabel yang sama dan tidak membuat variabel baru.
Tantangan
MudahDalam kode yang diberikan, kita mendefinisikan fungsi yang menukar dua nilai. Lengkapi kode agar fungsi tersebut berfungsi dan mencapai hasil yang diinginkan.
Coba sendiri
package main
import "fmt"
func swapValues(a, b int) {
a, b = b, a
}
func main() {
var x, y int = 4,10
fmt.Println("Before swap:")
fmt.Println("x =", x)
fmt.Println("y =", y)
swapValues(x, y)
fmt.Println("After swap:")
fmt.Println("x =", x)
fmt.Println("y =", y)
}
Semua pelajaran di Fungsi dan Pointer di Golang
1Pengantar
Pengantar4Bangun Kembali Fungsi string Go
String di GolangFungsi JoinFungsi ContainsFungsi IndexTantangan Rekap #1Latihan sendiri: Compiler Go online