1. 程式人生 > 其它 >Go語言基礎語法(一)

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)
}
--THE END--

歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!