{"slug": "ai-ekhiiyn-go-obraantl-d-jetbrains-elythmaa-ktikaakaarekhiiyn-go-smayaihm-aih", "title": "AI เขียน Go โบราณตลอด — JetBrains เลยทำ \"กติกาการเขียน Go สมัยใหม่\" ให้ agent แล้ว", "summary": "JetBrains has released go-modern-guidelines, a repository of 57 guidelines covering Go 1.0 through 1.27, designed to help AI coding agents write modern Go code. The project addresses the problem of AI models defaulting to outdated Go idioms due to training data lagging behind new language features. The guidelines are packaged as a plugin/skill for agents like Junie, Claude Code, Codex, and Cursor, and can be installed via skills.sh.", "body_md": "📅 เขียนเมื่อ: สิงหาคม 2026 | ครอบคลุม Go 1.0–1.27\n\n⚠️ ข้อมูลอัปเดต ณ วันที่เขียน — เวอร์ชัน/ฟีเจอร์อาจเปลี่ยนตามรอบ release ของ Go\n\nถ้าคุณเคยให้ AI coding agent เขียนโค้ด Go ให้ ลองสังเกตดูว่ามันเขียนออกมาเป็นยังไง ส่วนใหญ่แล้วมันจะเขียนแบบ \"รุ่นพ่อ\" ออกมา — ใช้ `if a > b { return a }`\n\nแทนที่จะใช้ `max(a, b)`\n\n, เขียน loop หา element ทีละตัวแทน `slices.Contains`\n\n, หรือประกาศตัวแปรชั่วคราวเพื่อเอา pointer แทนที่จะใช้ `new(...)`\n\nโค้ดแบบนี้รันได้นะ ไม่ผิดด้วย แต่มันไม่ใช่ Go แบบที่เราเขียนกันในปี 2026 แล้ว และนี่คือปัญหาที่ทีม JetBrains มองเห็น แล้วทำของชิ้นหนึ่งออกมาแก้ตรงจุด — ชื่อว่า **go-modern-guidelines**\n\nสาเหตุหลักมีสองอย่าง และมันซ้อนกันอยู่\n\n**อย่างแรก** โมเดลภาษาเรียนรู้จากโค้ดบนโลก ซึ่งส่วนใหญ่เขียนขึ้นมาในช่วงหลายปีที่ผ่านมา โค้ด Go เก่า ๆ ที่วนอยู่ใน internet มหาศาลล้วนเป็นสไตล์ \"ก่อนจะมีฟีเจอร์ใหม่\" ทั้งนั้น โมเดลเลยจับ pattern แบบเก่ามาเป็น default\n\n**อย่างที่สอง** Go ออกเวอร์ชันใหม่ทุก ๆ หกเดือน และแต่ละรอบก็มีของเล่นชิ้นเล็ก ๆ เข้ามาเรื่อย ๆ — `min`\n\n/`max`\n\nเข้ามาใน Go 1.21, `for i := range n`\n\nใน Go 1.22, `slices.Collect`\n\nใน 1.23, `t.Context()`\n\nใน 1.24, `errors.AsType`\n\nใน 1.26, และ `encoding/json/v2`\n\nใน 1.27 จังหวะมันไวกว่าที่โมเดลจะตามทัน\n\nผลลัพธ์คือ agent เขียนโค้ดที่ \"ถูกแต่เชย\" แล้วเราก็ต้องมาแก้ทีหลัง — ซึ่งก็คือสิ่งที่ Go team เองก็เห็นเหมือนกัน ถึงขั้นทำ analyzer ชื่อ `modernize`\n\nเอาไว้ auto-update โค้ดเก่าให้เป็น idiom ใหม่\n\nแทนที่จะรอให้โมเดลฉลาดขึ้นเอง ทีม JetBrains ทำสิ่งที่ตรงไปตรงมากว่ามาก คือเขียน**กติกา**ให้ agent อ่านแล้วทำตาม\n\n`go-modern-guidelines`\n\nเป็น repository ที่รวบรวม guideline 57 ข้อ ครอบคลุมตั้งแต่ Go 1.0 ยัน Go 1.27 แต่ละข้อประกอบด้วย \"เขียนแบบนี้ ไม่ใช่แบบนี้\" พร้อมโค้ดตัวอย่าง before/after ครบชุด แนวคิดง่าย ๆ คือให้ agent มี reference ที่ชัดเจนแทนที่จะเดาเอาเอง\n\nที่สำคัญคือมัน**ไม่ใช่แค่เอกสารอ่านเล่น** — ตัว guideline นี้ถูกแพ็กเป็น plugin/skill ให้ติดตั้งเข้าไปใน agent ได้ตรง ๆ รองรับทั้ง Junie, Claude Code, Codex, Cursor และ agent อื่น ๆ ผ่าน skills.sh พอติดตั้งแล้ว agent จะเรียกใช้ guideline นี้โดยอัตโนมัติตอนเจองานที่เกี่ยวกับ Go\n\nผมขอหยิบตัวอย่างที่เห็นแล้ว \"นี่แหละ ที่ agent มักพลาด\" มาให้ดูสักสองสามตัว\n\n`min`\n\n/ `max`\n\nแทนการเทียบเอง (Go 1.21)\n\n```\n// แบบเก่า\nif a > b {\n    return a\n}\nreturn b\n\n// แบบใหม่\nreturn max(a, b)\n```\n\n`slices.Contains`\n\nแทน loop หา (Go 1.21)\n\n```\n// แบบเก่า\nfound := false\nfor _, x := range items {\n    if x == target {\n        found = true\n        break\n    }\n}\n\n// แบบใหม่\nfound := slices.Contains(items, target)\n```\n\n`for i := range n`\n\nแทนการนับเอง (Go 1.22)\n\n```\n// แบบเก่า\nfor i := 0; i < n; i++ {\n    doSomething(i)\n}\n\n// แบบใหม่\nfor i := range n {\n    doSomething(i)\n}\n```\n\n`errors.AsType`\n\nแทน `errors.As`\n\nแบบเก่า (Go 1.26)\n\n``` js\n// แบบเก่า\nvar e *MyError\nif errors.As(err, &e) {\n    handle(e)\n}\n\n// แบบใหม่ — ได้ตัวแปรตรง ๆ ไม่ต้องประกาศไว้ก่อน\nif e, ok := errors.AsType[*MyError](err); ok {\n    handle(e)\n}\n```\n\nมีอีกเพียบ — `clear(m)`\n\nล้าง map, `maps.Clone`\n\n/`maps.Copy`\n\n, `slices.Sorted`\n\nเรียงจาก iterator, `sync.OnceValue`\n\nสำหรับ memoize, `context.AfterFunc`\n\nสำหรับ cleanup ตอน cancel ไปจนถึงของใหม่สุดอย่าง generic methods และ `encoding/json/v2`\n\nที่เพิ่งเข้าใน Go 1.27\n\nเริ่มใช้งานง่าย ๆ — ถ้าใช้ Claude Code ก็สั่งติดตั้ง marketplace แล้วให้มันโหลด skill นี้เข้าไปได้เลย (คำสั่งติดตั้งครบอยู่ใน README ของ repo) หรือถ้าใช้ agent ตัวอื่นที่รองรับ skills.sh ก็แค่รัน\n\n```\nnpx skills add JetBrains/go-modern-guidelines\n```\n\nแค่นี้ agent ของคุณก็จะรู้จัก idiom ใหม่ ๆ ของ Go แทนที่จะยึดติดกับสไตล์เก่า ๆ ที่มันจำมาจากโค้ดบน internet\n\nปัญหาที่ AI เขียน Go เชย ไม่ใช่เพราะโมเดลโง่ แต่เพราะข้อมูลเทรนเก่ากว่า release ล่าสุดของ Go ทางออกที่ JetBrains เสนอคือการยัด \"ความรู้\" เข้าไปใน context ของ agent ผ่าน guideline ที่ชัดเจน ซึ่งก็คือสิ่งที่ go-modern-guidelines ทำ — และมันไปทางเดียวกับ `modernize`\n\nanalyzer ของ Go team เป๊ะ\n\nสำหรับใครที่ปล่อยให้ AI เขียน Go บ่อย ๆ ผมว่านี่เป็น skill ที่คุ้มค่าติดไว้ ไม่ต่างจากใส่ style guide ให้ทีม dev เลย\n\n`modernize`\n\nanalyzer (เครื่องมือ auto-update โค้ด Go เก่าให้เป็น idiom ใหม่)", "url": "https://wpnews.pro/news/ai-ekhiiyn-go-obraantl-d-jetbrains-elythmaa-ktikaakaarekhiiyn-go-smayaihm-aih", "canonical_source": "https://dev.to/gophernment/ai-ekhiiyn-go-obraantld-jetbrains-elytham-ktikaakaarekhiiyn-go-smayaihm-aih-agent-aelw-2pid", "published_at": "2026-08-26 05:52:28+00:00", "updated_at": "2026-08-26 06:13:35.245607+00:00", "lang": "en", "topics": ["developer-tools", "large-language-models", "ai-agents"], "entities": ["JetBrains", "go-modern-guidelines", "Go", "Junie", "Claude Code", "Codex", "Cursor"], "alternates": {"html": "https://wpnews.pro/news/ai-ekhiiyn-go-obraantl-d-jetbrains-elythmaa-ktikaakaarekhiiyn-go-smayaihm-aih", "markdown": "https://wpnews.pro/news/ai-ekhiiyn-go-obraantl-d-jetbrains-elythmaa-ktikaakaarekhiiyn-go-smayaihm-aih.md", "text": "https://wpnews.pro/news/ai-ekhiiyn-go-obraantl-d-jetbrains-elythmaa-ktikaakaarekhiiyn-go-smayaihm-aih.txt", "jsonld": "https://wpnews.pro/news/ai-ekhiiyn-go-obraantl-d-jetbrains-elythmaa-ktikaakaarekhiiyn-go-smayaihm-aih.jsonld"}}