Java 轉(zhuǎn) Go 之初體驗 !
點擊關(guān)注公眾號,Java干貨及時送達(dá)??

來源:blog.csdn.net/tiantang_zy/
article/details/105048817
面試了一個單位 說可能需要java轉(zhuǎn)go語言 所以在此開始學(xué)習(xí)一下 如果面試通過了就繼續(xù)學(xué) 沒面試過 那么就這一篇了 加油!!!
一、萬能之Hello World 開啟go的大門
直接上代碼
package?main?//表明包
import?"fmt"?//導(dǎo)入包?fmt?控制輸入輸出?感覺和java的System.out和Scanner有點像
func?main()?{
????fmt.Println("Hello Go world。");?//進(jìn)入這個世界了
}
輸出結(jié)果:
是不是感覺還可以。
二、Go語言環(huán)境安裝
安裝包下載地址為:https://golang.org/dl/。
如果打不開可以使用這個地址:https://golang.google.cn/dl/。
我安裝的是windows版的 雙擊安裝選擇目錄 全程輕松隨意 比想象中簡單
配置系統(tǒng)變量,然后就可以開始玩了
三、基礎(chǔ)語法
行分割符:不需要像java一眼每句之后都加一個;表明結(jié)束 每一行都是單獨的一句 如果非要把幾行語句寫在一起 就需要加分號了 注釋 : //單行注釋
/*
aaa
bbb
*/標(biāo)識符 標(biāo)識符用來命名變量、類型等程序?qū)嶓w。一個標(biāo)識符實際上就是一個或是多個字母(AZ和az)數(shù)字(0~9)、下劃線_組成的序列,但是第一個字符必須是字母或下劃線而不能是數(shù)字。 字符串連接 直接用+號即可連接 這點倒是和java挺像的 但是java里直接用加號連接的性能不是很好 不知道go語言中是否有相類似的編譯流程 關(guān)鍵字 
預(yù)定義標(biāo)識符 
四、數(shù)據(jù)類型

數(shù)據(jù)類型詳細(xì)的可以看這個:https://www.runoob.com/go/go-data-types.html
首先一點,給我印象比較深的就是 對數(shù)字類型添加了很多的包裝,在不同的應(yīng)用范圍內(nèi)使用不同的數(shù)據(jù)類型 例如
int8 有符號 8 位整型 (-128 到 127) int16 有符號 16 位整型 (-32768 到 32767) int32 有符號 32 位整型 (-2147483648 到 2147483647) int64 有符號 64 位整型 (-9223372036854775808 到 9223372036854775807)
這個給人感覺就是對使用著感覺 有了更高的要求 像java就是int Integer BigInteger這幾種包裝好的用就行了
當(dāng)然這樣要求的更細(xì)致 感覺編譯的時候 就越容易控制 如果方方面面都這么細(xì)致的話 運行速度上就可以提高不少的
五、聲明變量
var identifier type 例:var a int;var identifier1,identifier2 type 例:var a,b string;
數(shù)值類型(包括complex64/128)為 0指定變量類型,如果沒有初始化,則變量默認(rèn)為零值
布爾類型為 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 (這點就有點像js了)省略 var, 注意 := 左側(cè)如果沒有聲明新的變量,就產(chǎn)生編譯錯誤,格式:v\_name := value 例:f := “Runoob”多變量聲明
//類型相同多個變量,?非全局變量
var?vname1,?vname2,?vname3?type
vname1,?vname2,?vname3?=?v1,?v2,?v3
//?和?python?很像,不需要顯示聲明類型,自動推斷
var?vname1,?vname2,?vname3?=?v1,?v2,?v3?
//?出現(xiàn)在?:=?左側(cè)的變量不應(yīng)該是已經(jīng)被聲明過的,否則會導(dǎo)致編譯錯誤
vname1,?vname2,?vname3?:=?v1,?v2,?v3?
//?這種因式分解關(guān)鍵字的寫法一般用于聲明全局變量
var?(
????vname1?v_type1
????vname2?v_type2
)
六、常量
const 定義常量關(guān)鍵字 目前感覺和final static 類似
定義了之后就不能改了 如果代碼里面改了的話 會報 cannot assign to LENGTH 錯誤
下來就發(fā)現(xiàn)一個神奇懂東西 iota
iota,特殊常量,可以認(rèn)為是一個可以被編譯器修改的常量。
iota 在 const關(guān)鍵字出現(xiàn)時將被重置為 0(const 內(nèi)部的第一行之前),const 中每新增一行常量聲明將使 iota 計數(shù)一次(iota 可理解為 const 語句塊中的行索引)。
枚舉自增計數(shù)器 感覺是這么個意思
運算符




&這個就是只有兩個1的時候才是1其余都是0
|這個是只有兩個0的時候才是0其余都是1和與剛好相反
^這個簡單粗暴兩個相同的數(shù)字是0不同的時候是1


這個<<=后面的幾個都還有點驚艷到我了 厲害厲害

這兩個優(yōu)點沒太看懂 敲個代碼試一下
package?main
import?"fmt"
func?main(){
?var?a?string?=?"abc"
?var?ptr?*string?=?&a
?fmt.Printf("第?1?行?-?a?變量類型為?=?%T\n",?a?);
?fmt.Printf("第?2?行?-?ptr??變量類型為?=?%T\n",?ptr?);
?fmt.Println(*ptr)
?fmt.Println(ptr)
}

加*輸出的是內(nèi)容 不加輸出的就是地址 這個指針的概念 java里是沒有的

這一part 感覺除了指針的概念 其余的感覺都差不多
詳細(xì)例子:https://www.runoob.com/go/go-constants.html
七、條件語句

這個select語句真的是看的我欲生欲死
以下描述了 select 語句的語法:
每個 case 都必須是一個通信
所有 channel 表達(dá)式都會被求值
所有被發(fā)送的表達(dá)式都會被求值
如果任意某個通信可以進(jìn)行,它就執(zhí)行,其他被忽略。
如果有多個 case 都可以運行,Select 會隨機(jī)公平地選出一個執(zhí)行。其他不會執(zhí)行。
否則:
如果有 default 子句,則執(zhí)行該語句。
如果沒有 default 子句,select 將阻塞,直到某個通信可以運行;Go 不會重新對 channel 或值進(jìn)行求值。
來來來 兩段代碼說明一下
package?main
import?(
????"fmt"
)
func?fibonacci(c,?quit?chan?int)?{
????x,?y?:=?1,?1
?
????for?{
????????select?{
????????case?c?<-?x:
??????fmt.Printf("x?:?%d,?y?:?%d\n",?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("開始搞事?i?=?%d\n",?i)
????????????fmt.Println(<-c)
????????}
????????quit?<-?0
????}()
????fibonacci(c,?quit)
}
輸出結(jié)果為:
第二段代碼:
package?main
import?(
????"fmt"
????"time"
)
func?Chann(ch?chan?int,?stopCh?chan?bool)?{
????for?j?:=?0;?j?10;?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é)果為:
這兩個例子分別說明了下面兩點
如果任意某個通信可以進(jìn)行,它就執(zhí)行,其他被忽略。
如果有多個 case 都可以運行,Select 會隨機(jī)公平地選出一個執(zhí)行。其他不會執(zhí)行。
但是有個疑問 為啥第一個例子里在執(zhí)行偶數(shù)次的時候 xy會交換兩次 在下一次調(diào)用的時候又不會進(jìn)行交換?內(nèi)部是怎么實現(xiàn)的???真想打個斷點調(diào)試一下 這個問題如果我往后會做go的話 我一定會回來的!!!!
今天就學(xué)到這里了 希望我胡漢三還會回來
學(xué)習(xí)自:
https://www.runoob.com/go
https://www.cnblogs.com/yang-2018/p/11133047.html
1.?SpringBoot 項目鑒權(quán)的 4 種方式
2.?新手必須知道的 Kubernetes 架構(gòu) !
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點“在看”,關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
PS:因公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下“在看”,加個“星標(biāo)”,這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。
點“在看”支持小哈呀,謝謝啦??

