DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

Go: pointer to array index expressions

#go

วันนี้เพิ่งรู้ว่า 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)
}
Enter fullscreen mode Exit fullscreen mode

เมื่อสั่งรันก็จะได้ type ของ ptrToArr ออกมาแบบนี้

$ go run main.go
*[4]int
Enter fullscreen mode Exit fullscreen mode

ทีนี้ถ้าเราต้องการเข้าถึง element ของ arr ผ่าน ptrToArr แบบแรกถึงใช้ operator pointer indirect * เพื่อเข้าถึง arr ก่อนแล้วค่อยใช้ [] แบบนี้

fmt.Println((*ptrToArr)[0])
fmt.Println((*ptrToArr)[1])
fmt.Println((*ptrToArr)[2])
fmt.Println((*ptrToArr)[3])
Enter fullscreen mode Exit fullscreen mode

จะเห็นว่าเราต้องใช้ วงเล็บ ครอบ *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])
Enter fullscreen mode Exit fullscreen mode

และใช้กับ for range ได้เหมือนกับ array, slice ได้เช่นกัน

for _, v := range ptrToArr {
    fmt.Println(v)
}
Enter fullscreen mode Exit fullscreen mode

และแน่นอนว่ามันเข้าถึง element ของ array ที่มันชี้อยู่ ทำให้แก้ไขค่าของ index นั้นได้เช่นกัน

for i := range ptrToArr {
    ptrToArr[i] *= 2
}
for _, v := range arr {
    fmt.Println(v)
}
Enter fullscreen mode Exit fullscreen mode

เมื่อรันก็จะได้

$ go run main.go
2
4
6
8
Enter fullscreen mode Exit fullscreen mode

ขอฝาก Buy Me a Coffee

สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ

Buy Me A Coffee

ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth

ขอบคุณครับ 🙏

Top comments (0)