GO 語言中的物件導向

kuibatian發表於2020-03-05

GO語言中的物件導向

其實GO並不是一個純物件導向程式語言。它沒有提供類(class)這個關鍵字,只提供了結構體(struct)型別。

java或者C# 裡面,結構體(struct)是不能有成員函式的。然而,Go語言中的結構體(struct)可以有”成員函式”。方法可以被新增到結構體中,類似於一個類的實現。

我個人覺得Go 語言在的物件導向,其實更簡單,也更容易理解。

學過java或C# 的人應該都知道,物件導向的三個基本特徵:封裝、繼承和多型。他們的定義我這裡就不細說了。下面,就直接看看 go 語言下的物件導向是怎樣實現的吧。

1. 封裝特性

  Golang區分公有屬性和私有屬性的機制就是方法或屬性是否首字母大寫,如果首字母大寫的方法就是公有的,如果首字母小寫的話就是私有的。


package main

import "fmt" type Person struct {
    name string }

func (person *Person) setName(name string) {
    person.name = name
}

func (person *Person) GetInfo() {
    fmt.Println(person.name)
}

func main() {
    p := Person{"zhangsan"}
    p.setName("lisi")
    p.GetInfo()
}

2. 繼承特性

  GO語言的繼承方式採用的是匿名組合的方式:Woman 結構體中包含匿名欄位Person,那麼Person中的屬性也就屬於Woman物件。


package main

import "fmt" type Person struct {
    name string }

type Woman struct {
    Person
    sex string }

func main() {
    woman := Woman{Person{"wangwu"}, "女"}
    fmt.Println(woman.name)
    fmt.Println(woman.sex)
}

3. 多型特性


package main

import "fmt" type Eater interface {
    Eat()
}

type Man struct {
}

type Woman struct {
}

func (man *Man) Eat() {
    fmt.Println("Man Eat")
}

func (woman *Woman) Eat() {
    fmt.Println("Woman Eat")
}

func main() {
    var e Eater

    woman := Woman{}
    man := Man{}

    e = &woman
    e.Eat()

    e = &man
    e.Eat()
}

最後

以上,就把Go語言如何實現物件導向的簡單介紹了一下,其實跟java和C# 等也都差不多,大家可以比較著來看。總結的來說就是:Go沒有類,而是鬆耦合的型別、方法對介面的實現。

原文連結

本作品採用《CC 協議》,轉載必須註明作者和本文連結

每天5分鐘,與你一起蛻變!上海php自學中心,目前專注於php,python,golang~撒花!
S3d25uqwht.png!large
公眾號7Dn78VKKcW.jpg!large

相關文章