คิดว่าเรื่อง pointer ในภาษา Go นี่อาจจะมีหลายตอน ทั้งๆที่ตอนนี้ก็ไม่ได้มีอะไรในหัว แต่ก็ขอตั้งชื่อ part 1 เอาไว้ก่อน 😅
พอดีว่าไปเจอโค้ดนึง น่าสนใจที่จะเอามาอธิบาย
func NewPointerString(s string) *string {
p := new(string)
*p = s
return p
}
โค้ดนี้น่าสนใจตรงที่ ความเข้าใจของเราจะคิดว่า ถ้าไม่ new pointer ตัวใหม่ขึ้นมา แล้วมาเขียนแบบนี้
func NewPointerString(s string) *string {
return &s
}
มันจะทำให้เราได้ address ของ s ตัวเดิมออกไป ซึ่งจะกลายเป็นว่า ค่าที่ return ออกไปมันจะ refer กลับไปหา s ตัวเดียวกัน
แต่ความเป็นจริง เมื่อ s เข้ามาในฟังก์ชัน NewPointerString
แล้ว มันจะเป็นการ copy ค่า string เข้ามาในฟังก์ชันนี้อยู่แล้ว และนั่นทำให้ s ในฟังก์ชันเป็นคนละตัวกันกับ string ที่ใส่เข้ามาอยู่แล้ว
ทำให้เราสามารถเขียนแค่
func NewPointerString(s string) *string {
return &s
}
ก็ได้เช่นกันก็จะทำให้ pointer ตัวที่ return ออกไป refer ไปที่ string คำเดียวกัน แต่เป็นคนละตัวกันแล้ว ลองพิสูจน์ด้วยการพิมพ์ค่า address มันออกมาดูได้ดังนี้
func main() {
s := "Hi"
p := NewPointerString(s)
fmt.Println(p, &s)
}
func NewPointerString(s string) *string {
return &s
}
output:
0xc00009e220 0xc00009e210
นี่ก็คือผลลัพธ์ที่ได้ เป็นคนละ address กันแล้วครับ
Top comments (0)