# 1.7 變量和聲明
這將是美好的開始和結束,通過寫下`x = 4`,我們查看變量,可以說聲明了一個變量并賦值,但是很不幸,go語言變量聲明和賦值比這更復雜。通過學習一些簡單的示例開始學習變量聲明和賦值。然后在下一章,當我們創建并使用結構體時,我們會深入學習。盡管如此,你需要花一些時間去適應。
你可能會驚訝,為什么會如此復雜,讓我們以一些例子開始學習。
在go中最直接的方式去聲明變量并賦值也是最繁瑣的:
```go
package main
import (
"fmt"
)
func main() {
var power int
power = 9000
fmt.Printf("It's over %d\n", power)
}
```
在這里我們聲明了一個`int`型變量`power`。默認情況下,go會給`power`賦一個`0`值。整型賦`0`,布爾型賦`false`,字符串型賦`""`等。然后,我們將`9000`賦值給變量`power`。我們也可以將2行代碼合并成一行:
`var power int = 9000`
雖然需要輸入很多。go有一種方便簡潔的變量聲明操作符:`:=`,go可以推斷變量的類型:
`power := 9000`
這里有一個簡潔的寫法,通過函數也能正常工作:
```go
func main() {
power := getPower()
}
func getPower() int {
return 9001
}
```
這里需要謹記,`:=`用于聲明一個變量并給變量賦值。為什么會這樣?因為一個變量不能被聲明2次(不在相同的代碼范圍)。如果你試著運行下面代碼,你將會得到一個錯誤信息。
```go
func main() {
power := 9000
fmt.Printf("It's over %d\n", power)
// COMPILER ERROR:
// no new variables on left side of :=
power := 9001
fmt.Printf("It's also over %d\n", power)
}
```
編譯器會提示`:=`左邊不是一個新變量。這意味著當我們第一次聲明變量時,我們使用`:=`。但是在隨后的賦值,我們要使用`=`。這有很多意義,但這也隨時提醒著你何時該使用`:=`和`=`。
如果你仔細閱讀錯誤信息,你將發現有多個變量。因為go支持多個變量同時賦值(使用`=`或者`:=`):
```go
func main() {
name, power := "Goku", 9000
fmt.Printf("%s's power is over %d\n", name, power)
}
```
另外,如果一個變量是新變量也可以使用`:=`進行賦值。例如:
```go
func main() {
power := 1000
fmt.Printf("default power is %d\n", power)
name, power := "Goku", 9000
fmt.Printf("%s's power is over %d\n", name, power)
}
```
盡管變量`power`使用了`:=`,但是編譯器不會在第2次使用`:=`時報錯,因為這里有一個變量`name`,這是一個新的變量,允許使用`:=`。但是你不能改變`power`的類型。它已經被聲明成一個整型,只能賦值整數。
現在,需要知道的最后一件事是,類似包導入,go程序中不能存在未使用的變量,例如:
```go
func main() {
name, power := "Goku", 1000
fmt.Printf("default power is %d\n", power)
}
```
這段代碼不能編譯,因為變量`name`已經聲明,但是沒有被使用。類似未使用的導入包,可能這會讓你有點失望,但是總的來看,我認為這是為了讓代碼更加的簡潔和具有可讀性。
接下來不在介紹關于變量的聲明和賦值相關內容了。現在,你只需要記住使用`var NAME TYPE`聲明一個變量,并且變量的初始值為它相應類型的零值,使用`NAME := VALUE`聲明一個變量并賦值,使用`NAME = VALUE`去給已經聲明過的變量賦值。
## 鏈接
- 關于本書
- 引言
- 準備工作
- 安裝開發環境
- 開始使用Go
- 創建一個Go模塊
- 第1章:基礎知識
- 1.1 編譯
- 1.2 靜態類型
- 1.3 類c語法
- 1.4 垃圾回收
- 1.5 運行go代碼
- 1.6 導入包
- 1.7 變量和聲明
- 1.8 函數聲明
- 1.9 繼續之前
- 第2章:語法學習
- 2.1 聲明和初始化
- 2.2 結構體上的函數
- 2.3 構造函數
- 2.4 new
- 2.5 結構體字段
- 2.6 組合
- 2.7 指針類型和值類型
- 2.8 繼續之前
- 第3章:復雜類型
- 3.1 數組
- 3.2 切片
- 3.3 映射
- 3.4 指針類型和值類型
- 3.5 繼續之前
- 第4章:面向對象
- 4.1 包
- 4.2 接口
- 4.3 繼續之前
- 第5章:綜合知識
- 5.1 錯誤處理
- 5.2 defer
- 5.3 go語言風格
- 5.4 初始化的if
- 5.5 空接口和轉換
- 5.6 字符串和字節數組
- 5.7 函數類型
- 5.8 內存分配
- 第6章:高并發
- 6.1 go協程
- 6.2 同步
- 6.3 通道
- 6.4 繼續之前
- 第7章:工具庫
- 7.1 類型轉換
- 7.2 時間操作
- 第8章:程序測試
- 單元測試
- 性能測試
- 第9章:簡單實例
- 內存分配
- 第10章:項目實戰
- 結論
- 附錄