DEV Community

Pallat Anchaleechamaikorn
Pallat Anchaleechamaikorn

Posted on

Pointer ใน Go part 1

คิดว่าเรื่อง pointer ในภาษา Go นี่อาจจะมีหลายตอน ทั้งๆที่ตอนนี้ก็ไม่ได้มีอะไรในหัว แต่ก็ขอตั้งชื่อ part 1 เอาไว้ก่อน 😅

พอดีว่าไปเจอโค้ดนึง น่าสนใจที่จะเอามาอธิบาย

func NewPointerString(s string) *string {
    p := new(string)
    *p = s
    return p
}
Enter fullscreen mode Exit fullscreen mode

โค้ดนี้น่าสนใจตรงที่ ความเข้าใจของเราจะคิดว่า ถ้าไม่ new pointer ตัวใหม่ขึ้นมา แล้วมาเขียนแบบนี้

func NewPointerString(s string) *string {
    return &s
}
Enter fullscreen mode Exit fullscreen mode

มันจะทำให้เราได้ address ของ s ตัวเดิมออกไป ซึ่งจะกลายเป็นว่า ค่าที่ return ออกไปมันจะ refer กลับไปหา s ตัวเดียวกัน

แต่ความเป็นจริง เมื่อ s เข้ามาในฟังก์ชัน NewPointerString แล้ว มันจะเป็นการ copy ค่า string เข้ามาในฟังก์ชันนี้อยู่แล้ว และนั่นทำให้ s ในฟังก์ชันเป็นคนละตัวกันกับ string ที่ใส่เข้ามาอยู่แล้ว

ทำให้เราสามารถเขียนแค่

func NewPointerString(s string) *string {
    return &s
}
Enter fullscreen mode Exit fullscreen mode

ก็ได้เช่นกันก็จะทำให้ pointer ตัวที่ return ออกไป refer ไปที่ string คำเดียวกัน แต่เป็นคนละตัวกันแล้ว ลองพิสูจน์ด้วยการพิมพ์ค่า address มันออกมาดูได้ดังนี้

func main() {
    s := "Hi"
    p := NewPointerString(s)

    fmt.Println(p, &s)
}

func NewPointerString(s string) *string {
    return &s
}
Enter fullscreen mode Exit fullscreen mode

output:

0xc00009e220 0xc00009e210

นี่ก็คือผลลัพธ์ที่ได้ เป็นคนละ address กันแล้วครับ

Top comments (0)