2018年Go語言實戰筆記1

來源:互聯網
上載者:User

含著金鑰匙出生的go

近幾年,各程式設計語言中,最火的莫過於Go了。

Go誕生於Google, 是由以下三位電腦領域的大師寫的

Go的親爹們

由於出身名門,Go在誕生之初就吸引了大批開發人員的關注。誕生十年以來,已經有很多基於Go的應用,一直有傳言Go在將來是要取代現在Java的位置。對於一門只有十年歷史的新語言,Go的發展勢頭是相當迅猛的。

國外的docker就是用Go寫的,國內的七牛團隊廣泛使用Go。而今如火如荼的區塊鏈技術更是將Go推上了熱潮

聽起來這麼牛逼的技術,少年,你不想學下嗎?

go環境搭建

在官網下載go的安裝包

如果是mac,可直接用brew安裝:

brew intall go

查看go版本

  go [master]  go versiongo version go1.10.2 darwin/amd64

關於編輯器,推薦使用jetbrains出品的golang

第一個go程式

按照官網的demo,運行第一個go程式

建立hello.go檔案

package mainimport "fmt"func main() {    fmt.Println("Hello, 世界")}

運行go可以有兩種方式:

  1. 類似於python,php這樣的指令碼語言,直接運行,一步到位
  demo [master]  go run hello.go                                                    Hello, 世界
  1. 如java,c++ 一樣,要進行編譯,再運行編譯輸出的可執行檔
  demo [master]  go build hello.go # 產生可執行檔 hello  demo [master]  lshello    hello.go  demo [master]  ./hello # 運行可執行檔   Hello, 世界
代碼解析

go是一門有著文法潔癖的語言,如強制規定了大括弧的寫法。長期以來,關於大括弧是否要另起一行,是程式員界的聖戰,且這個聖戰跨越了語言,作業系統,編輯器。戰鬥雙方多年來廝殺無數回合,不分勝負。python之父Guido van Rossum直接取消了大括弧,完全採用縮排,繞過了聖戰。與之相比,go就顯得很霸道了,直接下了死命令:

"大括弧只能在當前行開始,不能另起一行,另起一行是異教徒,直接編譯出錯!"

讓我們來試下:

大括弧報錯

對於另起一行的強迫症程式員,想用go,惟有屈服。

此外,如果程式中有冗餘變數,或引入了沒有用到的包,都會報錯

package mainimport "fmt" // 引入了fmt包,但沒有使用func main() {}

報錯:

  demo [master]  go build hello.go# command-line-arguments./hello.go:3:8: imported and not used: "fmt"
變數聲明後不用

對於從其他語言轉過來的程式員,一開始會不習慣go的霸道規定,尤其是我大PHP程式員。PHP的規範是出了名的鬆散,隨便寫都行,程式員在寫代碼時是挺爽的,怎麼開心怎麼來,但是要維護別人的代碼就感到很噁心了。

go的設計理念既簡潔又嚴謹,用強制性的規則保證了代碼的一致性。

變數

go在定義變數的規範上,有些反人類。c++, java 都是在變數名之前聲明資料類型,而go卻別出心裁的將資料類型聲明置於變數名後面。

命名規則

變數的命名規則:以字母或底線開頭,對大小寫敏感。不能使用go的保留關鍵字

go保留關鍵字

範圍

  1. 在代碼塊聲明的變數,只在塊內有效
變數範圍
  1. 在函數內部聲明的變數,只在函數內有效
函數內部變數
  1. 在函數外部聲明的變數,在整個包內都有效。如果變數名稱是大寫的,即在整個程式中都有效
包內全域變數

如果變數名要共用到其他包,就需要將包名改成大寫

建立以下目錄結構:

  demo [master]  tree -L 2.├── main│   └── main.go└── test    └── test.go

main.go

package mainimport (    "fmt"    "../test" // 引入test包)func main() {    fmt.Println(test.NAME) // 擷取test包的NAME變數}

test.go

package testvar NAME = "章魚喵" // 變數名大寫,才能被其他包引用,類似於java中的public關鍵字

結果:

  demo [master]  go run main/main.go章魚喵

你可以試下將test中的NAME改為name,go會報錯,小寫變數是模組的私人變數,其他模組無法引用

常量

常量使用const關鍵字表示,常量一旦定義了,就不可再更改。因此常量只適用於布爾型、數字型(整數型、浮點型和複數)和字串型。

package mainimport "fmt"const name = "章魚喵"const say = "喜歡我的文章,點個贊吧,或者賞杯咖啡錢"const year = 2018func main() {    fmt.Println(name)    fmt.Println(say)    fmt.Println(year)}

這種寫法顯得很囉嗦,可以用更簡潔的方式:

package mainimport "fmt"const (    name = "章魚喵"    say = "喜歡我的文章,點個贊吧,或者賞杯咖啡錢"    year = 2018)func main() {    fmt.Println(name)    fmt.Println(say)    fmt.Println(year)}
  demo [master]  go run main/main.go章魚喵喜歡我的文章,點個贊吧,或者賞杯咖啡錢2018

資料類型

go的資料類型從大類劃分為:布爾型,數字類型,字串類型,衍生類別型

各個類型的具體說明,請自行查閱Go 語言資料類型

go是強型別語言,每個變數都要指定類型,如果不指定,go在編譯時間會自動根據變數的值推導變數的資料類型。

變數的類型不能更改,廣大PHP開發人員要謹記了,PHP是弱類型語言,同一個變數,可以隨時切換儲存的資料類型。PHP的變數不好比是一個萬能的筐,什麼都可以裝。而go的變數是專器專用

package mainimport "fmt"func main() {    var name string = "章魚喵" // 指定了資料類型為string    var say = "智慧如你,有什麼要說的,要評論區發表吧..." // 可省略資料類型    //say = 2018 // 編譯報錯:不能篡改類型    fmt.Println(name)    fmt.Println(say)}
  demo [master]  go run main/main.go章魚喵智慧如你,有什麼要說的,要評論區發表吧...

實值型別與參考型別

  1. 實值型別:變數儲存的是資料本身,如基礎資料型別 (Elementary Data Type):字串,布爾型,數字等

  2. 參考型別:變數儲存的是資料所在的記憶體位址,如:指標,map, chan等

package mainimport "fmt"func main() {    var content = "跟章魚喵一起學go吧..." // 實值型別    var pipe = make(chan int, 1) // 參考型別    fmt.Println(content) // 儲存具體資料    fmt.Println(pipe) // 儲存記憶體位址}
  demo [master]  go run main/main.go跟章魚喵一起學go吧...0xc42005a070

小結

筆記總結

如果覺得本文對你有所協助,點個贊,或者賞杯咖啡錢,你的認可對我很重要

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.