日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我为什么喜欢Go语言

發布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我为什么喜欢Go语言 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:http://www.cnblogs.com/AllenDang/archive/2012/03/03/2378534.html

?

從2000年至今,也寫了11年代碼了,期間用過VB、Delphi、C#、C++、Ruby、Python,一直在尋找一門符合自己心意和理念的語言。我很在意寫代碼時的手感和執行的效率,所以在Go出現之前一直沒有找到。在熟悉Go之后,我雖沒有停下腳步,也去體驗了D語言,但幾乎立即就放棄了,它的設計還是太復雜。

就說說Go吧。它的好其實也就兩個字——簡潔!

?

看很多朋友的留言都覺得這些“少個括號、少個分號”之類的東西沒什么意義,真的嗎?問題是,既然可以沒有,為什么非得有?既然能夠少打一個字符,為什么多打了還挺開心?還覺得天經地義?這里簡單一點,那里簡單一點,總的來說是不是就簡單了很多?這里的設計簡潔一點,那里簡潔一點,是否整體就是緊湊高效?

很多東西,要整體去體會,才能感覺到真正的強大。沒有前面這些語法上的各種“看起來沒什么用”的支持,怎么能做到后面提到的那些設計上的簡潔?

?

我堅信,少就是多,簡單就是強大,不能減一分的設計才是真正的好設計!

簡潔的變量聲明和賦值

拿最簡單的聲明變量和賦值來看,下面這一句完成了聲明類型到賦值,最后還有那個常見的分號作為語句的結束。

var i int = 10;

這個一點都不簡潔對吧?為什么非要有“var”?為什么不能自己推導變量類型?為什么結尾非要加上分號?這三個問題,我相信Go語言的設計者也問過,并且都針對性的給了改進。重新來過。

i := 10

怎么樣?“:=”是聲明并推導類型的語法糖,結尾的分號也省了,因為這里我換行了,編譯器明白的。

還可以一次性聲明并賦值多個變量。

i, j, k := 1, 2, 3

不同的類型也可以。

i, j, k := 1, 1.0, “hello”

如果要聲明一堆變量,但暫時不賦值呢?可以這樣。

var (

i, j int s stringu, v, s = 2.0, 3.0, "bar"

)

Go的設計者甚至覺得多打幾個“var”都不應該!

?

簡潔的if

有點意思了對吧?我學習一門新語言的時候,第一眼看變量類型和聲明,第二眼就會去看邏輯控制的語法。現在來看看都有些什么?

if i > 10 {

??? println(“Greater then 10”)

}

稀松平常啊,難道一個簡單的if還能更簡單?恩,的確是的。首先if后面的條件判斷沒有人逼你再加上括號了,僅僅是少了兩次按鍵嘛,還有呢?還有!下面這個應該是很常見的if使用場景。

result := SomeMethod()

if result > 0 {

}

很多時候result這個變量其實僅僅用于條件判斷,完全可以在if之后就扔掉,所以Go有了這么個寫法。

if result := SomeMethod(); result > 0 {

}

這個表達式太常用了,真是誰寫誰知道,每次我寫著一行都會心里一爽。來看看糾結一點的if段。

if a {

} else if b {

} else if c {

} else {

}

這種寫法是可以的,但不是Go推薦的,理由是可以更簡潔。比如強悍的switch。

?

強悍的switch

這是很大家熟知的switch用法,注意,沒有break哦!Go里面case之間不會“下穿”。

switch tag {default: s3()case 0, 1, 2, 3: s1()case 4, 5, 6, 7: s2() } 神奇一點的switch,嘿嘿,與if異曲同工之妙。 switch x := f(); { // missing switch expression means "true"case x < 0: return -xdefault: return x }

還有這個,有了這個更加明確的寫法,你真的還會if…else if…else if…else…嗎?

switch {case x < y: f1()case x < z: f2()case x == 4: f3() }

條件判斷舒服了,循環呢?

?

孤單的for

其實我一直不太明白,為什么一門語言里面要提供多個循環語法呢?for、while、do…while…都是不可替代的?用哪一個呢?似乎都是看個人愛好吧?可能大家隨便就可以舉個例子出來證明這三個東西存在的必要和細微的差別,但對于我來說,做同一件事情如果有多種方法其實就是設計上的冗余,會對使用者造成或多或少的困擾。來看看Go的循環吧。

for i := 0; i < 10; i++ {

}

for a < b {

}

for {

}

看吧,一個for就搞定所有情況了。來看一個常用的遍歷集合,一把來說會寫成這樣。

count := len(someArray)

for i := 0; i < count; i++ {

????println(someArray[i])

}

簡化這個,Go給出了一個關鍵字“range”,先看用法。

for i, value := range someArray {

??? // i 是整型,代表下標

??? // value就是數組內值的類型

}

range不單單可以用于數組,實際上它可以用于任何集合,比如map。

m := map[string]int{"mon":0, "tue":1, "wed":2, "thu":3, "fri":4, "sat":5, "sun":6} for i, s := range a {// type of i is int// type of s is string }

這里只是提到了幾點最基本的語法場景,Go里面還有很多!

?

函數可以返回多個值

其實能夠在一行多重賦值的語言挺多的,但一個函數能返回多個值的就很少了,比如在C#里面如果要返回兩個int,通常會這么干。

public class TwoInts

{

??? public int A;

??? public int B;

}

public class Foo

{

??? public TwoInts ReturnTwoInt();

}

然后就可以 TwoInts ti = foo.CalcTwoInt() 覺得悲催嗎?也許你都麻木了對嗎?很多語言都是這么設計的。函數只能返回一個值最大的問題是會導致出現很多沒必要的數據結構。上面就體現了這個冗余,當然,你說可以用out關鍵字讓函數返回,但這個語法用起來就不是那么安全了。而這個問題在Go里面解決起來太容易了,因為Go的函數可以返回多個值!

func returnTwoInt() (int, int) {

}

a, b := returnTwoInt()

我對Go的好感就是從這里萌芽的,這讓我的庫里面從此少了很多數據結構!這無形中就能降低設計的復雜度。

?

函數內部聲明的對象指針可以安全的返回

func ReturnPointer() *Object1 {

??? obj := new Object1()

??? obj.A = “hello”

??? return obj

}

Go的垃圾回收器會處理好這種情況的,放心啦!

?

異常處理?defer是啥?能吃嗎?

為什么異常處理那么復雜?多少人可以安全的實現下面這個邏輯?以下是偽代碼。

File f = File.Read(“c:\\text.txt”)

f.Write(xxx)

f.Close()

我相信,有經驗的碼農們腦子里面瞬間出現了各種版本的try…catch…finally…,還有各種各樣的書寫規范,比如“catch”里面的邏輯不能在拋異常之類的東西。其實想想,我們的要求很簡單,打開一個文件,然后保證它在最后被關閉。僅此而已,為什么做這么簡單的一件事情非要那么復雜?看看人家Go是怎么做的!

func SaveSomething() {

??? if f, err := os.Open(“c:\\text.txt”); err == nil {

??????? //各種讀寫

??????? defer f.Close()

??? }

}

凡是加了defer的函數,都會在當前函數(這里就是SaveSomething)執行完畢之后執行。就算“//各種讀寫”時發生異常f.Close也會堅定的在SaveSomething退出時被執行。有了這個,釋放點資源,關閉個把句柄這種小事再也無足掛齒!

?

接口再也不用“實現”了

從我接觸OO思想一來,凡是有接口的語言,都以不同的方式要求類“實現”接口,這樣的方式我一直都認為是天經地義的,直到我遇見了Go。

type Speaker interface {

??? Say()

}

上面定義了一個接口,只有一個方法,Say,不需要參數,也沒有返回值。Go里面,任何擁有某個接口所定義所有方法的東西,都默認實現了該接口。這是一句擁有太多內涵的話,足矣對設計思路產生重大的影響。比如下面這個方法,它接受一個類型為Speaker的參數。

func SaySomething(s Speaker) {

??? s.Say()

}

那么所有擁有Say()方法的東西都可以往里扔。

在Go的世界里,所有的東西都默認實現了interface{}這個接口。有了這個概念,即使沒有泛型也能有效的降低設計復雜度。

?

多線程還能更簡單點嗎?

要寫多線程,你要懂Thread,懂各種鎖,懂各種信號量。在各類系統里面,“異步”邏輯通常代表“困難”。這是Go最強勁的部分,你見過比下面這個還簡單的異步代碼嗎(以下代碼摘自Go的官方范例)?

func IsReady(what string, minutes int64) {?
??? time.Sleep(minutes * 60*1e9);?
??? fmt.Println(what, "is ready")?
}?
go IsReady("tea", 6);?
go IsReady("coffee", 2);?
fmt.Println("I'm waiting....");

執行的結果是,打印:?
I'm waiting.... (right away)?
coffee is ready (2 min later)?
tea is ready (6 min later)

Go語言內置了“go”這個語法,任何go的方法,都將會被異步執行。那異步方法之前傳遞消息呢?用channel唄。意如其名,就是一個管道,一個往里寫,另外一個等著讀。

ch := make(chan int) //創建一個只能傳遞整型的管道

func pump(ch chan int) {?
??? for i := 0; ; i++ { ch <- i } //往管道里寫值?
}

func suck(ch chan int) {?
??? for { fmt.Println(<-ch) } //這里會等著直到有從管道里面出來?
}

go pump(ch) //異步執行pump

go suck(ch) //異步執行suck

嘿嘿,然后你就看到控制臺上輸出了一堆數字。

?

這次就寫到這兒吧,對不住Go里面其他的好東西了,哥餓了,就不一一出場亮相了,抱歉抱歉!鞠躬!下臺!

?

總結

以上是生活随笔為你收集整理的我为什么喜欢Go语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 超能一家人电影免费喜剧在线观看 | 国产欧美精品一区二区色综合朱莉 | 日韩美在线 | 欧美精品免费看 | 国产亚洲在线观看 | 在线永久看片免费的视频 | 亚洲欧洲视频 | 国产乱码精品一区二区三区五月婷 | 一区二区毛片 | 秋霞av影院 | 爱操综合| 激情五月色婷婷 | 日韩三级a | 国产精品成人一区二区 | 搞逼综合网 | 日韩在线视屏 | 中国av免费| 黄色综合网站 | 在线激情视频 | 日韩一级二级三级 | 欧美精产国品一二三区 | 欧美亚洲国产另类 | 丰满人妻一区二区三区免费视频 | 就爱啪啪网 | 日本中文字幕精品 | wwww日本60 | 久操免费在线 | 色姑娘av| 最好看的中文字幕国语电影mv | 成人久久久精品乱码一区二区三区 | 成人av自拍 | 夜夜操夜夜 | 国产午夜福利精品 | 欧美xxxxxx片免费播放软件 | 超碰天天 | 99久久久国产精品无码网爆 | 欧美日韩一区二区三区在线视频 | 国产三级视频在线 | 日本老年老熟无码 | 久久久久中文字幕亚洲精品 | 无套爆插| 性欧美巨大 | 国产精品久久中文字幕 | 影音先锋男人的天堂 | 徐锦江一级淫片免费看 | 一级在线毛片 | 五月综合色婷婷 | 日韩免费视频一区 | 成人高清视频在线观看 | 成年女人18级毛片毛片免费 | 天天天天天天干 | 天天狠天天插 | 老熟妇高潮一区二区高清视频 | 亚洲a网站 | 91久久久久一区二区 | 欧美色狠| 欧美一级黄色录像 | 波多野结衣a v在线 欧洲免费av | 奇米第四色777 | 久久婷婷国产 | 日韩字幕 | 一区视频在线 | 欧美碰碰碰 | 欧美精品高清 | 欧美xxxxbbbb | 天堂中文字幕av | 一本大道视频 | 国产精品久久久久av | 亲子伦视频一区二区三区 | 一区二区不卡免费视频 | 成人a视频在线观看 | 大肉大捧一进一出好爽mba | av中字| 成人二区三区 | 久久综合久久综合久久综合 | 午夜91| 久久国产劲爆∧v内射 | 毛片99| 亚洲欧美一区二区三区四区 | 国产又色又爽 | 夜夜草视频 | 四虎影视永久免费 | www.久久av| 一级在线播放 | 国产精品不卡在线观看 | 国产三级播放 | 一区二区国产视频 | 中文字幕亚洲欧美日韩在线不卡 | 精品国产一区二区三区av性色 | 成人综合社区 | 国产91精品一区二区麻豆亚洲 | 伊人影院在线观看视频 | 成人性生活视频 | 中文字幕啪啪 | 日韩av一区在线观看 | 7777在线视频 | 欧美色xxx | 亚洲免费成人网 | 影音先锋中文字幕在线播放 |