มีคำถามในกลุ่ม facebook Golang Thailand ว่า
ซึ่งสำหรับข้อแรกนั้นเราใช้ reflect package ช่วยได้
ซึ่งโค้ดที่ได้เป็นแบบนี้
package main
import (
"fmt"
"reflect"
)
func SetToNil(a interface{}) {
v := reflect.ValueOf(a).Elem()
v.Set(reflect.Zero(v.Type()))
}
func main() {
n := 10
a := &n
fmt.Println(a)
SetToNil(&a)
fmt.Println(a)
s := "Hello"
ss := &s
fmt.Println(ss)
SetToNil(&ss)
fmt.Println(ss)
}
เราประกาศ parameter เป็น interface{}
ซึ่งแน่นอนว่าจะส่งค่าอะไรมาก็ได้ แต่อย่างไรก็ตาม ถ้าเรายังต้องการแก้ไขค่าของตัวแปรที่ส่งมา ยังไงตอนเรียกใช้ก็ต้องส่ง address ของตัวแปรที่ส่งมา คือ pointer นั่นเองเช่นผมเรียก SetToNil(&a)
ถึงทำงานได้ ถ้าส่งแค่ SetToNil(a)
จะทำให้แก้ไขค่าของตัวแปร a
ไม่ได้แน่นอนเพราะไม่รู้ address
ส่วนกลไกของ reflect ที่ใช้คือเราใช้ reflect.ValueOf
function ในการแปลงค่าเป็น reflect.Value
แล้วจึงเรียก method Elem()
เพราะ a
เป็น addressable (pointer) value ทำให้ Elem คือการอ้างถึง address ที่โดนชี้อยู่ด้วย pointer a (เหมือนเราใช้ operator *a
แบบนี้)
จากนั้นจึงใช้ method Set
เพื่อเซตค่าใหม่ ส่วน Zero value เราได้มาโดยใช้ฟังก์ชัน reflect.Zero
แล้วจึงส่งค่า type ให้โดยใช้ type ของ v
โดยใช้ method v.Type()
นั่นเอง
ขอฝาก Buy Me a Coffee
สำหรับท่านใดที่อ่านแล้วชอบโพสต์ต่างๆของผมที่นี่ ต้องการสนับสนุนค่ากาแฟเล็กๆน้อยๆ สามารถสนับสนุนผมได้ผ่านทาง Buy Me a Coffee คลิ๊กที่รูปด้านล่างนี้ได้เลยครับ
ส่วนท่านใดไม่สะดวกใช้บัตรเครดิต หรือ Paypal สามารถสนับสนุนผมได้ผ่านทาง PromptPay โดยดู QR Code ได้จากโพสต์ที่พินเอาไว้ได้ที่ Page DevDose ครับ https://web.facebook.com/devdoseth
ขอบคุณครับ 🙏
Top comments (0)