278.Golang簡略筆記(二)

WHY

218. Go GUI套件 fyne筆記
是用ChatGPT加上文件搞出來的,
有些寫法真的是厲害啊,
值得紀錄一下。

Note

  1. 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) {
	....
}
  1. 同一個專案底下,不同文件,不需要另外import,只需下面這行
package main
  1. 變數or 函數,開頭大寫表示是公有。
var BasePath = "\user\daimom"

var BasePath string
BasePath = "\user\daimom"

BasePath := "\user\daimom"
  1. slice(動態array)的 ... ,意思是將slice拆開,當作多個參數傳到函式
// LoadImages會回傳 []fyne.CanvasObject
grid := container.NewGridWithColumns(3, LoadImages(*imageLists, w)...)

  1. 字串處理
//分割
p := strings.Split(imagePath, "/")
//結合
alias = (strings.Join(*aliasList, ","))
//轉string
a = string(number)
//替換文字
folderPath := strings.ReplaceAll(path, "productInfo.meta", "")
  1. 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)
  }
}
  1. 指標
    如果傳入實體的型別為 products []Prouduct
    *products 型別為 []Proudct,取實體
    &products 型別為 *[]Product,指向這個 slice 的指標
func checkDuplicate(products *[]Product){
	// 此處看到products 是個指向[]Product的指標。
	// 要取值的話,變成 *products(型別 []Product)
	// 如果要取指標 &products ,因本來已經是指標了,
	// 會變成 (型別 **[]Product) ,就會出錯
}
  1. map預設回傳
map 型別 不存在時回傳值
map[int]bool false
map[string]int 0
map[string]string "" (空字串)
map[int]float64 0.0
  1. slice 取值
寫法 意思
arr[2:] 從 index 2 到結尾
arr[:3] 從開頭到 index 3(不含3)
arr[1:4] 從 index 1 到 4(不含4)
arr[:] 全部(copy 一份 slice)
  1. 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.