Variable scoping and shadowing in go

พอดีได้ยินชื่อ go-kit บ่อยๆ เลยไปเปิดดูของเขาหน่อย เผื่อจะมาทดลองใช้ แต่ทันที่ที่เปิดโค้ด ก็เกิดอาการตื่นตาตื่นใจขึ้นมา จนอดใจไม่ไหว ต้องเอามาเหลาให้สมาชิกที่ยังไม่เคยเห็น ได้ทดลองท่าใหม่ๆกันดูครับ

หากใครเคยเห็นหรือรู้จักอยู่แล้วก็ขออภัยที่เอามะพร้าวห้าวมาขายสวนด้วยนะครับ มาดูตัวอย่างโค้ดบางส่วนกันหน่อย

	// Logging domain.
	var logger log.Logger
	{
		logger = log.NewLogfmtLogger(os.Stderr)
		logger = log.With(logger, "ts", log.DefaultTimestampUTC)
		logger = log.With(logger, "caller", log.DefaultCaller)
	}

จากโค้ดนี้ สิ่งที่เห็นคือเจ้าวงเล็บปีกกาครอบโค้ดบางส่วนอยู่ แบบโล่งๆ พอดีว่าผมไม่เคยเห็นมาก่อน เลยไปหาข้อมูลเจอท่านผู้รู้ใน stack overflow มาอธิบายให้กระจ่าง (เค้าดูจากคำตอบที่มีเครื่องหมายถูกนะ)

ซึ่งสิ่งนี้ก็มีในภาษาอื่นๆเหมือนกันเช่นใน java, python หรือ Rust โดยหน้าที่ของมันก็ไม่มีอะไรมาก เพียงแค่สร้าง  scope ขึ้นมาใหม่เท่านั้น ลองวาร์ปไปที่ stack overflow ด้านบน เขามีตัวอย่างโค้ดให้ลองรันง่ายๆดูครับ