前言
????????本系列文章參考自稀土掘金上的 【字節內部課】公開課,做自我學習總結整理。
Go語言的特點
??????????Go語言由Google團隊設計,以簡潔、高效、并發友好為核心目標。
??????????具有以下優點:
-
語法簡單、學習曲線平緩:語法關鍵字很少,且容易記憶。
-
豐富的標準庫:大多數情況下不需要外部引入第三方庫,直接使用內置標準庫即可。
-
完善的工具鏈:包管理、代碼格式化、測試、性能分析、文檔生成、依賴管理等等,應有盡有。
-
靜態鏈接:部署簡單,跨平臺性強,安全穩定。
-
高性能、高并發:接近c的性能,低內存開銷。
????????下文將介紹Go語言的基本語法,個人感覺更是Go語言現代化(甚至有點超現代化)的體現。
數據類型
????????Go語言常用的數據類型:
類型分類 | 類型名稱 | 關鍵字/定義 | 默認值(零值) | 特點 |
布爾型 |
|
|
| 只能為 |
整數型 | 有符號整數 |
|
| 根據平臺不同, |
無符號整數 |
|
| 無負數范圍 | |
浮點型 |
|
|
|
|
字符/字節型 |
|
|
|
|
|
|
|
| |
字符串型 |
|
|
| 不可變,UTF-8 編碼 |
錯誤類型 |
|
|
| 內置接口類型,表示錯誤狀態 |
一、變量定義
????????Go語言的變量定義方式有很多種:
1. var name type :用于顯式定義變量。
var a, b int = 1, 2
2. name := val :用于隱式定義變量。
f := float32(e)
3. const name type = val : 用于常量定義
const s string = "constant"
二、選擇結構
????????選擇結構分為 if ,switch-case。
1.?if
if a == 1 {fmt.Println("真的")
}else {fmt.Println("假的")
}
2. switch-case
a := 2
switch a {
case 1:fmt.Println(1)
case 2:fmt.Println(2)
default:fmt.Println("default")
}
三、循環結構
????????Go語言形式上只有for循環一種循環方式,但是可以改為類似于while的形式循環。
for i := 1; i < 9; i++ {fmt.Print(i)
}
k := 1
for k < 10 {k++fmt.Println(k)
}
四、數組
????????Go語言的數組和C很類似,定長數組。
for i := 1; i < 9; i++ {fmt.Print(i)
}
k := 1
for k < 10 {k++fmt.Println(k)
}
五、切片
????????Go語言的切片類似于C++的vector、Java中的List,是一種變長數組。
????????并且支持類似Python中元組的操作語法。
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println(s[2])
fmt.Println(len(s))
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s)
c := make([]string, len(s))
copy(c, s)
fmt.Println(c)
fmt.Println(s[2:5])
fmt.Println(s[:4])
fmt.Println(s[2:])
good := []string{"g", "h", "o"}
fmt.Println(good)
六、Map
????????和各種語言的Map類似,用于存儲鍵值對。
mp := make(map[string]int)
mp["one"] = 1
mp["two"] = 2
r, ok := mp["unknow"]
fmt.Println(r, ok)
七、range
????????Go語言中的range類似于C++的auto,用于快速遍歷。
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {sum += numif num == 2 {fmt.Println("idx:", i, "num:", num)}
}
fmt.Println(sum)
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {fmt.Println(k, v)
}
for k := range m {fmt.Println(k)
}
八、函數
????????Go語言的函數,個人認為是Go語言在語法上現代化的標志之一,支持多返回,非常方便。
func add(a int, b int) (int, string) {return a + b, "ok"
}
九、指針
????????Go語言的指針類似C的指針,個人非常喜歡指針,一直覺得Java把指針完全去除了也是一個問題。
????????在語法上,*作為解引用、&作為引用。
func add2(a *int) {*a += 2
}
十、結構體
????????Go語言提供結構體用于類型封裝,特殊的是,結構體方法在Go語言中需要寫在外面。
type user struct {name stringpassword string
}
func (this user) checkPassword(password string) bool {return this.password == password
}
十一、錯誤處理
????????Go語言為函數提供了一種新奇的try-catch方法。Go語言中,我們在某種方面來講是在面向異常編程。我們需要通過 error 類型將函數中的錯誤返回,然后手動處理。
????????Go語言提供了一個特殊變量 nil 用于判斷是否捕捉到了異常。
func checkError(password string) (bool, error) {return password == "123", errors.New("not Found")
}
v, err := checkError("456")
if err != nil {fmt.Println(v, err)
} else {fmt.Print(v)
}
十二、特殊函數
1. json處理
type userInfo struct {Name stringAge int `json:"age"`
}
func solve14() {a := userInfo{Name: "wang", Age: 18}buf, err := json.Marshal(a)if err != nil {panic(err)}fmt.Println(buf)fmt.Println(string(buf))var b userInfoerr = json.Unmarshal(buf, &b)if err != nil {panic(err)}fmt.Println(b)
}
2.?時間處理
fmt.Println(time.Now())
fmt.Println(time.Now().Unix())
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
fmt.Println(time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC))
3.?字符串轉數字
fmt.Println(strconv.ParseInt("111", 10, 64))
fmt.Println(strconv.ParseFloat("111.11", 64)
fmt.Println(strconv.ParseInt("0x1000", 0, 64
fmt.Println(strconv.Atoi("111"))
4.?獲取線程信息
fmt.Println(os.Args)
fmt.Println(os.Getenv("PATH"))
????????下篇將對學習的語法結合視頻進行綜合實踐。