Featured image of post มาลองทำ go dynamic code (Go Interpreter) ด้วย Yaegi กัน

มาลองทำ go dynamic code (Go Interpreter) ด้วย Yaegi กัน

Go Interpreter by using Yaegi

Yaegi คืออะไร

โดยทั่วไปแล้ว golang เป็น compiled-language (ต้องมีการคอมไพล์โปรแกรมก่อนถึงจะสามารถใช้งานได้) ในบางสถานการณ์เราต้องการทำให้ code ของเราสามารถใช้งานในรูปแบบที่มันยืดหยุ่นได้ ยกตัวอย่าง เช่น เขียนระบบให้ user สามารถออกแบบหรือแก้ไขการทำงานของโค๊ดบางส่วนได้เองโดยไม่ต้องคอมไพล์โปรแกรมใหม่ทุกครั้ง สิ่งนี้จึงทำให้เกิดโปรเจ็กต์ yaegi ขึ้น (ดูแลโดยทีมงานของ Containous (traefik)) โดยตัว yaegi เองนี้ สามารถทำการรับ script golang ที่เป็น string เข้ามาและทำการสั่งรัน เพื่อรับค่าผลลัพธ์ได้ อีกทั้งยังสามารถใช้งาน import ใน script นั้นๆ ได้อีกด้วย

การใช้งาน Yaegi

ตัวอย่างการใช้งาน yaegi เบื้องต้น ตัวอย่างเป็นการทดลอง สร้าง package foo ที่มี function bar รับค่า input เป็น string และคืนค่า output เป็น string

  1. ทำการเรียก code script ที่ต้องการโดยใช้ i.Eval(src)
  2. ใช้ v, err := i.Eval(“foo.Bar”) เพื่อสร้างตัวแปรสำหรับรับข้อมูลที่ได้จาก interpreter context จากข้อที่ 1
  3. ทำการแปลง type assertion ให้ v โดยให้ตรงกับ type function ที่เราต้องการ ทีเราต้องการคือ func(string) string แลละเก็บค่าไว้ใน bar
  4. เพียงเท่านี้ เราก็จะได้ func bar(string) string แบบที่เราต้องการและสามารถทำการเรียกใช้ได้ด้วยโดยใช้ bar(“Kung”)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    package main
    import "github.com/traefik/yaegi/interp"


    const src = `package foo
    func Bar(s string) string { return s + "-Foo" }`

    func main() {
        
        i := interp.New(interp.Options{})
        
        _, err := i.Eval(src)
        if err != nil {
            panic(err)
        }
        
        v, err := i.Eval("foo.Bar")
        if err != nil {
            panic(err)
        }

        bar := v.Interface().(func(string) string)

        r := bar("Kung")
        println(r)
    }

ไอเดียในการนำ yaegi ไปใช้งาน

ที่เห็นได้ชัดจะเป็นการนำมาใช้สำหรับการทำ custom plugin for api gateway ต่างๆ ที่ทำให้เราสามารถเขียน plugin ด้วย golang ที่ยืดหยุ่นมากๆ และนำสคริปที่เขียนไปใช้งานได้เลย

Yaegi repository : https://github.com/traefik/yaegi

อย่าลืมให้กำลังใจสล็อตด้วยการกดไลค์ กดแชร์บทความ กดติดตามเพจ Sloth Coding ด้วยนะฮะ ขอบคุณฮะ ;)
Licensed under CC BY-NC-SA 4.0