# 基本語法
* * * * *
--: 作者:jsh
時間:2018年8月30日
* * * * *
### 常量
常量使用關鍵字 const 定義,用于**存儲不會改變的數據**。
存儲在常量中的數據類型只可以是布爾型、數字型(整數型、浮點型和復數)和字符串型。
~~~
const PI = 3.1415926
~~~
在 Go 語言中,你可以省略類型說明符 [type],因為編譯器可以根據變量的值來推斷其類型。
* 顯式類型定義: const b string = "abc"
* 隱式類型定義: const b = "abc"
常量的值必須是能夠在編譯時就能夠確定的;你可以在其賦值表達式中涉及計算過程,但是所有用于計算的值必須在編譯期間就能獲得。
* 正確的做法:const c1 = 2/3
* 錯誤的做法:const c2 = cc() // const initializer cc() is not a constant
**因為在編譯期間自定義函數均屬于未知,因此無法用于常量的賦值,但內置函數可以使用,如:len()。**
當常量定義多個,可以定義一個常量組。例如:
~~~
const (
a = "123"
b = 456
c = len(demo)
)
~~~
### 變量
聲明變量的一般形式是使用 var 關鍵字:var identifier type。
~~~
var a int
var b boolean
var c string
~~~
聲明變量組
~~~
var (
a int
b boolean
c string
)
~~~
當一個變量被聲明之后,系統自動賦予它該類型的零值:int 為 0,float 為 0.0,bool 為 false,string 為空字符串,指針為 nil。記住,所有的內存在 Go 中都是經過初始化的。
變量的命名規則遵循駱駝命名法,即首個單詞小寫,每個新單詞的首字母大寫,例如:numShips 和 startDate。但如果你的全局變量希望能夠被外部包所使用,則需要將首個單詞的首字母也大寫
變量作用域:一個變量(常量、類型或函數)在程序中都有一定的作用范圍,稱之為作用域。如果一個變量在函數體外聲明,則被認為是全局變量,可以在整個包甚至外部包(被導出后)使用,不管你聲明在哪個源文件里或在哪個源文件里調用該變量。
Go語言中,使用大小寫來決定常量、變量、類型、接口、結構體或函數,是否可以被外部包所調用
根據約定:
* 函數名首字母 小寫即為private
* 函數名首字母
變量賦值
~~~
var a int // 聲明變量
func main() {
a = 10 // 變量賦值
}
~~~
### 選擇結構
思考:三種結構?
Go語言中if....else....語法如下:
~~~
if 表達式 {
條件成立---輸出
} else {
條件不成立--輸出
}
~~~
~~~
// 流程控制
a := 10
if a := 1; a < 2 {
fmt.Println(a) // 變量作用域 考慮此時變量會輸出多少
}
~~~
switch.......case......使用
~~~
func chose(i int) (y string){
switch i {
case 1:
return "a"
case 2:
return "a"
case 3:
return "b"
fallthrough
default:
return "c"
}
}
~~~
fallthrough作用 :指定fallthrough 是繼續檢查sencond
Go語言提供了標簽的使用
標簽的名稱是大小寫敏感的,為了提升可讀性,一般建議使用全部大寫字母
~~~
LABEL1:
for {
for i := 0; i <= 10; i++ {
a++
fmt.Println(a)
break LABEL1
}
}
~~~
~~~
LABEL1:
for {
for i := 0; i <= 10; i++ {
a++
fmt.Println(a)
go to LABEL1
}
}
~~~
### 循環結構
Go語言與其它語言一樣,也提供了for的使用
~~~
for 初始化語句; 條件語句; 修飾語句 {}
~~~
~~~
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ {
fmt.Printf("This is the %d iteration\n", i)
}
}
~~~
無限循環
~~~
for {
for i := 0; i <= 10; i++ {
a++
fmt.Println(a)
break LABEL1
}
}
~~~
for...range循環
~~~
m1 := map[int]string{1: "a", 2: "b", 3: "c", 4: "d", 5: "e"}
m2 := make(map[string]int)
for k, v := range m1 {
m2[v] = k
}
~~~
循環結構學會了吧,那就寫一個乘法口訣表吧!!!
break和continue
~~~
for {
i = i - 1
fmt.Printf("The variable i is now: %d\n", i)
if i < 0 {
break
}
}
~~~
因此每次迭代都會對條件進行檢查(i < 0),以此判斷是否需要停止循環。如果退出條件滿足,則使用 break 語句退出循環。
思考:以下程序輸出什么:
~~~
func main() {
for i:=0; i<3; i++ {
for j:=0; j<10; j++ {
if j>5 {
break
}
print(j)
}
print(" ")
}
}
~~~
一個 break 的作用范圍為該語句出現后的最內部的結構,它可以被用于任何形式的 for 循環(計數器、條件判斷等)。但在 switch 語句中,break 語句的作用結果是跳過整個代碼塊,執行后續的代碼。
~~~
func main() {
for i := 0; i < 10; i++ {
if i == 5 {
continue
}
print(i)
print(" ")
}
}
~~~
關鍵字 continue 忽略剩余的循環體而直接進入下一次循環的過程,但不是無條件執行下一次循環,執行之前依舊需要滿足循環的判斷條件。
課后作業:
請輸出:
~~~
*
***
*****
*******
*********
*******
*****
***
*
~~~