Go之基礎語法
一、變量定義
方式一:先定義變量名,在定義類型。
var a int
方式二: 可以爲變量賦初值
var a int = 4
方式三:定義多個變量
var a, b int = 3, 4
方式四:Go可以自動識別類型
var a = "hello"
var a, b, c = 3, true, "hello"
方式五:數據類型可以省略
a := 12 // 一個變量
a, b, c, d := 3, true, "hello" // 多個變量
方式六:一個var
定義一組
var (
a = 3
b = true
c = "hello"
)
方式七:包內變量
var num int = 10
var num_1 = 34
// num_2 = 45 包內不可以這樣子定義
var (
num_3 = 5
num_4 = true
num_5 = "666"
)
func main() {
fmt.Print(num)
fmt.Print(num_1)
fmt.Print(num_3)
fmt.Print(num_4)
fmt.Print(num_5)
}
二、變量類型
2.1. 布爾型
布爾型的值只可以是常量 true 或者 false。一個簡單的例子:var b bool = true
。
2.2. 字符串
字符串就是一串固定長度的字符連接起來的字符序列。Go 的字符串是由單個字節連接起來的。Go 語言的字符串的字節使用 UTF-8
編碼標識 Unicode
文本。
2.3. 數字類型
2.3.1. 整型
名稱 | 空間 | 描述 | 範圍 |
---|---|---|---|
uint8 |
8bit |
無符號8位整型 | 0 ~ 255 |
uint16 |
16bit |
無符號16位整型 | 0 ~ 65535 |
uint32 |
32bit |
無符號32位整型 | 0 ~ 4294967295 |
uint64 |
64bit |
無符號64位整型 | 0 ~ 18446744073709551615 |
int8 |
7bit |
8位整形 | -128 ~ 127 |
int16 |
16bit |
16位整型 | -32768 ~ 32767 |
int32 |
32bit |
32位整型 | -2147483648 ~ 2147483647 |
int64 |
64bit |
64位整型 | -9223372036854775808 ~ 9223372036854775807 |
int |
系統決定 | 系統決定 | 32位系統爲int32 ,64位系統爲int64 |
2.3.2. 浮點型
名稱 | 空間 | 描述 | 範圍 | 精度 |
---|---|---|---|---|
float32 |
32bit |
32位浮點數 | IEEE-754 1.401298464324817070923729583289916131280e-45 ~ 3.402823466385288598117041834516925440e+38 | 精度6位小數 |
float64 |
64bit |
64位浮點數 | IEEE-754 4.940656458412465441765687928682213723651e-324 ~ 1.797693134862315708145274237317043567981e+308 | 精度15位小數 |
2.3.3. 複數
名稱 | 空間 | 描述 | 範圍 |
---|---|---|---|
complex64 |
64bit |
複數:float32 實數和float32 虛數 |
實數和虛數取值範圍對應float32 |
complex128 |
128bit |
複數:float64 實數和float64 虛數 |
實數和虛數取值範圍對應float64 |
2.3.4 字符型
名稱 | 空間 | 描述 | 範圍 |
---|---|---|---|
byte |
8bit |
字符型,uint8 別名 |
表示 UTF-8 字符串的單個字節的值,對應 ASCII 碼的字符值 |
rune |
34bit |
字符型,uint32 別名 |
表示 單個Unicode 字符 |
2.3.5. 指針
名稱 | 空間 | 描繪 | 範圍 |
---|---|---|---|
uintptr |
由系統決定 | 能存放指針地址即可 | 無符號整型 |
三、枚舉和常量
3.1. 枚舉
func enums() {
const (
cpp = 0
java = 1
php = 2
python = 3
golang = 4
)
fmt.Println(cpp, java, php, python, golang)
}
枚舉有一個自增值,相當於這一組枚舉值,默認從0開始自增
func enums() {
const (
cpp = iota
java
php
python
golang
)
fmt.Println(cpp, java, php, python, golang) // 0, 1, 2, 3, 4
}
可以跳過自增的值
func enums() {
const (
cpp = iota
_ // 會跳過1
php
python
golang
)
fmt.Println(cpp, php, python, golang) // 0, 2, 3, 4
}
iota
作爲自增值的種子,用作其他方面
func sizes () {
const (
b = 1 << (10 * iota)
kb
mb
gb
pb
)
fmt.Println(b, kb, mb, gb, pb) // 1 1024 1048576 1073741824 1099511627776
}
3.2. 常量
常量定義可以不定義類型
const username string = "tom"
const username = "tom"
常量作爲數值類型的時候可以自己轉換不需要我們做強制類型轉化
func consts () {
const username string = "tom"
const a, b = 3, 5
// math.Sqrt 參數時需要float64的類型,但是a,b是我們沒有頂義類型
var c = int(math.Sqrt(a * a + b * b))
fmt.Println(username, a, b, c)
}
四、條件語句
4.1. if
語句
if
條件是不需要加括號的
func main() {
// 讀取文件內容
contents, err := ioutil.ReadFile("hello.txt")
if err != nil {
fmt.Print(err)
} else {
fmt.Println(string(contents))
}
}
if
條件裏面可以賦值,並且這個賦值的變臉作用於僅在if
語句裏面
func main() {
if contents, err := ioutil.ReadFile("hello.txt"); err != nil {
fmt.Print(err)
} else {
fmt.Println(string(contents))
}
}
4.2. switch
語句
switch
語句是不需要添加break
func arithmetic(a, b int, opera string) int {
var result int
switch opera {
case "+":
result = a + b
case "-":
result = a - b
case "x":
result = a * b
case "/":
result = a / b
default:
panic("爲知操作符:" + opera)
}
return result
}
func main() {
fmt.Println(arithmetic(9, 7, "+")) // 16
fmt.Println(arithmetic(9, 7, "-")) // 2
fmt.Println(arithmetic(9, 7, "x")) // 63
fmt.Println(arithmetic(9, 7, "/")) // 1
fmt.Println(arithmetic(9, 7, "&")) // panic: 爲知操作符:&
}
switch
後可以沒有表達式
func grade(score int) string {
result := ""
switch {
case score < 0 || score > 100:
panic(fmt.Sprintln("分數範圍不正確")) // panic會直接中斷程序
case score < 60:
result = "及格"
case score < 70:
result = "良好"
case score < 80:
result = "優秀"
case score < 90:
result = "突出"
}
return result
}
func main() {
fmt.Println(
grade(0),
grade(59),
grade(69),
grade(79),
grade(89),
grade(99),
grade(100),
)
}
五、循環
for
循環不需要括號
func add() int {
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
return sum
}
func main() {
fmt.Println(add())
}
for
的條件裏面可以省略初始條件
func less(num int) {
for ; num > 0; num-- {
fmt.Println(num)
}
}
func main() {
// 給定一個數減到0
less(10)
}
for
的條件裏面可以省略初始條件、結束條件
func less1(num int) {
for num > 0 {
num--
fmt.Println(num)
}
}
func main() {
less1(10)
}
for
可以作爲死循環
func forever() {
for {
fmt.Println("66666")
}
}
func main() {
forever()
}
六、函數
6.1. 函數定義
func function_name( [parameter list] ) [return_types] {
函數體
}
上面我們已經使用很多個關於函數的例子,在舉一個例子
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
6.2. 函數調用
可以再其他函數中調用或者在main函數中調用
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func main() {
fmt.Println(max(4, 6))
}
6.3. 返回多個值
func res_to(a, b string) (string, string) {
return b, a
}
func main() {
a, b := res_to("hello", "world")
fmt.Println(a, b)
}
還有更加簡單的寫法
func div(a, b int) (q, r int) {
q = q / b
r = a % b
return // 自動返回
}
func main() {
q, r := div(10, 6)
fmt.Println(q, r)
}
我們有時候對於多返回值我們只希望使用一個:用下劃線代表不使用的返回值
func div(a, b int) (q, r int) {
q = q / b
r = a % b
return // 自動返回
}
func main() {
q, _ := div(10, 6)
fmt.Println(q)
}
6.4. 可變參數列表
func sumParams(values ... int) int {
sum := 0
for i := range values {
sum += values[i]
}
return sum
}
func main() {
fmt.Println(sumParams(1, 2, 3, 4, 5, 6))
}
6.5. 函數可以做爲參數使用
func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func apply(opera func(int, int) int, a, b int) int {
return opera(a, b)
}
func main() {
fmt.Println(apply(max, 10, 50))
}
七、指針
7.1. 指針定義
var num int = 23
var pr *int = &num
*pr = 45
fmt.Println(num)
7.2. 指針在函數中的使用
Go
語言函數只有值傳遞。修改函數參數,是無法修改原值的
func swap(a, b int) {
b, a = a, b
}
func main() {
a, b := 4, 3
fmt.Println(a, b) // 4, 3
swap(a, b)
fmt.Println(a, b) // 4, 3
}
如何修改就需要使用指針
func swap(a, b *int) {
*b, *a = *a, *b
}
func main() {
a, b := 4, 3
fmt.Println(a, b) // 4, 3
swap(&a, &b)
fmt.Println(a, b) // 3, 4
}