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))
	}
}

  

https://stackoverflow.com/questions/30100461/why-is-the-slice-sometimes-passed-by-reference-sometimes-by-pointer

 

反射

// 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没有设置自增,导致增量数据写不进去

 

posted on 2022-06-30 13:06  Go_Forward  阅读(32)  评论(0编辑  收藏  举报