婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 我為什么喜歡Go語言(簡潔的Go語言)

我為什么喜歡Go語言(簡潔的Go語言)

熱門標簽:外呼系統如何接收服務密碼 工商信用卡外呼系統教程 海外照相館地圖標注入駐 旅游廁所如何電子地圖標注 外呼系統多少錢一年 客服級電銷機器人 智能營銷軟件 滁州自建外呼系統 經常接到推銷電話機器人的電話

從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 string
    u, 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 -x
    default: 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)執行完畢之后執行。就算"http://各種讀寫"時發生異常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語言(簡潔的Go語言)》,本文關鍵詞  我,為什么,喜歡,語言,簡潔,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《我為什么喜歡Go語言(簡潔的Go語言)》相關的同類信息!
  • 本頁收集關于我為什么喜歡Go語言(簡潔的Go語言)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    一区二区三区在线观看网站| 91麻豆精品国产无毒不卡在线观看| 日韩三区在线观看| 色综合一区二区| 亚洲人吸女人奶水| 欧美96一区二区免费视频| 国产一区二区三区精品欧美日韩一区二区三区| 欧美精品v日韩精品v韩国精品v| 视频一区二区三区在线| 成人国产精品免费观看视频| 久久久久国产精品麻豆ai换脸| 人人狠狠综合久久亚洲| 日韩欧美一区二区久久婷婷| 亚洲综合网站在线观看| 91精品国产色综合久久不卡蜜臀| 精品国产乱码久久| 亚洲欧美另类小说视频| av在线播放不卡| 亚洲欧美视频在线观看视频| 国产精品羞羞答答xxdd| 亚洲最色的网站| 国产成人精品aa毛片| 欧美一区二区播放| 久久综合狠狠综合久久综合88 | 亚洲一区二区影院| 日韩欧美视频一区| 色综合视频一区二区三区高清| 日韩欧美国产麻豆| 狠狠色丁香婷婷综合久久片| 成人精品免费视频| 精品国产一区二区精华| 一区二区三区中文字幕精品精品| 午夜精品久久久久久久久久久 | 91丨九色丨蝌蚪富婆spa| 国产一区二区在线影院| 欧美一区二区女人| 中文字幕亚洲一区二区va在线| 日韩国产高清影视| 成人欧美一区二区三区| 国产精品久久久久一区二区三区| 亚洲最大成人综合| 免费观看在线综合色| 午夜影院在线观看欧美| 精品亚洲国内自在自线福利| 99精品一区二区| 欧美人伦禁忌dvd放荡欲情| 国产精品免费观看视频| 欧美午夜精品久久久久久孕妇| 91精品国产91热久久久做人人| 一本大道av伊人久久综合| 男人的天堂亚洲一区| 亚洲精品国产一区二区三区四区在线| 久久久综合激的五月天| 欧美放荡的少妇| 欧美三级视频在线观看| 色哟哟在线观看一区二区三区| 国产成人在线视频免费播放| 看电影不卡的网站| 日本中文字幕不卡| 亚洲自拍偷拍图区| 中文字幕一区在线观看视频| 91福利国产精品| 久久精品一区二区三区不卡牛牛| 欧美日韩高清一区二区| 美国毛片一区二区| 日韩精品亚洲一区二区三区免费| 精品美女在线观看| 久久精品国产一区二区三区免费看| 精品国产一区二区三区四区四 | 九九视频精品免费| 日日摸夜夜添夜夜添亚洲女人| 91免费在线播放| 不卡的av电影| 老司机精品视频一区二区三区| 欧美高清一级片在线| 欧美伊人久久久久久久久影院| 欧美日韩在线免费视频| 在线观看免费视频综合| 91女神在线视频| 欧美精品九九99久久| 精品国内片67194| 这里是久久伊人| 五月婷婷另类国产| 日韩一区二区三区电影在线观看| 国产精品久久午夜夜伦鲁鲁| 免费观看成人av| 亚洲高清视频中文字幕| 日本伊人午夜精品| 亚洲成人自拍一区| 91麻豆国产福利在线观看| 国产激情精品久久久第一区二区| 国产成人精品网址| 在线亚洲高清视频| 国产精品色在线观看| 精品一区二区三区在线观看国产| 岛国精品在线观看| 国产三区在线成人av| 欧美精品一区男女天堂| 91麻豆精品国产自产在线| 国产日韩一级二级三级| 一区二区三区在线观看国产| 日韩精品久久久久久| 国产精品一区一区三区| 伊人婷婷欧美激情| 国产成人高清视频| 日本一区二区三区四区在线视频| 国产欧美视频一区二区三区| 中文字幕第一区综合| 亚洲欧美怡红院| eeuss鲁一区二区三区| 国产蜜臀av在线一区二区三区| 亚洲国产精品综合小说图片区| 91色九色蝌蚪| 亚洲国产精品成人综合 | 日韩欧美色综合网站| 奇米精品一区二区三区在线观看 | 91精品福利在线| 国产女主播在线一区二区| 久久aⅴ国产欧美74aaa| 欧美精品三级日韩久久| 久久久99精品久久| caoporn国产一区二区| 18涩涩午夜精品.www| 日本一二三四高清不卡| 日韩电影一区二区三区| 91精品国产综合久久久蜜臀图片| 精品欧美黑人一区二区三区| 视频一区视频二区中文字幕| 欧美日韩综合在线| 午夜精品福利一区二区三区av| 国产91精品免费| 日韩一区二区三区精品视频| 亚洲精品成人精品456| 国产成人亚洲综合a∨婷婷图片| 精品久久99ma| 精品国产麻豆免费人成网站| 五月天婷婷综合| 欧美无人高清视频在线观看| 中文字幕免费一区| 国产精品1区2区3区| 精品对白一区国产伦| 视频一区国产视频| 色综合视频在线观看| 国产欧美日韩在线看| 另类欧美日韩国产在线| 欧美日韩国产区一| 久热成人在线视频| 国产欧美1区2区3区| 99精品国产一区二区三区不卡| 亚洲免费观看高清完整| 亚洲欧洲性图库| 美日韩一区二区| 在线免费观看日本一区| 美女脱光内衣内裤视频久久网站| 麻豆一区二区在线| 国产三级一区二区| 欧洲精品中文字幕| av在线不卡免费看| 亚洲精选免费视频| 在线免费精品视频| 亚洲成人精品一区二区| 欧美日韩和欧美的一区二区| 卡一卡二国产精品 | 欧美视频中文字幕| 亚洲视频免费在线观看| 欧美剧情电影在线观看完整版免费励志电影 | 国产清纯白嫩初高生在线观看91| 狠狠色狠狠色综合| 亚洲福利一区二区| 欧美日高清视频| 欧美性猛片aaaaaaa做受| 亚洲成人在线网站| youjizz久久| 国产一区二区三区免费看| 一区二区三区不卡视频在线观看| 日韩视频免费观看高清完整版在线观看| 成人爽a毛片一区二区免费| 国产精品久久精品日日| 欧美猛男超大videosgay| 日韩一区精品字幕| 韩国精品在线观看| 一区二区三区免费看视频| 亚洲欧洲精品天堂一级| 91精品国产麻豆国产自产在线| 成人晚上爱看视频| 久久99精品久久久久| 麻豆精品精品国产自在97香蕉| 爽好久久久欧美精品| 久久精品日韩一区二区三区| 日韩你懂的在线观看| 色综合久久88色综合天天| www.亚洲在线| 99精品国产91久久久久久| av不卡免费电影| 国产精品香蕉一区二区三区| 国产一区二区三区不卡在线观看| 亚瑟在线精品视频| 国产高清不卡一区| 亚洲综合色区另类av| 亚洲v中文字幕|