วันนี้เพิ่งรู้ว่า pointer to array ก็สามารถใช้ index expressions เพื่อเข้าถึง element ของ array ที่ pointer นั้นชี้อยู่ได้
เอาจริงๆก็ไม่ค่อยได้ใช้งาน array ตรงๆอยู่แล้ว เรามักจะใช้ slice แล้วค่อยใช้ฟังก์ชันอย่าง make, append ในการจัดการ underlying array ให้เราเอง แต่ก็รู้ไว้สักหน่อยก็ไม่เป็นไร :D
ตัวอย่าง pointer to array เช่น
package main
import (
"fmt"
)
func main() {
arr := [4]int{1, 2, 3, 4}
ptrToArr := &arr
fmt.Printf("%T\n", ptrToArr)
}
เมื่อสั่งรันก็จะได้ type ของ ptrToArr ออกมาแบบนี้
$ go run main.go
*[4]int
ทีนี้ถ้าเราต้องการเข้าถึง element ของ arr
ผ่าน ptrToArr
แบบแรกถึงใช้ operator pointer indirect *
เพื่อเข้าถึง arr
ก่อนแล้วค่อยใช้ []
แบบนี้
fmt.Println((*ptrToArr)[0])
fmt.Println((*ptrToArr)[1])
fmt.Println((*ptrToArr)[2])
fmt.Println((*ptrToArr)[3])
จะเห็นว่าเราต้องใช้ วงเล็บ ครอบ *ptrToArr
ไม่งั้นมันจะถูกตีความเป็น (ptrToArr[0]) ซึ่งจะ compile ไม่ผ่านเพราะเหมือนไปใช้ `` กับค่าที่เก็บใน element ที่ 0 ซึ่งไม่ใช้ pointer
ท่าต่อไปคือ Go สำหรับ pointer to array Go ยอมให้ใช้ indexing expressions ได้เลยไม่ต้องใช้ pointer indirect *
ก่อน ดังนั้นจากตัวอย่างเมื่อกี้เราเลยเขียนให้เหลือแค่นี้ได้
fmt.Println(ptrToArr[0])
fmt.Println(ptrToArr[1])
fmt.Println(ptrToArr[2])
fmt.Println(ptrToArr[3])
และใช้กับ for range ได้เหมือนกับ array, slice ได้เช่นกัน
for _, v := range ptrToArr {
fmt.Println(v)
}
และแน่นอนว่ามันเข้าถึง element ของ array ที่มันชี้อยู่ ทำให้แก้ไขค่าของ index นั้นได้เช่นกัน
for i := range ptrToArr {
ptrToArr[i] *= 2
}
for _, v := range arr {
fmt.Println(v)
}
เมื่อรันก็จะได้
$ go run main.go
2
4
6
8
ขอฝาก Buy Me a Coffee
สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ
ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth
ขอบคุณครับ 🙏
Top comments (0)