Go語言之“類”篇(二)
前言介紹: 本人原本是C++開發工程師,使用C++已經有8年多的時間,最近在學習Go語言,在學習Go語言的時候,難免會拿Go語言與C++語言做一些比較。
這篇文章便是筆者,在學習Go語言“類”的時候,整理的一些知識。
準確來說,Go語言沒有類的概念,不過卻有struct和interface,這篇文章主要來講struct,因為筆者覺得這個和C++中的Class有些相似。在C++中Class有幾個東西,一定要談,它們分別是:public/protected/private屬性,建構函式和解構函式,繼承,函式過載。
一、公私有屬性
1.C++中的公私有屬性,一定要有關鍵字public, protected, private來修飾。
並且這些屬性的作用範圍是針對類來說的,不是針對類的例項來說的,是編譯階段的概念。
詳細介紹參見我的另外一篇文章:private在C++中的範圍
2.Go中也有公私有的概念,不過沒有protected,它區分公有,還是私有,是通過變數的第一個字母的大小寫。大寫表示的是公有,小寫是私有。
不過這裡的作用範圍不是整個struct內部,而是整個包,公有跨包可以呼叫,私有不行,當然也是編譯階段的概念。
二、建構函式和解構函式
1.C++的建構函式和解構函式基本上是標配,分別用於初始化資料和釋放資料。
當然建構函式和解構函式,在C++中被編譯器單獨處理,因為這兩種函式與其他函式不同,沒有返回值,會被自動呼叫。
2.Go中,並沒有建構函式和解構函式的概念,這和Go語言的記憶體回收機制有關係。
對於解構函式,Go提供了defer的關鍵字,它只要在函式內部實現,等到函式執行結束時便會被自動呼叫。defer有點像解構函式,但是卻不是,因為它的作用範圍是函式級別。(後續會整理defer )
當然Go也可以採取其他手段模擬建構函式和解構函式,不過筆者覺得最好不這麼做,既然Go特意這麼設計,就不希望如此實現。
三、繼承
1.C++中,繼承很重要,一個目的是複用基類的資料和方法,一個目的是實現多型,是Is-a的關係。
2.Go中,準確的說不存在繼承,不過對於複用基類的資料和方法,可以採用組合的方式,如此以來的實現,其實和C++的繼承很像。
對於C++中多型的方式,Go中的interface的實現比較類似,在這裡不做過多闡述。(後續會單獨整理這一部分。)
四、函式過載
1.C++中支援函式過載,也就是函式名字相同,但是引數不同,這樣C++的編譯器會把它們當做不同的函式來實現。
2.Go中沒有函式過載的概念,卻又可變參的函式支援,這從根本上解決了函式過載的功能。
灰子作於二零一九年三月十六日。
【原創作品,歡迎分享,請勿轉載,謝謝尊重!!】