入坑Go語言(一)—— 基礎語法

入坑Go語言(一)—— 基礎語法

原文發布在我的個人博客

入坑Go語言(一)|以太空間?

blog.io-code.com

最近看到Github上好多following都在學習Go語言(又稱Golang),心裏面很痒痒,趁著下午這點空隙,學習一下這個可愛的土撥鼠。

一、安裝配置相關

Go語言的安裝很是傻瓜式,從它的官網直接下載相應系統的安裝包安裝即可,就像我們平常安裝軟體,下一步,下一步……

安裝完成之後,我們要配置以下Go的環境變數,在當前用戶家目錄下的.bash_profile添加以下幾行

export GOROOT=/usr/local/goexport GOPATH=$HOME/goexport GOBIN=$GOPATH/binexport PATH=$PATH:$GOBIN

解釋一下GOROOTGOPATH的區別:

GOROOT是Go語言安裝目錄(可選設置,1.8版本之後有默認值)

GOPATH是Go語言的工作空間,我們寫的項目代碼都是要放到這個裡面的(可選設置,可以有多個值,1.8版本之後有默認值)

一個需要商榷的地方就是,如果我有很多用Go語言開發的項目,該怎麼組織呢?

有兩種組織方式:

一個項目作為一個gopath

一個項目作為當前gopath的一個包

這兩種方式各有利弊,詳細請轉以下知乎鏈接:

大家現在go項目如何管理的?

至於IDE,當然是選萬能的VS Code了,裝個Go插件,看起來很完美。

二、常用命令

  • go build:編譯源碼文件、代碼包、依賴包
  • go run:編譯並運行Go源碼文件
  • go get:遠程獲取代碼包

三、語法基礎

// 程序所屬包package main// 導入依賴包import "fmt"// NAME 常量定義const NAME string = "Im chenwengang"// 全局變數var mainName = "main mian"// MyInt 類型聲明type MyInt int// MyStruct 結構聲明type MyStruct struct {}// 介面聲明type iInter interface {}// 函數定義func learn() { fmt.Println("learn")}// main函數, 入口函數func main() { fmt.Println("Hello World") learn()}

四、基礎數據類型

1. 分類

Go語言的基礎數據類型有以下幾種:

  • 整型
  • 浮點型
  • 複數
  • 字元串
  • 布爾值

關於這些數據類型的詳細我不再贅述,參考這個鏈接

在上面這個鏈接中,各位看到光整型就int8int16int32等好多種,這是為了充分利用內存,舉個例子,當想存放一個1000以內的數時候,int8是最省內存的,所以就選用int8,如果在10萬左右,就用int16

在Go語言中,字元串的統一編碼是UTF-8

2. 類型零值

類型零值不是空值,是某個變數被聲明後的默認值:數值類型的默認值是0(複數是0=0i ),布爾型默認值是false,string默認值是空字元串

3. 類型別名

type [別名] int32

跟C語言的typedef作用一樣,但是原名別名位置是反過來的。

五、變數

1. 聲明

Go語言的變數聲明基本和C語言是類似的,不過也有一些不同之處,我們通過代碼來看:

// 類型在變數名後面var x int// 分組聲明var ( x int = 2, y float32 = 1.0, z string = "x")// 聲明並賦值var a int, b float32, c string = 1, 1.0, "x"var a,b,c int = 1,2,3a,b := 1,2

全部變數必須使用var關鍵字,局部變數可以省略但是必須用:=

_這個特殊變數就是個垃圾桶

2. 類型轉換

Go語言必須是顯式轉換,而且只能發生在兩種兼容類型之間。

y := 1.0var x = int(y)

3. 可見性

  • 大寫字元開頭的變數是可以從其他包訪問到的
  • 小寫字元開頭的變數只能在本包內使用

六、常量

1. 聲明

const identifier [type] = [value]

常量只支持布爾型、數值型、字元串型

2. iota

  • iota在const出現時(每一次)會被重置為0
  • const每新增一行將會iota+1
  • 只能在const出現的地方使用

const ( a = iota b = iota c = iota)const d = iota// 最後a=0,b=1,c=2,d=0

const ( a = iota b = iota _ c = iota)// 最後a=0,b=1,c=3

3. 一個有趣的現象

看下面這段代碼:

const X = 1const ( a = X * 2 b c)// 最後a=2,b=2,c=2

這是因為分組const常量聲明如果沒有賦值,它會在本組內自動尋找上面最近的表達式作為自己等號右邊的表達式,上面的代碼就相當於:

const X = 1const ( a = X * 2 b = X * 2 c = X * 2)

沿用表達式必須要求結構相同,也就是說c, d只能沿用a, b = X, X *2這樣的

七、運算符

算術運算符、比較運算符、邏輯運算符、按位運算符、賦值運算符與C語言是相同的

但是有一點不同,Go語言中的++--只能放在變數後面,而且只能作為語句,不能作為表達式,看下面這段代碼:

// 正確的a := 1a++fmt.Println(a)// 錯誤的a := 1fmt.Println(a++)

八、流程式控制制

Go語言流程語句與C語言的區別是,判斷條件的地方不用加小括弧

1. 條件語句

if x < 1 { fmt.Println(x)} else if x < 5 { fmt.Println(x-5)} else {}

2. 選擇語句

switch x { case 1: ... case 2: ...}

case後面跟著的條件必須類型相同

3. 循環語句

// 普通for循環for a:=2;a<10;a++ { ...}// 代替whilefor a < 10 { ...}// 無限循環for {}

4. breakcontinuegoto

和C語言相同


推薦閱讀:

要獲得「機器學習或數據科學」的工作,到底選哪種編程語言更好?
字元指針數組的使用--替換人名-題目分析
理論上最好的編程語言: 封裝定則篇
一晚上糊出一個語言「前端」
AppleScript類自然語言與非英語語法設計

TAG:編程語言 | Go語言 |