Go語言基礎語法(一)
本文介紹一些Go語言的基礎語法。
目錄go簡單小例子
先來看一個簡單的go語言程式碼:
package main import "fmt" // 加法運算 func add(x, y int) int { return x + y } func init() { fmt.Println("main init....") } func main() { var value1 int = 2 var value2 = 3 sum := add(value1,value2) fmt.Printf("%d + %d = %d",value1,value2,sum) }
package main
:定義package 包名稱為main,表示當前檔案所屬的包import "fmt"
:匯入Go標準庫中的 fmt 模組,主要用於列印輸出。go提供了很多標準庫,具體可參考Golang標準庫文件。init()
:init()函式在main()函式之前執行。main()
:main函式,是當前程式的入口,init()以及main()函式都無法被顯式的呼叫。
go語言的註釋方法:
- 單行註釋:
//
- 多行註釋:
/* */
程式碼執行結果:
$ go run demo.go
main init....
2 + 3 = 5
下面來進一步介紹go的基礎語法。
格式化輸出
go語言中格式化輸出可以使用 fmt 和 log 這兩個標準庫,
fmt
常用方法:
fmt.Printf
:格式化輸出fmt.Println
:僅列印,不能轉義,會在輸出結束後新增換行符。fmt.Print
:和Println類似,但不新增換行符。fmt.Sprintf
:格式化字串並賦值給新的字串
示例程式碼:
package main import ( "fmt" ) func main() { var age = 22 fmt.Printf("I'm %d years old\n", age) str1 := "Hello world !" fmt.Printf("%s\n", str1) fmt.Printf(str1) fmt.Print("\n") str_hex := fmt.Sprintf("% 02x", str1) fmt.Printf("type of str_hex: %T\n", str_hex) fmt.Println(str_hex) }
執行結果:
I'm 22 years old
Hello world !
Hello world !
type of str_hex: string
48 65 6c 6c 6f 20 77 6f 72 6c 64 20 21
更多格式化方法可以訪問https://studygolang.com/pkgdoc中的fmt包。
log
log包實現了簡單的日誌服務,也提供了一些格式化輸出的方法。
log.Printf
:格式化輸出,和fmt.Printf類似log.Println
:和fmt.Println類似log.Print
:和fmt.Print類似
package main
import (
"log"
)
func main() {
var age = 22
log.Printf("I'm %d years old", age)
str1 := "Hello world !"
log.Println(str1)
log.Print(str1)
log.Printf("%s", str1)
}
執行結果:
2021/08/12 16:52:12 I'm 22 years old
2021/08/12 16:52:12 Hello world !
2021/08/12 16:52:12 Hello world !
2021/08/12 16:52:12 Hello world !
下面來介紹一下go的資料型別
資料型別
下表列出了go語言的資料型別:
型別 | 說明 | 示例 |
---|---|---|
布林型別 bool | 可以是常量 true 或者 false | var flag bool = true |
數字型別 | 有符號整型:int8、int16、int32、int64 無符號整型:uint8、uint16、uint32、uint64 int和uint的具體長度取決於CPU位數 浮點型:float32、float64 |
var num int = 2 |
字串型別 string | 是UTF-8 編碼的字元序列,只能使用雙引號("")或反引號(``)定義 | var a = “test” |
陣列 array | 陣列型別是由固定長度的特定型別元素組成的序列,長度和容量相同 | var myarr [5] int{1,2,3} |
切片 slice | 切片型別是一種動態陣列,是可變長的,長度和容量可相同也可以不相同 | var myslice = []int{1, 2, 3} |
結構體 struct | 結構體是多個任意型別的變數組合 | |
字典 map | 儲存鍵值對的集合 | var mymap map[int]string |
通道 channel | 相當於一個先進先出(FIFO)的佇列,可以利用通道在多個 goroutine 之間傳遞資料 | ch := make(chan int, 3) |
介面 interface | 介面型別定義方法的集合,它無法例項化 | |
函式 func | 函式型別是一種對一組輸入、輸出進行模板化的重要工具 | type add func(a int, b int) (n int) |
指標 pointer | go語言的指標型別和C/C++中的指標型別類似,是指向某個確切的記憶體地址的值 |
int、float、bool、string、陣列和struct屬於值型別,這些型別的變數直接指向存在記憶體中的值;slice、map、chan、pointer等是引用型別,儲存的是一個地址,這個地址儲存最終的值。
常量宣告
常量是在程式編譯時就確定下來的值,程式執行時無法改變。
package main
import (
"fmt"
)
func main() {
const name string = "zhangsan"
fmt.Println(name)
const course1, course2 = "math", "english"
fmt.Println(course1, course2)
const age = 20
age = age + 1 // 不能改變age
fmt.Println(age)
}
執行結果:
# command-line-arguments
.\test_const.go:15:6: cannot assign to age (declared const)
變數宣告
go的變數宣告主要包括三種方法:
-
變數宣告可指定變數型別,如果沒有初始化,則變數預設為零值。
-
也可以不指定資料型別,由go自己判斷。
-
var可以省略,使用
:=
進行宣告。注意::=
左邊的變數必須是沒有宣告新的變數,否則會編譯錯誤。
package main
import (
"fmt"
)
func main() {
var name string = "zhangsan"
fmt.Println(name)
var hight float32
fmt.Println(hight)
var course1, course2 = "math", "english"
fmt.Println(course1, course2)
age := 20
age = age + 1
fmt.Println(age)
var (
name1 string = "zhangsan"
name2 string = "lishi"
)
fmt.Println(name1, name2)
}
執行結果:
zhangsan
0
math english
21
zhangsan lishi
運算子
Go 語言的運算子主要包括算術運算子、關係運算符、邏輯運算子、位運算子、賦值運算子以及指標相關運算子。
算術運算子:
運算子 | 說明 |
---|---|
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |
% | 求餘 |
++ | 自增 |
-- | 自減 |
關係運算符:
運算子 | 說明 |
---|---|
== | 是否相等 |
!= | 是否不相等 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
邏輯運算子:
運算子 | 說明 |
---|---|
&& | 邏輯 AND |
|| | 邏輯 OR |
! | 邏輯 NOT |
位運算子:
運算子 | 說明 |
---|---|
& | 按位與,兩個數對應的二進位相與 |
| | 按位或 |
^ | 按位異或 |
<< | 左移,左移n位表示乘以2的n次方 |
>> | 右移,右移n位表示除以2的n次方 |
賦值運算子:
運算子 | 說明 |
---|---|
= | 簡單賦值運算子 |
+= | 相加後再賦值 |
-= | 相減後再賦值 |
*= | 相乘後再賦值 |
/= | 相除後再賦值 |
%= | 求餘後再賦值 |
<<= | 左移後賦值 |
>>= | 右移後賦值 |
&= | 按位與後賦值 |
^= | 按位異或後賦值 |
|= | 按位或後賦值 |
指標相關運算子:
運算子 | 說明 |
---|---|
& | 返回變數在記憶體中的地址 |
* | 如果* 後面是指標,表示取指標指向的值;如果* 後面是型別,則表示一個指向該型別的指標。 |
條件語句
下面介紹一下go語言中的if語句和switch語句。另外還有一種控制語句叫select語句,通常與通道聯用,這裡不做介紹。
if語句
if語法格式如下:
if [布林表示式] {
// do something
}
if ... else :
if [布林表示式] {
// do something
} else {
// do something
}
else if:
if [布林表示式] {
// do something
} else if [布林表示式] {
// do something
} else {
// do something
}
示例程式碼:
package main
import "fmt"
func main() {
var grade = 70
if grade >= 90 {
fmt.Println("A" )
} else if grade < 90 && grade >= 80 {
fmt.Println("B" )
} else if grade < 80 && grade > 60 {
fmt.Println("C" )
} else {
fmt.Println("D" )
}
}
switch 語句
語法格式:
switch var1 {
case cond1:
// do something
case cond2:
// do something
default:
// do something:條件都不滿足時執行
}
另外,新增 fallthrough 會強制執行後面的 case 語句,不管下一條case語句是否為true。
示例程式碼:
package main
import "fmt"
func main() {
var grade = "B"
switch grade {
case "A":
fmt.Println("優秀")
case "B":
fmt.Println("良好")
fallthrough
case "C":
fmt.Println("中等")
default:
fmt.Println("不及格")
}
}
執行結果:
良好
中等
迴圈語句
下面介紹幾種迴圈語句:
for迴圈:使用分號
package main
import "fmt"
func main() {
sum := 0
for i := 1; i < 5; i++ {
sum += i
}
fmt.Println(sum) // 10 (1+2+3+4)
}
實現while效果
package main
import "fmt"
func main() {
sum := 0
n := 0
for n < 5 {
sum += n
n += 1
}
fmt.Println(sum) // 10 (1+2+3+4)
}
死迴圈
package main
import "fmt"
func main() {
sum := 0
for {
sum++
}
fmt.Println(sum)
}
for range 遍歷
package main
import "fmt"
func main() {
strings := []string{"hello", "world"}
for index, str := range strings {
fmt.Println(index, str)
}
}
執行結果:
0 hello
1 world
退出迴圈
-
continue:結束當前迭代,進入下一次迭代
-
break:結束當前for迴圈
package main
import "fmt"
func main() {
sum := 0
for {
sum++
if sum%2 != 0 {
fmt.Println(sum)
continue
}
if sum >= 10 {
break
}
}
fmt.Println(sum)
}
執行結果:
1
3
5
7
9
10
也可以通過標記退出迴圈:
package main
import "fmt"
func main() {
sum := 0
n := 0
LOOP: for n <= 10 {
if n == 8 {
break LOOP
}
sum += n
n++
}
fmt.Println(sum) // 28 (0+1+2+3+4+5+6+7)
}
goto語句
package main
import "fmt"
func main() {
sum := 0
sum2 := 0
n := 0
LOOP: for n <= 10 {
if n%2 == 0 {
sum += n
n++
goto LOOP
}
sum2 += n
n++
}
fmt.Println(sum) // 30 (0+2+4+6+8+10)
fmt.Println(sum2) // 25 (1+3+5+7+9)
}
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!