>  기사  >  백엔드 개발  >  golang에서 상속하는 방법

golang에서 상속하는 방법

王林
王林원래의
2023-05-22 15:25:07867검색

Go 언어에는 전통적인 객체 지향 언어에서 정의된 "클래스"가 없으므로 소위 "상속"도 없습니다. 그러나 Go 언어는 Embedding이라는 구성을 통해 유사한 상속을 달성하는 방법을 제공합니다.

임베딩을 사용하면 유형을 다른 유형에 포함할 수 있으므로 포함된 유형은 인터페이스나 다른 수단을 통해 액세스할 필요 없이 포함된 유형의 속성 및 메서드에 직접 액세스할 수 있습니다. 이 프로세스는 기존의 "상속"과 유사하지만 더 유연합니다.

아래에서는 몇 가지 예를 사용하여 상속과 유사한 기능을 달성하기 위해 임베딩을 사용하는 방법을 보여줍니다.

  1. 기본 예

먼저 개, 고양이, 사람 등 몇 가지 기본 구조를 정의합니다.

type Dog struct {
    name string
}

func (d Dog) Bark() {
    fmt.Println(d.name, ": 汪汪汪!")
}

type Cat struct {
    name string
}

func (c Cat) Mew() {
    fmt.Println(c.name, ": 喵喵喵!")
}

type Person struct {
    name string
}

func (p Person) Speak() {
    fmt.Println(p.name, ": 你好!")
}

이제 개와 고양이를 "상속"할 수 있고 자체 속성과 색상 및 실행 속도와 같은 방법. 다음과 같이 정의할 수 있습니다.

type Animal struct {
    Dog
    Cat
    color       string
    runSpeed    int
}

func (a Animal) Run() {
    fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!")
}

이 정의에서 Animal 유형에는 Dog 및 Cat 유형이 포함됩니다. 즉, Animal 유형으로 인스턴스화된 개체는 Dog 및 Cat 유형의 속성과 메서드에 직접 액세스할 수 있습니다. 또한 color 및 runSpeed와 같은 Animal 유형에 대한 자체 속성과 메서드를 정의하여 동물의 색상과 달리기 속도를 나타내고, Run 메서드를 정의하여 동물의 달리기 동작을 설명할 수 있습니다.

이제 Animal 개체를 만들고 어떻게 작동하는지 살펴보겠습니다.

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    a.Bark()    // 小黑 : 汪汪汪!
    a.Mew()     // 小白 : 喵喵喵!
    a.Run()     // 黑白相间 的动物以 50 km/h的速度奔跑!
}

Dog 및 Cat 유형을 포함하면 Animal 개체가 인터페이스나 다른 수단을 사용하지 않고 Bark 및 Mew 메서드를 직접 호출할 수 있음을 알 수 있습니다. 이 접근 방식을 사용하면 전통적인 의미의 "상속"을 사용하지 않고도 유사한 기능을 달성할 수 있습니다.

  1. 사용자 정의 유형 포함

사용자 정의 유형을 다른 사용자 정의 유형에 포함하여 상속과 유사한 효과를 얻을 수 있습니다. 이제 Person 유형과 Student 유형을 정의하고 Person 유형을 Student 유형에 포함해 보겠습니다.

type Person struct {
    name string
    age  int
    sex  string
}

type Student struct {
    Person
    class string
    score float64
}

이 정의에서 Student 유형은 Person 유형을 포함합니다. Student 유형 개체를 인스턴스화할 때 Person의 속성과 메서드를 사용할 수 있습니다. 예를 들어, 학생 개체를 인스턴스화하고 이름, 나이, 성별, 학급 및 성적을 설정할 수 있습니다.

func main() {
    s := Student{
        Person: Person{
            name: "小明",
            age:  18,
            sex:  "男",
        },
        class: "高三一班",
        score: 92.5,
    }
    fmt.Println("姓名:", s.name)
    fmt.Println("年龄:", s.age)
    fmt.Println("性别:", s.sex)
    fmt.Println("班级:", s.class)
    fmt.Println("成绩:", s.score)
}

이 프로그램을 실행하면 다음과 같은 출력을 볼 수 있습니다.

姓名: 小明
年龄: 18
性别: 男
班级: 高三一班
成绩: 92.5

학생 개체가 다음을 수행할 수 있음을 알 수 있습니다. 이름, 나이, 성별 등의 속성을 포함하여 Person 유형 객체의 속성과 메서드에 직접 액세스합니다.

  1. 중첩 임베딩

한 유형 내에 여러 유형을 중첩하는 것도 가능합니다. 더 많은 기능을 달성하기 위해 Animal 유형을 다른 유형에 포함할 수 있습니다. 예를 들어 이제 Zoo 유형을 정의해 보겠습니다.

type Zoo struct {
    Animal
    name    string
    address string
}

func (z Zoo) ShowInfo() {
    fmt.Println("这是", z.name, ", 地址是", z.address)
    z.Run()
}

이 유형의 정의에서는 Animal 유형을 Zoo 유형에 포함합니다. 이러한 방식으로 Zoo 유형은 Run 메서드를 포함하여 Animal 유형의 속성과 메서드에 직접 액세스할 수 있습니다. 동물원의 이름과 주소를 출력하는 또 다른 ShowInfo 메서드를 정의하고, 동물이 달리는 모습을 표시하기 위해 Animal 유형의 Run 메서드를 호출합니다.

이제 Zoo 개체를 생성하고 해당 메서드를 테스트합니다.

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"}
    z.ShowInfo()
}

이 프로그램을 실행하면 다음과 같은 출력을 볼 수 있습니다.

这是 北京动物园 , 地址是 北京市海淀区清华科技园路
黑白相间 的动物以 50 km/h的速度奔跑!

Animal 유형을 Zoo 유형에 중첩하면 다음을 수행할 수 있습니다. 동물원의 정보와 동물의 달리는 행동을 표시할 수 있는 더 많은 기능을 갖춘 유형을 만듭니다.

요약

Go 언어에는 전통적인 객체지향 언어에서 정의한 클래스와 상속 개념이 없지만, 임베딩 개념을 사용하면 전통적인 상속 방식을 사용하지 않고도 유사한 기능을 구현할 수 있어 더욱 유연하고 편리해졌습니다. 위의 예를 통해 임베딩을 사용하면 하위 유형을 포함하는 유형을 쉽게 만들고 해당 메서드와 속성을 편리하게 호출할 수 있음을 알 수 있습니다.

위 내용은 golang에서 상속하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.