Бүтцийн талбарууд нь ихэвчлэн ”юмтай байх”, “агуулагдах”, “харяалагдах” хамаарлыг илэрхийлдэг. Жишээлбэл дараах Person
төрөл Name
талбартай байна. Эндээс “хүн бол нэртэй” гэсэн холбоос харагдаж байна.
type Person struct {
Name string
}
Харин методууд нь тухайн төрлийн “чадвар”, “зан байдлыг” илэрхийлдэг. Жишээлбэл Person
төрөлд Talk()
функц нэмэе. Эндээс “хүн ярьж чаддаг” гэсэн чадвар харагдах болно.
type Person struct {
func (p *Person) Talk() {
fmt.Println("Сайна уу, Миний нэр ", p.Name)
}
}
Дээрх төрлөөс Android
нэртэй шинэ төрөл үүсгэе. Ингэхдээ шинэ Android
төрөл нь Person
-д байгаа бүх шинжийг авахыг хүсвэл яах вэ? Үүнийг “Android бол Person” хэлбэрийн хамаарал гэж хэлж болно, ө.х Person
-д байдаг шинжүүд (талбарууд) болон чадваруудыг (метод) бүгдийг нь Android
агуулна гэсэн үг.
Ийм маягийн хамаарлыг бусад програмчлалын хэлэнд удамших, өвлөх, өргөтгөх гэх мэтээр нэрлэдэг. Go хэлэнд эмбеддэд төрөл гэж нэрлэдэг бөгөөд дараах байдлаар бичдэг:
type Android struct {
Person // embedding буюу Person төрлийн шинжүүдийг агуулж байна
model string // шинэ гишүүн
}
Энд Person
төрлийн урд обект байхгүй бичигдсэнийг анзаараарай. Энэ тодорхойлолт нь шинээр үүсэж байгаа Android
төрөл нь Person
төрлийн бүх шинж, чадварыг агуулна гэдгийг илэрхийлнэ.
Ингээд хэрэв Android
бол Person
гэдэг нь үнэн бол Android
төрлийн обект мөн “ярьж чадах” ёстой:
a := new(Android)
a.Talk()
Android
төрөлд model
нэртэй нэг шинэ талбар нэмэгдсэн байгааг анзаараарай. Эндээс “Android бол Person” гэдэг нь үнэн, харин Person нь Android-с өөр болж байна.