亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3165 | 回復(fù): 0
打印 上一主題 下一主題

[技術(shù)動(dòng)態(tài)] GO語(yǔ)言搭建 [復(fù)制鏈接]

論壇徽章:
6
CU大;照
日期:2013-03-14 14:14:08CU大;照
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29處女座
日期:2014-04-21 11:51:59辰龍
日期:2014-05-12 09:15:10NBA常規(guī)賽紀(jì)念章
日期:2015-05-04 22:32:03
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-01-28 10:25 |只看該作者 |倒序?yàn)g覽
最近對(duì)GO語(yǔ)言產(chǎn)生了濃厚的興趣。因?yàn)镚O語(yǔ)言不僅僅可以開(kāi)發(fā)桌面、web程序,最吸引我的是安卓大有往GO語(yǔ)言全方位靠攏的趨勢(shì),自家的系統(tǒng)還是用自家的語(yǔ)言開(kāi)發(fā)比較靠譜。
用一句話來(lái)說(shuō):Go語(yǔ)言是谷歌2009發(fā)布的第二款開(kāi)源編程語(yǔ)言。 安卓也是谷歌的,這貨要鬧哪樣。
官方一點(diǎn)的解釋?zhuān)篏o語(yǔ)言是谷歌推出的一種全新的編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性。谷歌首席軟件工程師羅布派克(Rob Pike)說(shuō):“我們之所以開(kāi)發(fā)Go,是因?yàn)檫^(guò)去10多年間軟件開(kāi)發(fā)的難度令人沮喪!
好吧說(shuō)正事。

搭建GO語(yǔ)言開(kāi)發(fā)環(huán)境參考這里

Go語(yǔ)言環(huán)境搭建方法(Windows)

有興趣的同學(xué)一起學(xué)習(xí)吧。

QQ群:230931403

以下內(nèi)容來(lái)自AllenDang<我為什么喜歡Go語(yǔ)言>



簡(jiǎn)潔的變量聲明和賦值



拿最簡(jiǎn)單的聲明變量和賦值來(lái)看,下面這一句完成了聲明類(lèi)型到賦值,最后還有那個(gè)常見(jiàn)的分號(hào)作為語(yǔ)句的結(jié)束。



var i int = 10;



這個(gè)一點(diǎn)都不簡(jiǎn)潔對(duì)吧?為什么非要有“var”?為什么不能自己推導(dǎo)變量類(lèi)型?為什么結(jié)尾非要加上分號(hào)?這三個(gè)問(wèn)題,我相信Go語(yǔ)言的設(shè)計(jì)者也問(wèn)過(guò),并且都針對(duì)性的給了改進(jìn)。重新來(lái)過(guò)。



i := 10



怎么樣?“:=”是聲明并推導(dǎo)類(lèi)型的語(yǔ)法糖,結(jié)尾的分號(hào)也省了,因?yàn)檫@里我換行了,編譯器明白的。



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



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



不同的類(lèi)型也可以。



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



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



var (



    i, j int



    s string
    u, v, s = 2.0, 3.0, "bar"



)



Go的設(shè)計(jì)者甚至覺(jué)得多打幾個(gè)“var”都不應(yīng)該!







簡(jiǎn)潔的if



有點(diǎn)意思了對(duì)吧?我學(xué)習(xí)一門(mén)新語(yǔ)言的時(shí)候,第一眼看變量類(lèi)型和聲明,第二眼就會(huì)去看邏輯控制的語(yǔ)法。現(xiàn)在來(lái)看看都有些什么?



if i > 10 {



    println(“Greater then 10”)



}



稀松平常啊,難道一個(gè)簡(jiǎn)單的if還能更簡(jiǎn)單?恩,的確是的。首先if后面的條件判斷沒(méi)有人逼你再加上括號(hào)了,僅僅是少了兩次按鍵嘛,還有呢?還有!下面這個(gè)應(yīng)該是很常見(jiàn)的if使用場(chǎng)景。



result := SomeMethod()



if result > 0 {



}



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



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



}



這個(gè)表達(dá)式太常用了,真是誰(shuí)寫(xiě)誰(shuí)知道,每次我寫(xiě)著一行都會(huì)心里一爽。來(lái)看看糾結(jié)一點(diǎn)的if段。



if a {



} else if b {



} else if c {



} else {



}



這種寫(xiě)法是可以的,但不是Go推薦的,理由是可以更簡(jiǎn)潔。比如強(qiáng)悍的switch。







強(qiáng)悍的switch



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



switch tag {
    default:



        s3()
    case 0, 1, 2, 3:



        s1()
    case 4, 5, 6, 7:



        s2()
}



神奇一點(diǎn)的switch,嘿嘿,與if異曲同工之妙。



switch x := f(); {  // missing switch expression means "true"
    case x < 0: return -x
    default: return x
}



還有這個(gè),有了這個(gè)更加明確的寫(xiě)法,你真的還會(huì)if…else if…else if…else…嗎?



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



條件判斷舒服了,循環(huán)呢?







孤單的for



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



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



}



for a < b {



}



for {



}



看吧,一個(gè)for就搞定所有情況了。來(lái)看一個(gè)常用的遍歷集合,一把來(lái)說(shuō)會(huì)寫(xiě)成這樣。



count := len(someArray)



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



    println(someArray[i])



}



簡(jiǎn)化這個(gè),Go給出了一個(gè)關(guān)鍵字“range”,先看用法。



for i, value := range someArray {



    // i 是整型,代表下標(biāo)



    // value就是數(shù)組內(nèi)值的類(lèi)型



}



range不單單可以用于數(shù)組,實(shí)際上它可以用于任何集合,比如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
}



這里只是提到了幾點(diǎn)最基本的語(yǔ)法場(chǎng)景,Go里面還有很多!







函數(shù)可以返回多個(gè)值



其實(shí)能夠在一行多重賦值的語(yǔ)言挺多的,但一個(gè)函數(shù)能返回多個(gè)值的就很少了,比如在C#里面如果要返回兩個(gè)int,通常會(huì)這么干。



public class TwoInts



{



    public int A;



    public int B;



}



public class Foo



{



    public TwoInts ReturnTwoInt();



}



然后就可以 TwoInts ti = foo.CalcTwoInt() 覺(jué)得悲催嗎?也許你都麻木了對(duì)嗎?很多語(yǔ)言都是這么設(shè)計(jì)的。函數(shù)只能返回一個(gè)值最大的問(wèn)題是會(huì)導(dǎo)致出現(xiàn)很多沒(méi)必要的數(shù)據(jù)結(jié)構(gòu)。上面就體現(xiàn)了這個(gè)冗余,當(dāng)然,你說(shuō)可以用out關(guān)鍵字讓函數(shù)返回,但這個(gè)語(yǔ)法用起來(lái)就不是那么安全了。而這個(gè)問(wèn)題在Go里面解決起來(lái)太容易了,因?yàn)镚o的函數(shù)可以返回多個(gè)值!



func returnTwoInt() (int, int) {



}



a, b := returnTwoInt()



我對(duì)Go的好感就是從這里萌芽的,這讓我的庫(kù)里面從此少了很多數(shù)據(jù)結(jié)構(gòu)!這無(wú)形中就能降低設(shè)計(jì)的復(fù)雜度。







函數(shù)內(nèi)部聲明的對(duì)象指針可以安全的返回



func ReturnPointer() *Object1 {



    obj := new Object1()



    obj.A = “hello”



    return obj



}



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







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



為什么異常處理那么復(fù)雜?多少人可以安全的實(shí)現(xiàn)下面這個(gè)邏輯?以下是偽代碼。



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



f.Write(xxx)



f.Close()



我相信,有經(jīng)驗(yàn)的碼農(nóng)們腦子里面瞬間出現(xiàn)了各種版本的try…catch…finally…,還有各種各樣的書(shū)寫(xiě)規(guī)范,比如“catch”里面的邏輯不能在拋異常之類(lèi)的東西。其實(shí)想想,我們的要求很簡(jiǎn)單,打開(kāi)一個(gè)文件,然后保證它在最后被關(guān)閉。僅此而已,為什么做這么簡(jiǎn)單的一件事情非要那么復(fù)雜?看看人家Go是怎么做的!



func SaveSomething() {



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



        //各種讀寫(xiě)



        defer f.Close()



    }



}



凡是加了defer的函數(shù),都會(huì)在當(dāng)前函數(shù)(這里就是SaveSomething)執(zhí)行完畢之后執(zhí)行。就算“//各種讀寫(xiě)”時(shí)發(fā)生異常f.Close也會(huì)堅(jiān)定的在SaveSomething退出時(shí)被執(zhí)行。有了這個(gè),釋放點(diǎn)資源,關(guān)閉個(gè)把句柄這種小事再也無(wú)足掛齒!







接口再也不用“實(shí)現(xiàn)”了



從我接觸OO思想一來(lái),凡是有接口的語(yǔ)言,都以不同的方式要求類(lèi)“實(shí)現(xiàn)”接口,這樣的方式我一直都認(rèn)為是天經(jīng)地義的,直到我遇見(jiàn)了Go。



type Speaker interface {



    Say()



}



上面定義了一個(gè)接口,只有一個(gè)方法,Say,不需要參數(shù),也沒(méi)有返回值。Go里面,任何擁有某個(gè)接口所定義所有方法的東西,都默認(rèn)實(shí)現(xiàn)了該接口。這是一句擁有太多內(nèi)涵的話,足矣對(duì)設(shè)計(jì)思路產(chǎn)生重大的影響。比如下面這個(gè)方法,它接受一個(gè)類(lèi)型為Speaker的參數(shù)。



func SaySomething(s Speaker) {



    s.Say()



}



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



在Go的世界里,所有的東西都默認(rèn)實(shí)現(xiàn)了interface{}這個(gè)接口。有了這個(gè)概念,即使沒(méi)有泛型也能有效的降低設(shè)計(jì)復(fù)雜度。







多線程還能更簡(jiǎn)單點(diǎn)嗎?



要寫(xiě)多線程,你要懂Thread,懂各種鎖,懂各種信號(hào)量。在各類(lèi)系統(tǒng)里面,“異步”邏輯通常代表“困難”。這是Go最強(qiáng)勁的部分,你見(jiàn)過(guò)比下面這個(gè)還簡(jiǎn)單的異步代碼嗎(以下代碼摘自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....");



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



Go語(yǔ)言?xún)?nèi)置了“go”這個(gè)語(yǔ)法,任何go的方法,都將會(huì)被異步執(zhí)行。那異步方法之前傳遞消息呢?用channel唄。意如其名,就是一個(gè)管道,一個(gè)往里寫(xiě),另外一個(gè)等著讀。



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



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



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



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



go suck(ch) //異步執(zhí)行suck
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP