免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

go語言接口優缺點,go 接口類型

為什么我不喜歡Go語言式的接口

所謂Go語言式的接口,就是不用顯示聲明類型T實現了接口I,只要類型T的公開方法完全滿足接口I的要求,就可以把類型T的對象用在需要接口I的地方。這種做法的學名叫做Structural Typing,有人也把它看作是一種靜態的Duck Typing。除了Go的接口以外,類似的東西也有比如Scala里的Traits等等。有人覺得這個特性很好,但我個人并不喜歡這種做法,所以在這里談談它的缺點。當然這跟動態語言靜態語言的討論類似,不能簡單粗暴的下一個“好”或“不好”的結論。

10余年的黔西南州網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站建設的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整黔西南州建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。成都創新互聯從事“黔西南州網站設計”,“黔西南州網站推廣”以來,每個客戶項目都認真落實執行。

我的觀點:

Go的隱式接口Duck Typing確實不是新技術, 但是在主流靜態編程語言中支持Duck Typing應該是很少的(不清楚目前是否只有Go語言支持).

靜態類型和動態類型雖然沒有絕對的好和不好, 但是每個都是有自己的優勢的, 沒有哪一個可以包辦一切. 而Go是試圖結合靜態類型和動態類型(interface)各自的優勢.

那么就從頭談起:什么是接口。其實通俗的講,接口就是一個協議,規定了一組成員,例如.NET里的ICollection接口:

public interface ICollection {

int Count { get; }

object SyncRoot { get; }

bool IsSynchronized { get; }

void CopyTo(Array array, int index);

}

這就是一個協議的全部了嗎?事實并非如此,其實接口還規定了每個行為的“特征”。打個比方,這個接口的Count除了需要返回集合內元素的數目以外,還隱含了它需要在O(1)時間內返回這個要求。這樣一個使用了ICollection接口的方法才能放心地使用Count屬性來獲取集合大小,才能在知道這些特征的情況下選用正確的算法來編寫程序,而不用擔心帶來性能問題,這才能實現所謂的“面向接口編程”。當然這種“特征”并不但指“性能”上的,例如Count還包含了例如“不修改集合內容”這種看似十分自然的隱藏要求,這都是ICollection協議的一部分。

為什么要使用 Go 語言?Go 語言的優勢在哪里

1、學習曲線

它包含了類C語法、GC內置和工程工具。這一點非常重要,因為Go語言容易學習,所以一個普通的大學生花一個星期就能寫出來可以上手的、高性能的應用。在國內大家都追求快,這也是為什么國內Go流行的原因之一。

2、效率

Go擁有接近C的運行效率和接近PHP的開發效率,這就很有利的支撐了上面大家追求快速的需求。

3、出身名門、血統純正

之所以說Go語言出身名門,是因為我們知道Go語言出自Google公司,這個公司在業界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰略考慮。而且從Go語言的發展態勢來看,Google對它這個新的寵兒還是很看重的,Go自然有一個良好的發展前途。我們看看Go語言的主要創造者,血統純正這點就可見端倪了。

4、組合的思想、無侵入式的接口

Go語言可以說是開發效率和運行效率二者的完美融合,天生的并發編程支持。Go語言支持當前所有的編程范式,包括過程式編程、面向對象編程以及函數式編程。

5、強大的標準庫

這包括互聯網應用、系統編程和網絡編程。Go里面的標準庫基本上已經是非常穩定,特別是我這里提到的三個,網絡層、系統層的庫非常實用。

6、部署方便

我相信這一點是很多人選擇Go的最大理由,因為部署太方便,所以現在也有很多人用Go開發運維程序。

7、簡單的并發

它包含降低心智的并發和簡易的數據同步,我覺得這是Go最大的特色。之所以寫正確的并發、容錯和可擴展的程序如此之難,是因為我們用了錯誤的工具和錯誤的抽象,Go可以說這一塊做的相當簡單。

8、穩定性

Go擁有強大的編譯檢查、嚴格的編碼規范和完整的軟件生命周期工具,具有很強的穩定性,穩定壓倒一切。那么為什么Go相比于其他程序會更穩定呢?這是因為Go提供了軟件生命周期的各個環節的工具,如go

tool、gofmt、go test。

如何看待go語言泛型的最新設計?

Go 由于不支持泛型而臭名昭著,但最近,泛型已接近成為現實。Go 團隊實施了一個看起來比較穩定的設計草案,并且正以源到源翻譯器原型的形式獲得關注。本文講述的是泛型的最新設計,以及如何自己嘗試泛型。

例子

FIFO Stack

假設你要創建一個先進先出堆棧。沒有泛型,你可能會這樣實現:

type?Stack?[]interface{}func?(s?Stack)?Peek()?interface{}?{

return?s[len(s)-1]

}

func?(s?*Stack)?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack)?Push(value?interface{})?{

*s?=?

append(*s,?value)

}

但是,這里存在一個問題:每當你 Peek 項時,都必須使用類型斷言將其從 interface{} 轉換為你需要的類型。如果你的堆棧是 *MyObject 的堆棧,則意味著很多 s.Peek().(*MyObject)這樣的代碼。這不僅讓人眼花繚亂,而且還可能引發錯誤。比如忘記 * 怎么辦?或者如果您輸入錯誤的類型怎么辦?s.Push(MyObject{})` 可以順利編譯,而且你可能不會發現到自己的錯誤,直到它影響到你的整個服務為止。

通常,使用 interface{} 是相對危險的。使用更多受限制的類型總是更安全,因為可以在編譯時而不是運行時發現問題。

泛型通過允許類型具有類型參數來解決此問題:

type?Stack(type?T)?[]Tfunc?(s?Stack(T))?Peek()?T?{

return?s[len(s)-1]

}

func?(s?*Stack(T))?Pop()?{

*s?=?(*s)[:

len(*s)-1]

}

func?(s?*Stack(T))?Push(value?T)?{

*s?=?

append(*s,?value)

}

這會向 Stack 添加一個類型參數,從而完全不需要 interface{}。現在,當你使用 Peek() 時,返回的值已經是原始類型,并且沒有機會返回錯誤的值類型。這種方式更安全,更容易使用。(譯注:就是看起來更丑陋,^-^)

此外,泛型代碼通常更易于編譯器優化,從而獲得更好的性能(以二進制大小為代價)。如果我們對上面的非泛型代碼和泛型代碼進行基準測試,我們可以看到區別:

type?MyObject?struct?{

X?

int

}

var?sink?MyObjectfunc?BenchmarkGo1(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek().(MyObject)

}

}

func?BenchmarkGo2(b?*testing.B)?{

for?i?:=?0;?i??b.N;?i++?{

var?s?Stack(MyObject)

s.Push(MyObject{})

s.Push(MyObject{})

s.Pop()

sink?=?s.Peek()

}

}

結果:

BenchmarkGo1BenchmarkGo1-16?????12837528?????????87.0?ns/op???????48?B/op????????2?allocs/opBenchmarkGo2BenchmarkGo2-16?????28406479?????????41.9?ns/op???????24?B/op????????2?allocs/op

在這種情況下,我們分配更少的內存,同時泛型的速度是非泛型的兩倍。

合約(Contracts)

上面的堆棧示例適用于任何類型。但是,在許多情況下,你需要編寫僅適用于具有某些特征的類型的代碼。例如,你可能希望堆棧要求類型實現 String() 函數

我為什么放棄Go語言

有好幾次,當我想起來的時候,總是會問自己:我為什么要放棄Go語言?這個決定是正確的嗎?是明智和理性的嗎?其實我一直在認真思考這個問題。

開門見山地說,我當初放棄Go語言(golang),就是因為兩個“不爽”:第一,對Go語言本身不爽;第二,對Go語言社區里的某些人不爽。毫無疑問,這是非常主觀的結論。轉載

1.1 不允許左花括號另起一行

1.2 編譯器莫名其妙地給行尾加上分號

1.3 極度強調編譯速度,不惜放棄本應提供的功能

1.4 錯誤處理機制太原始

1.5 垃圾回收器(GC)不完善、有重大缺陷

1.6 禁止未使用變量和多余import

1.7 創建對象的方式太多令人糾結

1.8 對象沒有構造函數和析構函數

1.9 defer語句的語義設定不甚合理

1.10 許多語言內置設施不支持用戶定義的類型

1.11 沒有泛型支持,常見數據類型接口丑陋

1.12 實現接口不需要明確聲明

1.13 省掉小括號卻省不掉花括號

1.14 編譯生成的可執行文件尺寸非常大

1.15 不支持動態加載類庫

GO語言和C++比優缺點在那?

C++適合本地程序的開發。Go語言適合網絡程序和本地程序的開發。Go的優點:垃圾回收,語意明確,格式統一。?Go的缺點:效率目前沒有C++高,但對于桌面程序而言,效率問題不大,因為硬件已經很快了。c++過于復雜了,加入很多炫技的內容。這些內容脫離了事情的本質。

最明顯的就是所謂的面向對象。基于面向對象的工程如果足夠大的情況下,會帶來很大的耦合度,如果再加上內存管理,多線程等等。項目后期基本上沒辦法維護和增加功能。

關于c++的語言復雜性,你可以問知乎上的任何一位高手。沒一個敢說自己精通c++。你也可以去看一下所有的c++編繹器,沒有任何一個敢說自己完全實現了c++的標準。不同的編繹器之間實現細節又不同。所以功能再強大沒有實用性,就失去了意義,只會制造更多的問題。

當前名稱:go語言接口優缺點,go 接口類型
當前網址:http://m.newbst.com/article28/dssisjp.html

成都網站建設公司_創新互聯,為您提供軟件開發云服務器定制網站營銷型網站建設關鍵詞優化商城網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都seo排名網站優化