for循环,一个key在一个map中,则一直迭代
for _, ok := mapping[key]; ok; _, ok = mapping[key]{ // do something }
go总是使用值传递,但是有些数据类型是引用类型,比如map, pointer, channel, slice是部分引用类型
在给函数传递slice作为参数的时候,如果传递slice本身,在函数中通过append进行修改,则改变了slice的长度,在函数外部的slice已经不是同一个,但是如果不是append,只是通过index对元素做修改,则slice header里面指向数组的指针和长度并未发生变化,传递到函数的slice和外部的slice的描述方式并未发生变化,她们还是同一个slice,所以修改对外部的slice也是可见的
具体看go官方heap的例子,在push, pop的时候,由于会对slice长度产生影响,所以使用指针传参
package main import ( "container/heap" "fmt" ) // IntHeap 是一个由整数组成的最小堆。 type IntHeap []int func (h IntHeap) Len() int { return len(h) } func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *IntHeap) Push(x interface{}) { // Push 和 Pop 使用 pointer receiver 作为参数, // 因为它们不仅会对切片的内容进行调整,还会修改切片的长度。 *h = append(*h, x.(int)) } func (h *IntHeap) Pop() interface{} { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x } // 这个示例会将一些整数插入到堆里面, 接着检查堆中的最小值, // 之后按顺序从堆里面移除各个整数。 func main() { h := &IntHeap{2, 1, 5} heap.Init(h) heap.Push(h, 3) fmt.Printf("minimum: %d\n", (*h)[0]) for h.Len() > 0 { fmt.Printf("%d ", heap.Pop(h)) } }
反射
// c 是一个struct clueValue := reflect.ValueOf(c).Elem() clueAttrField := clueValue.FieldByName(flt.Attr) // 下面这样也行 //clueValue := reflect.ValueOf(c) //clueAttrField := reflect.Indirect(clueValue).FieldByName(flt.Attr)
变量隐式推导,已经声明了变量,然后for循环里面赋值,值不会再变
func variable() { a := []string{"1", "2", "3"} for i, _ := range a { // 下面这个a一直不变 head, a := a[0], a[1:] fmt.Println(i, head, a) } }
日期处理
datetimeFormat = "2006-01-02T15:04:05.000Z"
gorm
打印sql
sql := p.db.ToSQL(func(tx *gorm.DB) *gorm.DB { return p.db.WithContext(ctx). Clauses(dbresolver.Write). Where(`project = ?`, project). Where(`email = ?`, email). Where(`id < (?)`, tmpTable). Delete(&records) }) fmt.Printf(sql)
db.Debug() 会直接打印出sql
另一种方法
import "gorm.io/gorm/logger" db, err := gorm.Open(mysql.Open(connectionDSN), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), })
一个坑
onConflict更新时,id没有设置自增,导致增量数据写不进去