Go編程之基礎語法

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
}

八、歡迎關注下公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章