Golang是靜態類型語言,不能在運行期間改變變量類型。
變量
var 語句定義了一個變量的列表;跟函數的參數列表一樣,類型在后面。
初始化變量
使用關鍵字 var 定義變量,自動初始化為零值。如果提供初始化值,可省略變量類型,由編譯器自動推斷。
~~~
package main
var x int
var f float32 = 1.6
var s = "abc"
func main() {
}
~~~
一次性定義多個變量。
~~~
package main
var x, y, z int
var s, n = "abc", 123
var (
a int
b float32
)
func main() {
n, s := 0x1234, "Hello, World!"
println(x, s, n)
}
~~~
輸出結果:
~~~
0 Hello, World! 4660
~~~
多變量賦值時,先計算所有相關值,然后再從左到右依次賦值。
~~~
package main
import "fmt"
func main() {
data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
fmt.Println(i, data)
}
~~~
輸出結果:
~~~
2 [100 1 2]
~~~
變量定義可以包含初始值,每個變量對應一個。
~~~
package main
var i, j int = 1, 2
func main() {
}
~~~
如果初始化是使用表達式,則可以省略類型;變量從初始值中獲得類型。
~~~
package main
var c, python, java = true, false, "no!"
func main() {
}
~~~
短聲明變量
在函數內部,可以使用更簡略的 ":=" 方式定義變量。":=" 簡潔賦值語句在明確類型的地方,可以用于替代 var 定義。
~~~
package main
import (
"fmt"
)
var c, python, java = true, false, "no!"
func main() {
k := 3
c, python, java := false, true, "yes!"
fmt.Println(c, python, java, k)
//注意檢查,是定義新的局部變量,還是修改全局變量。該方式容易造成錯誤!
}
~~~
輸出結果:
~~~
false true yes! 3
~~~
函數外的每個語句都必須以關鍵字開始( var 、 func 、等等), ":=" 結構不能使用在函數外。
特殊只寫變量 "_",用于忽略值占位。
~~~
package main
func test() (int, string) {
return 1, "abc"
}
func main() {
_, s := test()
println(s)
}
~~~
輸出結果:
~~~
abc
~~~
編譯器會將未使 的局部變量當做錯誤。
~~~
package main
var s string // 全局變量沒問題。
func main() {
i := 0 // ./main.go:6:7: i declared and not used
(可使 "_ = i" 規避)
}
~~~
注意重新賦值與定義新同名變量的區別。
~~~
package main
func main() {
s := "abc"
println(&s)
s, y := "hello", 20 // 重新賦值: 與前 s 在同 層次的代碼塊中,且有新的變量被定義。
println(&s, y) // 通常函數多返回值 err 會被重復使用。
{
s, z := 1000, 30 // 定義新同名變量: 不在同 層次代碼塊。
println(&s, z)
}
}
~~~
輸出結果:
~~~
0xc42003df60
0xc42003df60 20
0xc42003df58 30
~~~
Go 語言變量作用域
作用域為已聲明標識符所表示的常量、類型、變量、函數或包在源代碼中的作用范圍。
Go 語言中變量可以在三個地方聲明:
~~~
函數內定義的變量稱為局部變量
函數外定義的變量稱為全局變量
函數定義中的變量稱為形式參數
~~~
接下來讓我們具體了解局部變量、全局變量和形式參數。
局部變量
在函數體內聲明的變量稱之為局部變量,它們的作用域只在函數體內,參數和返回值變量也是局部變量。
以下實例中 main() 函數使用了局部變量 a, b, c:
~~~
package main
import "fmt"
func main() {
/* 聲明局部變量 */
var a, b, c int
/* 初始化參數 */
a = 10
b = 20
c = a + b
fmt.Printf("結果: a = %d, b = %d and c = %d\n", a, b, c)
}
~~~
輸出結果:
~~~
結果: a = 10, b = 20 and c = 30
~~~
全局變量
在函數體外聲明的變量稱之為全局變量,全局變量可以在整個包甚至外部包(被導出后)使用。
全局變量可以在任何函數中使用,以下實例演示了如何使用全局變量:
~~~
package main
import "fmt"
/* 聲明全局變量 */
var g int
func main() {
/* 聲明局部變量 */
var a, b int
/* 初始化參數 */
a = 10
b = 20
g = a + b
fmt.Printf("結果: a = %d, b = %d and g = %d\n", a, b, g)
}
~~~
輸出結果:
~~~
結果: a = 10, b = 20 and g = 30
~~~
Go 語言程序中全局變量與局部變量名稱可以相同,但是函數內的局部變量會被優先考慮。實例如下:
~~~
package main
import "fmt"
/* 聲明全局變量 */
var g int = 20
func main() {
/* 聲明局部變量 */
var g int = 10
fmt.Printf("結果: g = %d\n", g)
}
~~~
輸出結果:
~~~
結果: g = 10
~~~
形式參數
形式參數會作為函數的局部變量來使用。實例如下:
~~~
package main
import "fmt"
/* 聲明全局變量 */
var a int = 20
func main() {
/* main 函數中聲明局部變量 */
var a int = 10
var b int = 20
var c int = 0
fmt.Printf("main()函數中 a = %d\n", a)
c = sum(a, b)
fmt.Printf("main()函數中 c = %d\n", c)
}
/* 函數定義-兩數相加 */
func sum(a, b int) int {
fmt.Printf("sum() 函數中 a = %d\n", a)
fmt.Printf("sum() 函數中 b = %d\n", b)
return a + b
}
~~~
輸出結果:
~~~
main()函數中 a = 10
sum() 函數中 a = 10
sum() 函數中 b = 20
main()函數中 c = 30
~~~
不同類型的局部和全局變量默認值:
全局:
~~~
package main
import "fmt"
var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string
func main() {
fmt.Printf("全局變量: bool 默認值:%v\n", b)
fmt.Printf("全局變量: int 默認值:%v\n", i)
fmt.Printf("全局變量: int8 默認值:%v\n", i8)
fmt.Printf("全局變量: int16 默認值:%v\n", i16)
fmt.Printf("全局變量: int32 默認值:%v\n", i32)
fmt.Printf("全局變量: int64 默認值:%v\n", i64)
fmt.Printf("全局變量: int64 默認值:%v\n", i64)
fmt.Printf("全局變量: uint 默認值:%v\n", ui)
fmt.Printf("全局變量: uint8 默認值:%v\n", ui8)
fmt.Printf("全局變量: uint16 默認值:%v\n", ui16)
fmt.Printf("全局變量: uint32 默認值:%v\n", ui32)
fmt.Printf("全局變量: uint64 默認值:%v\n", ui64)
fmt.Printf("全局變量: uint64 默認值:%v\n", ui64)
fmt.Printf("全局變量: float32 默認值:%v\n", f32)
fmt.Printf("全局變量: float64 默認值:%v\n", f64)
fmt.Printf("全局變量: string 默認值:%v\n", s)
}
~~~
輸出結果:
~~~
全局變量: bool 默認值:false
全局變量: int 默認值:0
全局變量: int8 默認值:0
全局變量: int16 默認值:0
全局變量: int32 默認值:0
全局變量: int64 默認值:0
全局變量: int64 默認值:0
全局變量: uint 默認值:0
全局變量: uint8 默認值:0
全局變量: uint16 默認值:0
全局變量: uint32 默認值:0
全局變量: uint64 默認值:0
全局變量: uint64 默認值:0
全局變量: float32 默認值:0
全局變量: float64 默認值:0
全局變量: string 默認值:
~~~
局部:
~~~
package main
import "fmt"
func main() {
var b bool
var i int
var i8 int8
var i16 int16
var i32 int32
var i64 int64
var ui uint
var ui8 uint8
var ui16 uint16
var ui32 uint32
var ui64 uint64
var f32 float32
var f64 float64
var s string
fmt.Printf("局部變量: bool 默認值:%v\n", b)
fmt.Printf("局部變量: int 默認值:%v\n", i)
fmt.Printf("局部變量: int8 默認值:%v\n", i8)
fmt.Printf("局部變量: int16 默認值:%v\n", i16)
fmt.Printf("局部變量: int32 默認值:%v\n", i32)
fmt.Printf("局部變量: int64 默認值:%v\n", i64)
fmt.Printf("局部變量: int64 默認值:%v\n", i64)
fmt.Printf("局部變量: uint 默認值:%v\n", ui)
fmt.Printf("局部變量: uint8 默認值:%v\n", ui8)
fmt.Printf("局部變量: uint16 默認值:%v\n", ui16)
fmt.Printf("局部變量: uint32 默認值:%v\n", ui32)
fmt.Printf("局部變量: uint64 默認值:%v\n", ui64)
fmt.Printf("局部變量: uint64 默認值:%v\n", ui64)
fmt.Printf("局部變量: float32 默認值:%v\n", f32)
fmt.Printf("局部變量: float64 默認值:%v\n", f64)
fmt.Printf("局部變量: string 默認值:%v\n", s)
}
~~~
輸出結果:
~~~
局部變量: bool 默認值:false
局部變量: int 默認值:0
局部變量: int8 默認值:0
局部變量: int16 默認值:0
局部變量: int32 默認值:0
局部變量: int64 默認值:0
局部變量: int64 默認值:0
局部變量: uint 默認值:0
局部變量: uint8 默認值:0
局部變量: uint16 默認值:0
局部變量: uint32 默認值:0
局部變量: uint64 默認值:0
局部變量: uint64 默認值:0
局部變量: float32 默認值:0
局部變量: float64 默認值:0
局部變量: string 默認值:
~~~
- 序言
- 目錄
- 環境搭建
- Linux搭建golang環境
- Windows搭建golang環境
- Mac搭建golang環境
- 介紹
- 1.Go語言的主要特征
- 2.golang內置類型和函數
- 3.init函數和main函數
- 4.包
- 1.工作空間
- 2.源文件
- 3.包結構
- 4.文檔
- 5.編寫 Hello World
- 6.Go語言 “ _ ”(下劃線)
- 7.運算符
- 8.命令
- 類型
- 1.變量
- 2.常量
- 3.基本類型
- 1.基本類型介紹
- 2.字符串String
- 3.數組Array
- 4.類型轉換
- 4.引用類型
- 1.引用類型介紹
- 2.切片Slice
- 3.容器Map
- 4.管道Channel
- 5.指針
- 6.自定義類型Struct
- 編碼格式轉換
- 流程控制
- 1.條件語句(if)
- 2.條件語句 (switch)
- 3.條件語句 (select)
- 4.循環語句 (for)
- 5.循環語句 (range)
- 6.循環控制Goto、Break、Continue
- 函數
- 1.函數定義
- 2.參數
- 3.返回值
- 4.匿名函數
- 5.閉包、遞歸
- 6.延遲調用 (defer)
- 7.異常處理
- 8.單元測試
- 壓力測試
- 方法
- 1.方法定義
- 2.匿名字段
- 3.方法集
- 4.表達式
- 5.自定義error
- 接口
- 1.接口定義
- 2.執行機制
- 3.接口轉換
- 4.接口技巧
- 面向對象特性
- 并發
- 1.并發介紹
- 2.Goroutine
- 3.Chan
- 4.WaitGroup
- 5.Context
- 應用
- 反射reflection
- 1.獲取基本類型
- 2.獲取結構體
- 3.Elem反射操作基本類型
- 4.反射調用結構體方法
- 5.Elem反射操作結構體
- 6.Elem反射獲取tag
- 7.應用
- json協議
- 1.結構體轉json
- 2.map轉json
- 3.int轉json
- 4.slice轉json
- 5.json反序列化為結構體
- 6.json反序列化為map
- 終端讀取
- 1.鍵盤(控制臺)輸入fmt
- 2.命令行參數os.Args
- 3.命令行參數flag
- 文件操作
- 1.文件創建
- 2.文件寫入
- 3.文件讀取
- 4.文件刪除
- 5.壓縮文件讀寫
- 6.判斷文件或文件夾是否存在
- 7.從一個文件拷貝到另一個文件
- 8.寫入內容到Excel
- 9.日志(log)文件
- server服務
- 1.服務端
- 2.客戶端
- 3.tcp獲取網頁數據
- 4.http初識-瀏覽器訪問服務器
- 5.客戶端訪問服務器
- 6.訪問延遲處理
- 7.form表單提交
- web模板
- 1.渲染終端
- 2.渲染瀏覽器
- 3.渲染存儲文件
- 4.自定義io.Writer渲染
- 5.模板語法
- 時間處理
- 1.格式化
- 2.運行時間
- 3.定時器
- 鎖機制
- 互斥鎖
- 讀寫鎖
- 性能比較
- sync.Map
- 原子操作
- 1.原子增(減)值
- 2.比較并交換
- 3.導入、導出、交換
- 加密解密
- 1.md5
- 2.base64
- 3.sha
- 4.hmac
- 常用算法
- 1.冒泡排序
- 2.選擇排序
- 3.快速排序
- 4.插入排序
- 5.睡眠排序
- 設計模式
- 創建型模式
- 單例模式
- 抽象工廠模式
- 工廠方法模式
- 原型模式
- 結構型模式
- 適配器模式
- 橋接模式
- 合成/組合模式
- 裝飾模式
- 外觀模式
- 享元模式
- 代理模式
- 行為性模式
- 職責鏈模式
- 命令模式
- 解釋器模式
- 迭代器模式
- 中介者模式
- 備忘錄模式
- 觀察者模式
- 狀態模式
- 策略模式
- 模板模式
- 訪問者模式
- 數據庫操作
- golang操作MySQL
- 1.mysql使用
- 2.insert操作
- 3.select 操作
- 4.update 操作
- 5.delete 操作
- 6.MySQL事務
- golang操作Redis
- 1.redis介紹
- 2.golang鏈接redis
- 3.String類型 Set、Get操作
- 4.String 批量操作
- 5.設置過期時間
- 6.list隊列操作
- 7.Hash表
- 8.Redis連接池
- golang操作ETCD
- 1.etcd介紹
- 2.鏈接etcd
- 3.etcd存取
- 4.etcd監聽Watch
- golang操作kafka
- 1.kafka介紹
- 2.寫入kafka
- 3.kafka消費
- golang操作ElasticSearch
- 1.ElasticSearch介紹
- 2.kibana介紹
- 3.寫入ElasticSearch
- NSQ
- 安裝
- 生產者
- 消費者
- beego框架
- 1.beego框架環境搭建
- 2.參數配置
- 1.默認參數
- 2.自定義配置
- 3.config包使用
- 3.路由設置
- 1.自動匹配
- 2.固定路由
- 3.正則路由
- 4.注解路由
- 5.namespace
- 4.多種數據格式輸出
- 1.直接輸出字符串
- 2.模板數據輸出
- 3.json格式數據輸出
- 4.xml格式數據輸出
- 5.jsonp調用
- 5.模板處理
- 1.模板語法
- 2.基本函數
- 3.模板函數
- 6.請求處理
- 1.GET請求
- 2.POST請求
- 3.文件上傳
- 7.表單驗證
- 1.表單驗證
- 2.定制錯誤信息
- 3.struct tag 驗證
- 4.XSRF過濾
- 8.靜態文件處理
- 1.layout設計
- 9.日志處理
- 1.日志處理
- 2.logs 模塊
- 10.會話控制
- 1.會話控制
- 2.session 包使用
- 11.ORM 使用
- 1.鏈接數據庫
- 2. CRUD 操作
- 3.原生 SQL 操作
- 4.構造查詢
- 5.事務處理
- 6.自動建表
- 12.beego 驗證碼
- 1.驗證碼插件
- 2.驗證碼使用
- beego admin
- 1.admin安裝
- 2.admin開發
- beego 熱升級
- gin框架
- 安裝使用
- 項目
- 秒殺項目
- 日志收集
- 面試題
- 面試題一
- 面試題二
- 錯題集
- Go語言陷阱和常見錯誤
- 常見語法錯誤
- 初級
- 中級
- 高級
- Go高級應用
- goim
- goim 啟動流程
- goim 工作流程
- goim 結構體
- gopush
- gopush工作流程
- gopush啟動流程
- gopush業務流程
- gopush應用
- gopush新添功能
- rpc
- HTTP RPC
- TCP RPC
- JSON RPC
- 常見RPC開源框架
- pprof
- pprof介紹
- pprof應用
- 封裝 websocket
- zookeeper
- 基本操作測試
- 簡單的分布式server
- Zookeeper命令行使用
- cgo
- Go語言 demo
- 用Go語言計算一個人的年齡,生肖,星座
- 超簡易Go語言實現的留言板代碼
- 信號處理模塊,可用于在線加載配置,配置動態加載的信號為SIGHUP
- 陽歷和陰歷相互轉化的工具類 golang版本
- 錯誤總結