一、萬(wàn)能之Hello World 開(kāi)啟go的大門
直接上代碼
packagemain//表明包 import"fmt"http://導(dǎo)入包fmt控制輸入輸出感覺(jué)和java的System.out和Scanner有點(diǎn)像 funcmain(){ fmt.Println("Hello Go world。");//進(jìn)入這個(gè)世界了 }
輸出結(jié)果:
是不是感覺(jué)還可以。
二、Go語(yǔ)言環(huán)境安裝
我安裝的是windows版的 雙擊安裝選擇目錄 全程輕松隨意 比想象中簡(jiǎn)單
配置系統(tǒng)變量,然后就可以開(kāi)始玩了
三、基礎(chǔ)語(yǔ)法
行分割符:不需要像java一眼每句之后都加一個(gè);表明結(jié)束 每一行都是單獨(dú)的一句 如果非要把幾行語(yǔ)句寫在一起 就需要加分號(hào)了
注釋 : //單行注釋
/*
aaa
bbb
*/
標(biāo)識(shí)符 標(biāo)識(shí)符用來(lái)命名變量、類型等程序?qū)嶓w。一個(gè)標(biāo)識(shí)符實(shí)際上就是一個(gè)或是多個(gè)字母(AZ和az)數(shù)字(0~9)、下劃線_組成的序列,但是第一個(gè)字符必須是字母或下劃線而不能是數(shù)字。
字符串連接 直接用+號(hào)即可連接 這點(diǎn)倒是和java挺像的 但是java里直接用加號(hào)連接的性能不是很好 不知道go語(yǔ)言中是否有相類似的編譯流程
關(guān)鍵字
預(yù)定義標(biāo)識(shí)符
四、數(shù)據(jù)類型
首先一點(diǎn),給我印象比較深的就是 對(duì)數(shù)字類型添加了很多的包裝,在不同的應(yīng)用范圍內(nèi)使用不同的數(shù)據(jù)類型 例如
int8 有符號(hào) 8 位整型 (-128 到 127)
int16 有符號(hào) 16 位整型 (-32768 到 32767)
int32 有符號(hào) 32 位整型 (-2147483648 到 2147483647)
int64 有符號(hào) 64 位整型 (-9223372036854775808 到 9223372036854775807)
這個(gè)給人感覺(jué)就是對(duì)使用著感覺(jué) 有了更高的要求 像java就是int Integer BigInteger這幾種包裝好的用就行了
當(dāng)然這樣要求的更細(xì)致 感覺(jué)編譯的時(shí)候 就越容易控制 如果方方面面都這么細(xì)致的話 運(yùn)行速度上就可以提高不少的
五、聲明變量
var identifier type 例:var a int;
var identifier1,identifier2 type 例:var a,b string;
指定變量類型,如果沒(méi)有初始化,則變量默認(rèn)為零值數(shù)值類型(包括complex64/128)為 0
布爾類型為 false
字符串為 “”(空字符串)
以下幾種類型為 nil:
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口
根據(jù)值自行判定變量類型 例:var d = true (這點(diǎn)就有點(diǎn)像js了)
省略 var, 注意 := 左側(cè)如果沒(méi)有聲明新的變量,就產(chǎn)生編譯錯(cuò)誤,格式:v\_name := value 例:f := “Runoob”
多變量聲明
//類型相同多個(gè)變量,非全局變量 varvname1,vname2,vname3type vname1,vname2,vname3=v1,v2,v3 //和python很像,不需要顯示聲明類型,自動(dòng)推斷 varvname1,vname2,vname3=v1,v2,v3 //出現(xiàn)在:=左側(cè)的變量不應(yīng)該是已經(jīng)被聲明過(guò)的,否則會(huì)導(dǎo)致編譯錯(cuò)誤 vname1,vname2,vname3:=v1,v2,v3 //這種因式分解關(guān)鍵字的寫法一般用于聲明全局變量 var( vname1v_type1 vname2v_type2 )
六、常量
const 定義常量關(guān)鍵字 目前感覺(jué)和final static 類似
定義了之后就不能改了 如果代碼里面改了的話 會(huì)報(bào) cannot assign to LENGTH 錯(cuò)誤
下來(lái)就發(fā)現(xiàn)一個(gè)神奇懂東西 iota
iota,特殊常量,可以認(rèn)為是一個(gè)可以被編譯器修改的常量。
iota 在 const關(guān)鍵字出現(xiàn)時(shí)將被重置為 0(const 內(nèi)部的第一行之前),const 中每新增一行常量聲明將使 iota 計(jì)數(shù)一次(iota 可理解為 const 語(yǔ)句塊中的行索引)。
枚舉自增計(jì)數(shù)器 感覺(jué)是這么個(gè)意思
運(yùn)算符
&這個(gè)就是只有兩個(gè)1的時(shí)候才是1其余都是0
|這個(gè)是只有兩個(gè)0的時(shí)候才是0其余都是1和與剛好相反
^這個(gè)簡(jiǎn)單粗暴兩個(gè)相同的數(shù)字是0不同的時(shí)候是1
這個(gè)<<=后面的幾個(gè)都還有點(diǎn)驚艷到我了 厲害厲害
這兩個(gè)優(yōu)點(diǎn)沒(méi)太看懂 敲個(gè)代碼試一下
packagemain import"fmt" funcmain(){ varastring="abc" varptr*string=&a fmt.Printf("第1行-a變量類型為=%T ",a); fmt.Printf("第2行-ptr變量類型為=%T ",ptr); fmt.Println(*ptr) fmt.Println(ptr) }
加*輸出的是內(nèi)容 不加輸出的就是地址 這個(gè)指針的概念 java里是沒(méi)有的
七、條件語(yǔ)句
這個(gè)select語(yǔ)句真的是看的我欲生欲死
以下描述了 select 語(yǔ)句的語(yǔ)法:
每個(gè) case 都必須是一個(gè)通信
所有 channel 表達(dá)式都會(huì)被求值
所有被發(fā)送的表達(dá)式都會(huì)被求值
如果任意某個(gè)通信可以進(jìn)行,它就執(zhí)行,其他被忽略。
如果有多個(gè) case 都可以運(yùn)行,Select 會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。
否則:
如果有 default 子句,則執(zhí)行該語(yǔ)句。
如果沒(méi)有 default 子句,select 將阻塞,直到某個(gè)通信可以運(yùn)行;Go 不會(huì)重新對(duì) channel 或值進(jìn)行求值。
來(lái)來(lái)來(lái) 兩段代碼說(shuō)明一下
packagemain import( "fmt" ) funcfibonacci(c,quitchanint){ x,y:=1,1 for{ select{ casec<-?x: ??????fmt.Printf("x?:?%d,?y?:?%d ",?x,?y) ????????????x,?y?=?y,?x+y ????????case?<-quit: ????????????fmt.Println("quit") ????????????return ????????} ????} } func?main()?{ ????c?:=?make(chan?int) ????quit?:=?make(chan?int) ????go?func()?{ ????????for?i?:=?0;?i?6;?i++?{ ??????fmt.Printf("開(kāi)始搞事?i?=?%d ",?i) ????????????fmt.Println(<-c) ????????} ????????quit?<-?0 ????}() ????fibonacci(c,?quit) }
輸出結(jié)果為:
第二段代碼:
packagemain import( "fmt" "time" ) funcChann(chchanint,stopChchanbool){ forj:=0;j10;?j++?{ ????????ch?<-?j ????????time.Sleep(time.Second) ????} ????stopCh?<-?true } func?main()?{ ????ch?:=?make(chan?int) ????c?:=?0 ????stopCh?:=?make(chan?bool) ????go?Chann(ch,?stopCh) ????for?{ ????????select?{ ????????case?c?=?<-ch: ????????????fmt.Println("Recvice",?c) ????????????fmt.Println("channel") ????????case?s?:=?<-ch: ????????????fmt.Println("Receivessss",?s) ????????case?_?=?<-stopCh: ????????????goto?end ????????} ????} end: }
輸出結(jié)果為:
這兩個(gè)例子分別說(shuō)明了下面兩點(diǎn)
如果任意某個(gè)通信可以進(jìn)行,它就執(zhí)行,其他被忽略。
如果有多個(gè) case 都可以運(yùn)行,Select 會(huì)隨機(jī)公平地選出一個(gè)執(zhí)行。其他不會(huì)執(zhí)行。
但是有個(gè)疑問(wèn) 為啥第一個(gè)例子里在執(zhí)行偶數(shù)次的時(shí)候 xy會(huì)交換兩次 在下一次調(diào)用的時(shí)候又不會(huì)進(jìn)行交換??jī)?nèi)部是怎么實(shí)現(xiàn)的???真想打個(gè)斷點(diǎn)調(diào)試一下 這個(gè)問(wèn)題如果我往后會(huì)做go的話 我一定會(huì)回來(lái)的!!!!
審核編輯:劉清
-
交換機(jī)
+關(guān)注
關(guān)注
21文章
2656瀏覽量
100046 -
JAVA語(yǔ)言
+關(guān)注
關(guān)注
0文章
138瀏覽量
20149 -
go語(yǔ)言
+關(guān)注
關(guān)注
1文章
158瀏覽量
9075
原文標(biāo)題:Java 轉(zhuǎn) Go 之初體驗(yàn) !
文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論