type alias

go version 1.9 ออกมาหลายวันละ นับตั้งแต่วันที่ release ก็เข้าไปอ่านเจอบรรทัดแรกๆเลยที่กล่าวถึง type alias
ผมบอกเลยว่า `อะไรวะ` แต่ก็เก็บความสงสัยไว้เงียบๆ กะว่าเดี๋ยวต้องมีใครมาอธิบายแน่ๆ ว่าแต่เขาไปอธิบายกันตรงไหนนะ ไม่มาบอกกันมั่งเลย
วันนี้ผมก็เลยไปลองอ่าน proposal เรื่องนี้ อ่านๆไป บอกตรงๆอีกที ก็ยังนึกไม่ค่อยจะออกว่าจะเอาไปใช้ตรงไหน ต้องขอโทษคนที่เข้ามาอ่านด้วยนะครับ พอดีผมไม่ค่อยฉลาด เน้นถึก เลยจะมาเล่าแค่เท่าที่พอจะอ่านเจอว่ามันมีดียังไงก็แล้วกันนะครับ

ก่อนอื่น ให้ทำการทดลองตาม proposal ดูตามนี้ก่อน

package main

import "fmt"

func main() {
type Name1 map[string]string
type Name2 map[string]string
type Alias = map[string]string

	name1 :=Name1{
		"a":"A",
	}

	name2 :=Name2{
		"a":"Z",
	}

	alias :=Alias{
		"a":"G",
	}

	fmt.Println(name1)
	fmt.Println(name2)
	fmt.Println(alias)
	
	alias = name1
	fmt.Println(alias)
}

โค้ดด้านบนนี้รันได้ครับ ทีนี้ ให้ทดลองเปลี่ยนบรรทัดที่ 26 เป็นแบบนี้ดู

name2 = name1

ถ้า editor ฉลาดหน่อย จะเห็นมันแดงๆแล้ว ใช่ไหม แต่ถ้าใครไม่เห็นก็ลองไปรันให้มันด่าเล่นๆดูที

/proposal.go:26:8: cannot use name1 (type Name1) as type Name2 in assignment

ซึ่งเราก็รู้ๆกันอยู่ เพราะว่า name1 กับ name2 มันไม่ใช่ type เดียวกัน ทั้งๆที่ต้นกำเนิดมันมาจาก type ชนิดเดียวกัน แต่ type alias ทำได้ โดยเขาให้เหตุผลว่า type ที่เป็น alias นั้น ก็แค่เรียกชื่อไม่เหมือนกัน แต่ถือเป็น type เดียวกัน ยิ่งไปกว่านั้น ไม่ว่าจะเอาไปใช้ท่าไหน เช่น  pointer หรือ chan หรือใช้เป็น argument ทุกกระบวนท่าได้หมด

เรามาลองอีกสักท่า

package main

import (
	"fmt"
)

type Structx struct {
	Name string
	Age int
}

func (s *Structx) String() string {
	return s.Name
}

type Sx = struct {
	Name string
	Age int
}


func main() {
	s := Sx{
		Name:"pallat",
		Age:21,
	}

	fmt.Println(X(s))

}

func X(m Structx) string {
	return m.String()
}

จะพบว่า Sx เป็น alias ของ struct ที่มีหน้าตาเหมือน StructX และ alias ทำ method ไม่ได้ แต่พอใส่เข้าไปในฟังก์ชั่น X ซึ่งรับ argument เป็น StructX ที่มี method String() อยู่
มันก็เรียกใช้ String() ได้เหมือน StructX เลย

มาเหลาแค่นี้ละกันครับ เพราะว่าอ่านมาแค่นี้ ไว้ลองใช้แล้วรู้มากกว่านี้จะมาเหลาใหม่ครับ