278.Golang簡略筆記(二)
WHY
搞 218. Go GUI套件 fyne筆記,
是用ChatGPT加上文件搞出來的,
有些寫法真的是厲害啊,
值得紀錄一下。
Note
- function 回傳,兩個以上的話需要
()
,一個則不用
var db *sql.DB
func main() {
var err error
db, err = initDatabase("./stickersInfo.db")
if err != nil {
log.Fatalf("初始化資料庫失敗: %v", err)
}
// 當main 全部結束後,會關閉db
defer db.Close()
}
func initDatabase(dbPath string) (*sql.DB, error) {
....
}
- 同一個專案底下,不同文件,不需要另外import,只需下面這行
package main
- 變數or 函數,開頭大寫表示是公有。
var BasePath = "\user\daimom"
var BasePath string
BasePath = "\user\daimom"
BasePath := "\user\daimom"
- slice(動態array)的
...
,意思是將slice拆開,當作多個參數傳到函式
// LoadImages會回傳 []fyne.CanvasObject
grid := container.NewGridWithColumns(3, LoadImages(*imageLists, w)...)
- 字串處理
//分割
p := strings.Split(imagePath, "/")
//結合
alias = (strings.Join(*aliasList, ","))
//轉string
a = string(number)
//替換文字
folderPath := strings.ReplaceAll(path, "productInfo.meta", "")
- for range
// 迴圈加入,
for i, id := range packageIDs {
query += "?"
if i < len(packageIDs)-1 {
query += ","
}
args[i] = id
}
// 常用取得slice的值。products 型別為 *[]Product。
for _, p := range *products {
if !existsMap[p.PackageID] {
filtered = append(filtered, p)
} else {
fmt.Printf("刪除 PackageID: %d, StickerID: %d\n", p.PackageID, p.stickerId)
}
}
- 指標
如果傳入實體的型別為products []Prouduct
,
那*products 型別為 []Proudct
,取實體
而&products 型別為 *[]Product
,指向這個 slice 的指標
func checkDuplicate(products *[]Product){
// 此處看到products 是個指向[]Product的指標。
// 要取值的話,變成 *products(型別 []Product)
// 如果要取指標 &products ,因本來已經是指標了,
// 會變成 (型別 **[]Product) ,就會出錯
}
- map預設回傳
map 型別 | 不存在時回傳值 |
---|---|
map[int]bool |
false |
map[string]int |
0 |
map[string]string |
"" (空字串) |
map[int]float64 |
0.0 |
- slice 取值
寫法 | 意思 |
---|---|
arr[2:] |
從 index 2 到結尾 |
arr[:3] |
從開頭到 index 3(不含3) |
arr[1:4] |
從 index 1 到 4(不含4) |
arr[:] |
全部(copy 一份 slice) |
- make用法
用來建立 slice, map, chan 這三種。
當用來建立slice時,差異在
用法情境 | 建議寫法 |
---|---|
要明確是空 slice | a := []int{} |
要保留 nil 判斷語意 | var a []int |
要初始化有容量但無資料 | make([]int, 0, 100) |
而三種型別的差異
型別 | 是否要指定長度? | 備註 |
---|---|---|
slice |
✅ 要指定長度(len ),可選容量(cap ) |
make([]T, len) 或 make([]T, len, cap) |
map |
❌ 可省略長度(但可選擇性指定初始容量) | make(map[K]V) 或 make(map[K]V, hint) |
chan |
✅ 要指定 buffer 大小(0 表示無 buffer) | make(chan T, bufferSize) |
以上都是寫LineStickerMapping ,然後延伸出來的筆記
ref.