Go言語の構造体では 継承を行うことができません. 委譲は使うことができます:

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func (p *Person) Walk() {
	fmt.Println("Walking ...")
}

type Programmer struct {
	Age    int // 何年プログラマとしてやってきたか
	Person Person
}

func (p *Programmer) Program() {
	fmt.Println("Programming ...")
}

func main() {
	p := Programmer{8, Person{"yassu", 27}}

	fmt.Println(p.Person.Name) // => yassu
	fmt.Println(p.Person.Age)  // => 27
	fmt.Println(p.Age)         // => 8

	p.Program()     // => Programming ...
	p.Person.Walk() // => Walking ...
}

構造体のフィールド名は省略することができます. そうした場合, クラス名.委譲元クラス名.フィールド名ではなくクラス名.フィールド名でフィールドの値を取得することができます.

フィールドの名前が委譲元のクラスと委譲先のクラスで被った場合, 委譲先のクラスが使われますが, 明示的にクラス名を指定してフィールドの値を指定することもできます:

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func (p *Person) Walk() {
	fmt.Println("Walking ...")
}

type Programmer struct {
	Age int // 何年プログラマとしてやってきたか
	Person
}

func (p *Programmer) Program() {
	fmt.Println("Programming ...")
}

func main() {
	p := Programmer{8, Person{"yassu", 27}}

	fmt.Println(p.Name)       // => yassu
	fmt.Println(p.Person.Age) // => 27
	fmt.Println(p.Age)        // => 8

	p.Program()     // => Programming ...
	p.Walk()        // => Walking ...
	p.Person.Walk() // => Walking ...
}