📢 本文由 gemini-3-flash-preview 翻譯
Golang 系列
Hello GoLang:
https://blog.yexca.net/archives/154
GoLang (var and const) 變數與常數: 本文
GoLang (func) 函式:
https://blog.yexca.net/archives/156
GoLang (slice and map) 切片:
https://blog.yexca.net/archives/160
GoLang (OOP) 物件導向:
https://blog.yexca.net/archives/162
GoLang (reflect) 反射:
https://blog.yexca.net/archives/204
GoLang (struct tag) 結構體標籤:
https://blog.yexca.net/archives/205
GoLang (goroutine) Goroutine:
https://blog.yexca.net/archives/206
GoLang (channel) 通道:
https://blog.yexca.net/archives/207
變數
宣告變數一般使用 var 關鍵字
單一變數
不指定初始值的宣告,預設為 0
1
2
3
4
5
6
7
8
| package main
import "fmt"
func main() {
var a int
fmt.Println("a =", a)
}
|
指定初始值,a 為 100
1
2
3
4
5
6
7
8
| package main
import "fmt"
func main() {
var a int = 100
fmt.Println("a =", a)
}
|
在宣告時不指定型別的話,Go 會自動推導變數型別
1
2
3
4
5
6
7
8
9
10
11
12
| package main
import (
"fmt"
"reflect"
)
func main() {
var a = 100
fmt.Println("a =", a)
fmt.Printf("Type of a = %s", reflect.TypeOf(a))
}
|
基於省略型別會自動推導,可以使用 := 直接宣告變數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"fmt"
"reflect"
)
func main() {
p := 3.14
fmt.Println("p =", p)
fmt.Printf("Type of p is %s", reflect.TypeOf(p))
}
/*
* 輸出
* p = 3.14
* Type of p is float64
*/
|
多重變數
1
2
3
4
5
6
7
8
9
| package main
import "fmt"
func main() {
var a, b int
fmt.Println("a =", a)
fmt.Println("b =", b)
}
|
1
2
3
4
5
6
7
8
9
| package main
import "fmt"
func main() {
var a, b int = 100, 200
fmt.Println("a =", a)
fmt.Println("b =", b)
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| package main
import (
"fmt"
"reflect"
)
func main() {
var a, b = 100, 3.14
fmt.Println("a =", a)
fmt.Printf("Type of a is %s\n", reflect.TypeOf(a))
fmt.Println("b =", b)
fmt.Printf("Type of b is %s", reflect.TypeOf(b))
}
/*
* 輸出
* a = 100
* Type of a is int
* b = 3.14
* Type of b is float64
*/
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| package main
import (
"fmt"
"reflect"
)
func main() {
a, b := 100, "Hello"
fmt.Println("a =", a)
fmt.Printf("Type of a is %s\n", reflect.TypeOf(a))
fmt.Println("b =", b)
fmt.Printf("Type of b is %s", reflect.TypeOf(b))
}
|
字串型別在 Go 裡面是一個結構,包含指向底層陣列的指標和長度,這兩部分各佔 8 個位元組,所以字串型別大小為 16 個位元組
可以使用 unsafe.Sizeof() 函式查看型別佔用空間
全局變數
全局變數的宣告不能使用 :=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package main
import (
"fmt"
"reflect"
)
var a, b int
func main() {
fmt.Println("a =", a)
fmt.Printf("Type of a is %s\n", reflect.TypeOf(a))
fmt.Println("b =", b)
fmt.Printf("Type of b is %s", reflect.TypeOf(b))
}
|
或者使用分解的寫法,這種寫法一般用於全局變數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| package main
import (
"fmt"
"reflect"
)
var (
a int = 1
b string = "Go"
)
func main() {
fmt.Println("a =", a)
fmt.Printf("Type of a is %s\n", reflect.TypeOf(a))
fmt.Println("b =", b)
fmt.Printf("Type of b is %s", reflect.TypeOf(b))
}
|
常數
常數一般用 const 關鍵字定義
定義
1
2
3
4
5
6
7
8
| package main
import "fmt"
func main() {
const c int = 9
fmt.Println("c = ", c)
}
|
也可以省略型別
1
2
3
4
5
6
7
8
| package main
import "fmt"
func main() {
const c = 9
fmt.Println("c = ", c)
}
|
列舉
常數定義可用於列舉
1
2
3
4
5
6
7
8
9
| package main
func main() {
const (
BEIJING = 0
SHANGHAI = 1
SHENZHEN = 2
)
}
|
iota 自增
上述列舉以 0 開始遞增,可以使用 iota 代替
1
2
3
4
5
6
7
8
9
10
11
12
13
| package main
import "fmt"
func main() {
const (
BEIJING = iota // 0
SHANGHAI // 1
SHENZHEN // 2
)
fmt.Println(BEIJING, SHANGHAI, SHENZHEN)
}
|
iota 可以用於運算式,但一般用於自增