Go 1.11 มีอะไรใหม่ที่คนทำ MPA ควรรู้

Go 1.11 ใกล้ออกแล้ว เรามาดูกันว่ามี feature อะไรใหม่ ๆ หรืออะไรที่ break ของเก่าบ้าง


1. text/template

อันแรกสุดคงหนีไม่พ้น text/template ที่สามารถเปลี่ยนค่าตัวแปรใน template ได้แล้ว (ใช้กับ html/template) ได้เหมือนกัน

package main
import (
"fmt"
"html/template"
"os"
)
func main() {
t := template.Must(template.New("").Parse(`
{{ $name := "Guest" }}
{{ if .Me }}
{{ $name = .Me.Name }}
{{ end }}
<h1>Hello, {{ $name }}</h1>
`))
t.Execute(os.Stdout, map[string]interface{}{
"Me": map[string]interface{}{
"Name": "acoshift",
},
})
fmt.Println()
}

จาก code ด้านบนถ้าเรารันด้วย Go 1.10 เราจะได้

panic: template: :4: unexpected "=" in operand

แต่พอมารันด้วย Go 1.11 จะรันได้ไม่ error

<h1>Hello, acoshift</h1>

2. net/http

เราสามารถใช้ SameSite cookie ได้แล้ว จากปกติถ้าจะใช้ SameSite เราต้องเขียนเอง

type cookie struct {
http.Cookie
SameSite string
}
func setCookie(w http.ResponseWriter, c *cookie) {
if v := c.String(); v != "" {
if len(c.SameSite) > 0 {
v += "; SameSite=" + c.SameSite
}
w.Header().Add("Set-Cookie", v)
}
}

ตอนนี้เราสามารถใช้ http.SetCookie ได้เลย

http.SetCookie(w, &http.Cookie{
// ...
SameSite: http.SameSiteLaxMode,
})

3. FormFile จะไม่ส่ง input ไฟล์ที่ไม่ได้เลือกไฟล์มา

ลองดู code ข้างล่างนี้

package main
import (
"fmt"
"net/http"
)
func main() {
http.ListenAndServe(":8080", http.HandlerFunc(h))
}
func h(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
w.Write([]byte(`
<!doctype html>
<form method=POST enctype=multipart/form-data>
<input type=file name=f>
<button>Send</button>
</form>
`))
return
}
  _, fh, err := r.FormFile("f")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
fmt.Fprintf(w, "uploading... %d size", fh.Size)
}

ถ้าเราเปิดหน้าเว็บ แล้วกด submit เลยโดยที่ไม่เลือกไฟล์ บน Go 1.10 เราจะได้แบบนี้

uploading... 0 size

แต่พอมารัน code เดียวกันบน Go 1.11 จะได้แบบนี้แทน

http: no such file

จริง ๆ แล้วไม่ใช่ feature ใหม่อะไร แค่ทำให้ behavior กลับมาเป็นแบบ Go 1.9
ถ้าเราเอา code เดิมมารันด้วย Go 1.9 จะได้แบบนี้

http: no such file

เหมือนกับ Go 1.11

ตอน update จาก Go 1.9 มาเป็น Go 1.10 ก็พังไปหลายเว็บเหมือนกัน 😱


จริง ๆ มีอีกหลายอย่างเลยที่เราสามารถเอามาใช้ได้ แต่อาจจะไม่เกี่ยวกับ MPA เท่าไร 😅 ลองไปดูได้จาก release note ของ Go 1.11 ที่กำลัง draft อยู่ได้เลย~~~~