2018年Go語言實戰筆記1

含著金鑰匙出生的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 version
go version go1.10.2 darwin/amd64

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

第一個go程序

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

新建hello.go文件

package main

import "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] ? ls
hello    hello.go
?  demo [master] ? ./hello # 運行可執行文件   
Hello, 世界
代碼解析

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

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

讓我們來試下:

大括號報錯

對于另起一行的強迫癥程序員,想用go,惟有屈服。

此外,如果程序中有冗余變量,或引入了沒有用到的包,都會報錯

package main

import "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 main

import (
    "fmt"
    "../test" // 引入test包
)

func main() {
    fmt.Println(test.NAME) // 獲取test包的NAME變量
}

test.go

package test

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

結果:

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

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

常量

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

package main

import "fmt"

const name = "章魚喵"
const say = "喜歡我的文章,點個贊吧,或者賞杯咖啡錢"
const year = 2018

func main() {
    fmt.Println(name)
    fmt.Println(say)
    fmt.Println(year)
}

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

package main

import "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 main

import "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. 值類型:變量存儲的是數據本身,如基本數據類型:字符串,布爾型,數字等

  2. 引用類型:變量存儲的是數據所在的內存地址,如:指針,map, chan等

package main

import "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

小結

筆記總結

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔,今天18年5月份再次想寫文章,發現簡書還為我保存起的...
    Jenaral閱讀 2,830評論 2 9
  • 今天注冊了Amazon AWS賬戶,還被扣了1美元,覺得有必要了解一下它提供的各種服務。在IBM develope...
    JasonQiao閱讀 694評論 1 1
  • 2018.3.16 星期五 晴 -1℃~6℃ 親子日記61天 中午放學后,軒軒要買糖葫蘆就給他買了一個。...
    吉祥三寶159閱讀 131評論 2 1