AnyCompiler

Struct Embedding

Go mein class inheritance nahi hai. Iske bajaye, aap ek struct ko doosre ke andar embed karte hain uska type bina kisi field name ke list kar ke — outer type ko khud ba khud embedded type ke fields aur methods tak direct access mil jaata hai, ek pattern jise promotion kaha jaata hai.

package main

import "fmt"

type Animal struct {
	Name string
}

func (a Animal) Describe() string {
	return a.Name + " is an animal"
}

type Dog struct {
	Animal
	Breed string
}

func main() {
	d := Dog{Animal: Animal{Name: "Rex"}, Breed: "Labrador"}
	fmt.Println(d.Name)
	fmt.Println(d.Describe())
}
Output
Rex
Rex is an animal

Ek promoted method ko override karna

Upar d.Name aur d.Describe() embedded Animal se seedhe promote hote hain, bina kisi extra code ki zaroorat ke. Ek type apna khud ka method bhi same naam se define kar sakta hai taake woh embedded wale se precedence le le, phir bhi explicitly usko call karte hue, jaise neeche Derived.Label karta hai.

package main

import "fmt"

type Base struct {
	ID int
}

func (b Base) Label() string {
	return fmt.Sprintf("Base#%d", b.ID)
}

type Derived struct {
	Base
	Name string
}

func (d Derived) Label() string {
	return fmt.Sprintf("%s (%s)", d.Base.Label(), d.Name)
}

func main() {
	d := Derived{Base: Base{ID: 7}, Name: "widget"}
	fmt.Println(d.Label())
}
Output
Base#7 (widget)

Aage: standard library — kuch aam istemal hone wale packages, aur ek closing look ke Go ki standard library aur kya provide karti hai.

Practice exercise

Ek struct Vehicle define karein jiska field Wheels int ho. Ek struct Car define karein jo Vehicle ko embed kare aur ek field Brand string add kare. Wheels 4 aur Brand "Toyota" wali ek Car banayein, phir car.Wheels aur car.Brand print karein.