<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 轉(zhuǎn) Go 之初體驗(yàn)

          共 5697字,需瀏覽 12分鐘

           ·

          2022-06-20 19:46

          ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????


          作者:天堂里外

          來(lái)源:blog.csdn.net/tiantang_zy/article/details/105048817


          面試了一個(gè)單位 說(shuō)可能需要java轉(zhuǎn)go語(yǔ)言 所以在此開(kāi)始學(xué)習(xí)一下 如果面試通過(guò)了就繼續(xù)學(xué) 沒(méi)面試過(guò) 那么就這一篇了 加油!!!


          # 萬(wàn)能之Hello World 開(kāi)啟go的大門


          直接上代碼

          package main //表明包
          import "fmt" //導(dǎo)入包 fmt 控制輸入輸出 感覺(jué)和java的System.out和Scanner有點(diǎn)像
          func main() { fmt.Println("Hello Go world。"); //進(jìn)入這個(gè)世界了}


          輸出結(jié)果:


          是不是感覺(jué)還可以。


          # Go語(yǔ)言環(huán)境安裝


          安裝包下載地址為:https://golang.org/dl/。


          如果打不開(kāi)可以使用這個(gè)地址:https://golang.google.cn/dl/。



          我安裝的是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ù)類型



          數(shù)據(jù)類型詳細(xì)的可以看這個(gè):https://www.runoob.com/go/go-data-types.html

          首先一點(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è)變量, 非全局變量var vname1, vname2, vname3 typevname1, vname2, vname3 = v1, v2, v3
          // 和 python 很像,不需要顯示聲明類型,自動(dòng)推斷var vname1, 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 ( vname1 v_type1 vname2 v_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è)代碼試一下

          package main
          import "fmt"
          func main(){var a string = "abc"var ptr *string = &afmt.Printf("第 1 行 - a 變量類型為 = %T\n", a );fmt.Printf("第 2 行 - ptr 變量類型為 = %T\n", ptr );fmt.Println(*ptr)fmt.Println(ptr)}



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



          這一part 感覺(jué)除了指針的概念 其余的感覺(jué)都差不多

          詳細(xì)例子:https://www.runoob.com/go/go-constants.html


          # 條件語(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ō)明一下

          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("開(kāi)始搞事 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é)果為:



          這兩個(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)的!!!!

          -End-

          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來(lái),可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

          點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

          在看點(diǎn)這里好文分享給更多人↓↓

          瀏覽 57
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久夜色精品国产噜噜亚洲AV | 美女高潮视频网站 | 盗摄—AV国产盗摄 | 黄色片免费在线观看 | 干我操我 |