DEV Community

Weerasak Chongnguluam
Weerasak Chongnguluam

Posted on

1

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

ขอบคุณครับ 🙏

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)