轉型
- 想在短時間內系統轉到 Go 工程的理由
- 提高 CRUD,無自研框架經驗
- 提升技術深度,專精於需求的同學
- 進階工程化,擁有良好開發規範和管理能力的
工程化的重要性
高階開發的期望
- 良好的程式碼規範
- 深入底層原理
- 熟悉架構
- 熟悉 k8s 的基礎架構
擴展知識廣度,知識的深度,規範的開發體系
四個主要階段
- Go 語言基礎
- 微服務開發(電商專案實戰)
- 自研微服務
- 自研然後重構
領域
- Web 開發 - gin、beego 等
- 容器虛擬化 - docker、k8s、istio
- 中介軟體 - etcd、tidb、influxdb、nsq 等
- 區塊鏈 以太坊、fabric
- 1xAR5 - go-zero, dapr, rpcx, kratos. dubbo-go,
相關環境的開發
- Go 安裝 官網
- goland、vscdoe
# go build hello.go
# ./hello
go run hello.go
golang新版本中同一個套件下有多個 main 執行時,執行工具中選擇執行類型file,Go 中不推薦一個目錄中有兩個 main 檔案,如果需要有多個 main 放到不同的資料夾中
變數
package main
import "fmt"
// 全局變量 定義可以不使用
var name = "bobby"
var age = 19
var ok bool
func main() {
// go是靜態語言 靜態語言和動態語言相比變量差異很大
// 1. 變更定義 先定義後使用 類型聲明瞭不能改變
// 定義變量
var name string = "hello world"
age := 1
// go 語言中變量定義的不使用是不行的,強制性的
fmt.Println(name, age)
// 多變量定義
var user1, user2, user3 = "booby1", "bobby2", 22
fmt.Println(user1, user2, user3)
// 注意變量先定義才能使用
// 是靜態語言類型和賦值要一致
// 要求和規範性會更好
// 變量名不能衝突 同一個代碼塊中不能同名的
// 簡潔定義 名:=值 不能用於全局定義
// 變量是有0值的
}
變數
package main
import "fmt"
func main() {
// 常量 定義的時候就要指定值,不能修改
const PI float32 = 3.14159265358979323846 // 顯式定義
const PI2 = 3.14159265358979323846 // 常量 大寫多單詞 用下划線
const (
UNKNOW = 1
FEMALE = 2
MALE = 3
)
//沒有設置類型和值它會沿用前面的值
const (
x int = 16
y
s = "abc"
z
)
fmt.Println(x, y, z)
/**
常量類型只要以是bool 數值(整數、浮點)
不曾使用的常量,沒有強制使用的
顯示指定類型的時候,必須確保左右類型一致
*/
}
iota
特殊常數
package main
import "fmt"
func main() {
// 匿名變量 定義一個變更不使用它
var _ int // 接收返回值進,點位符只接收哪個值
// iota 特殊常量,可以認為是一種可以被編譯器修改的常量
const (
ERR1 = iota + 1
ERR2
ERR25 = "ha" // iota內部仍然增加計數
ERR3
ERR4 = iota
)
const (
ERRORNEW1 = iota // 從0開始計數
)
/*
如果中斷了iota那麼要顯示的恢復,後續會自動遞增 自增類型默認是int類型的
iota能簡化const類型的定義
*/
fmt.Println(ERR1, ERR2, ERR3, ERR4)
}
變數的作用域
個人感覺要注意程式碼區塊的範圍還有就是變數名稱:=值這種方式的宣告
Go 的基本資料型別
- 基本資料型別
- bool true false
- 數值型別
- 整數 int8~64 uint8~64 (無符號數)
- 浮點數 float32 float64
- 複數
- byte 位元組 uint8
- rune 型別 int32
- 字元和 string
package main
import "fmt"
func main() {
var a int8
var b int16
var c int32
var d int64
var ua uint8
var ub uint16
var uc uint32
var ch3 byte
c = 'a' // 字符類型
var int_32 rune // 也是字符
int_32 = '中' // 即有中文也有英文
fmt.Println(int_32)
fmt.Print("c=%c", ch3)
var str string
str = "i am bobby"
fmt.Println(str)
}
各種型別之間的轉換
var str string
str = "i am bobby"
fmt.Println(str)
// 字符串轉數字
var istr = "12"
myint, err := strconv.Atoi(istr)
if err != nil {
fmt.Println("convert error")
}
fmt.Println(myint)
var myi = 32
mstr := strconv.Itoa(myi)
fmt.Println(mstr)
// 字符串轉float32 轉換bool
mFloat, error := strconv.ParseFloat("3.1415", 64)
if error != nil {
fmt.Println("convert error")
}
fmt.Println(mFloat)
parseBol, err := strconv.ParseBool("true")
if err != nil {
fmt.Println("convert error")
}
fmt.Println(parseBol)
// 基本類型轉字符串
boolStr := strconv.FormatBool(true)
fmt.Println(boolStr)
floatStr := strconv.FormatFloat(3.1415, 'E', -1, 64)
fmt.Println(floatStr)