在上一節中我們討論go語言的物件導向特性的時候也說了,go語言並不支援繼承,能夠進行物件的封裝(包括資料成員和成員函式的封裝),那麼這裡簡單說一下go語言介面之間的依賴關係。
我們知道 c++中兩個介面之間的依賴 可以通過公有/私有繼承方式來實現,且有對應的標識關鍵字
class programmar
;class cxxprogrammar : public programmar
;std:
:string cxxprogrammar:
:writehelloworld()
在go語言中的 介面之間的依賴關係則相比於以上語言有一些差異,先看乙個宣告的案例
type programmer inte***ce
type goprogrammer struct
func
(p *goprogrammer)
writehelloworld()
string
以上go語言的案例測試**如下:
package inte***ce_test
import
("testing"
)type programmer inte***ce
type goprogrammer struct
func
(p *goprogrammer)
writehelloworld()
string
func
testinte***ce
(t *testing.t)
最終如上測試**的輸出:
==
= run testinte***ce
inte***ce_test.go:25: fmt.println(
"hello world!"
)--- pass: testinte***ce (0.00s)
綜上總結,go語言的介面和其他語言的主要差異如下:
同時go 語言也提供了介面變數:
其中 coder 表示是乙個介面,goprogrammar
表示其實現。
自定義型別,尤其是函式型別能夠一定程度降低**的複雜度,讓**更易讀。
如下,未新增自定義函式型別
// 計時函式 -- 計算乙個函式的執行耗時
func
calctimespent
(inner func
(op int
)int
)func
(op int
)int
}
可以看到函式定義部分很難區分函式的邏輯,而我們增加了自定義函式型別之後:
type intcov func
(op int
)int
// 自定義函式型別,簡化函式邏輯
func
calctimespent
(inner intcov) intcov
}
可以看到定義的函式開頭部分複雜度立即降低。
完成的 統計函式耗時測試**如下:
package inte***ce_test
import
("testing"
"time"
"fmt"
)type intcov func
(op int
)int
// 自定義函式型別,簡化函式邏輯
func
calctimespent
(inner intcov) intcov
}func
slowtest
(op int
)int
func
testspenttime
(t *testing.t)
輸出如下:
==
= run testspenttime
time spent : 1.000234077
inte***ce_test.go:47: 10
--- pass: testspenttime (1.00s)
10 Go 語言函式
函式是基本的 塊,用於執行乙個任務。go 語言最少有個 main 函式。你可以通過函式來劃分不同功能,邏輯上每個函式執行的是指定的任務。函式宣告告訴了編譯器函式的名稱,返回型別,和引數。go 語言標準庫提供了多種可動用的內建的函式。例如,len 函式可以接受不同型別引數並返回該型別的長度。如果我們傳...
GO學習 10 Go語言基礎之指標
區別於c c 中的指標,go語言中的指標不能進行偏移和運算,是安全指標。任何程式資料載入記憶體後,在記憶體都有他們的位址,這就是指標。而為了儲存乙個資料在記憶體中的位址,我們就需要指標變數。比如,永遠不要高估自己 這句話是我的座右銘,我想把它寫入程式中,程式一啟動這句話是要載入到記憶體 假設記憶體位...
Go語言分布式網路爬蟲(1)
我們的爬蟲主體框架思路如下 這一小節的主要內容是對我們之前編寫的 進行一些簡單的封裝,並且編寫部分engine和parser的 下面的總體的結構圖 我們首先將之前main中的業務邏輯封裝到fetch函式中,我們需要建立乙個新的包fetcher 接著我們就要開始編寫engine,首先建立乙個engin...