GO語言面向對象


當初開發go語言的時候就是因為C++的特性太過於繁雜,從而使得很多C++的開發者因為C++的特性而頭疼,go語言成功的精簡了C++的特性,使其很簡潔,很少的特性,卻可以完成很多的事情。

go語言中並沒有像C++,Java語言中這類的Class,它只含有像C語言中的結構體,用結構體和指針等特性,完成一個類的作用,很巧妙的使用了指針和結構體,不僅是go的面向對象,包括go語言中的map等操作都是借助了結構體。其實,說白了,C++、Java等面向對象的語言中,類的底層實現就是結構體,對象的引用就是指針,只是語言把他們封裝起來了而已。然而這使得很多人剛接觸面向對象的時候很不理解這些東西。

下面,說所面向對象在go中的寫法:

如果我們要再Java中定義一個Rect,可以求其面積,我們應該這么寫

1 public class Rect {
2     public int x;
3     public int y;
4     public int Area() {
5         return x*y;
6     }
7 }

很簡單,那么Go語言中怎么做呢?Go中並不存在所謂的類,所有的類都是用結構體表示的,所以要寫一個類,我們先得定義一個結構體:

1 type Rect struct {
2     x, y int
3 }

這是一個Rect的結構體,那么一個類中,不僅要存在變量,還要有成員函數,那么go的成員函數是這么寫的:

1 func (r *Rect) Area() int  {
2     return r.x*r.y
3 }

這個成員函數的功能是求面積的,顯然,這個成員函數值對Rect的結構體適用,這樣就實現了所謂的封裝,那么,我們如何去創建並初始化類的實例呢

go語言提供了很多方式:

1 rect :=new(Rect)
2 rect :=&Rect{}
3 rect :=&Rect{1,2}
4 rect :=&Rect{x:3,y:4}

那么,一遍情況下,如果沒有指定成員變量的大小,go語言會默認初始化成員變量為0,bool類型的為false。

那么,構造函數呢?

我們可以這么來寫:

1 func NewRect(x,y int) *Rect {
2     return &Rect{x,y}
3 }

其實,這也是我們平時new一個對象時候的真正操作,只是go把他真正展現給我們了。

看到這里,我們似乎還有一個疑問,那就是,像java、C++中對於可見性的描述呢,go語言中不存在public等關鍵字,go語言中直接選擇用字母大小寫控制。

一個變量以大寫字母開頭則表示對其他包可見,如果想要不可見,那么使用小寫字母即可,但是go語言中的可見性控制只是針對包的,並不針對類,也就是,同一個包下的類都是可見的。這個時候我們就可以知道了為什么輸出語句是這樣寫的了吧:

1 fmt.Println("hello world")

因為此函數對其他包是可見的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM