Goland Live Template
2022-09-23 18:04:40 4 举报
AI智能生成
Goland快捷指令代码
作者其他创作
大纲/内容
Live Template是什么
代码里输入指令回车后输出模板,加快写代码的效率
如何使用Live Template
Preferences/Editor/Live Templates
第4步
常用模板
如何导入
单元测试
goconvy和gomonkey
goconvey
myimport
goconvey导包
. "github.com/smartystreets/goconvey/convey"
test
单元测试
func Test_$NAME$(t *testing.T) {<br> Convey("$NAME$", t, func() {<br> Convey("$NAME$ test1", func() {<br> $START$<br> })<br> })<br>}
convey
convey
Convey("$START$", func() {<br> $END$<br>})
so
断言
So($ERR$, ShouldEqual, $VALUE$)<br>$END$
gomonkey
patch
打桩初始化
patches := gomonkey.NewPatches()<br>$START$<br>defer patches.Reset()
applyfunc
函数打桩
patches = patches.ApplyFunc($FUNCATION$, func($PARAM$) $RETURN$ {<br> $MAINBODY$<br> return $RETURNVALUE$<br>})<br>//第一个参数是方法(不是string类型),第二个是桩函数<br>//patches = patches.ApplyFunc(Add, func(a, b int) int {<br>// return a-b<br>//})
applyfuncreturn
函数打桩
patches = patches.ApplyFuncReturn($FUNC$, $RETURN$)<br>//第一个是函数名(不是string类型), 第二个是函数返回值<br>//patches = patches.ApplyFuncReturn(Add, 9999)
applymethodfunc
public方法打桩
patches = patches.ApplyMethodFunc(u, "$METHOD$", func ($PARAM$) $RETURN${<br> $MAINBODY$<br> return $RETURNVALUE$<br>})<br>//u := PublicMethodStruct{}<br>//第一个参数是对象,第二个参数是方法名string类型,第三个是桩函数<br>//patches = patches.ApplyMethodFunc(u, "Hello", func () string{<br>// return "haha"<br>//})
applyprivatemethodptr
private指针类型方法打桩
patches = patches.ApplyPrivateMethod(reflect.TypeOf($STRUCT$), "$FUNC$", func(this *$STRUCTTYPE$ $PARAM$) $RETURN$ {<br> $MAINBODY$<br> return $RETURNVALUE$<br>})<br>//指针类型ApplyPrivateMethod的第一个参数u需要取地址,第二个是原函数方法名,第三个参数是一个桩函数<br>//桩函数的第一个入参是该结构体指针,如果原函数还有其他入参,也需要作为桩函数的入参,桩函数的返回值就是原函数的返回值<br>//patches := gomonkey.ApplyPrivateMethod(reflect.TypeOf(&u), "add", func(this *PrivateMethodStruct) {<br>// this.time -= 10<br>//})
applyprivatemethodval
private值类型方法打桩
patches = patches.ApplyPrivateMethod(reflect.TypeOf($STRUCT$), "$FUNC$", func(this $STRUCTTYPE$ $PARAM$) $RETURN$ {<br> $MAINBODY$<br> return $RETURNVAL$<br>})<br>//值类型ApplyPrivateMethod的第一个参数u不需要取地址,第二个是原函数方法名,第三个参数是一个桩函数<br>//桩函数的第一个入参是该结构体(不是结构体指针),如果原函数还有其他入参,也需要作为桩函数的入参,桩函数的返回值就是原函数的返回值<br>//u := PrivateMethodStruct{}<br>//patches := gomonkey.ApplyPrivateMethod(reflect.TypeOf(u), "hello", func(_ PrivateMethodStruct) string {<br>// return "null"<br>//})
golang
go
go携程
go func() {<br> defer func() {<br> if p := recover(); p != nil {<br> logger.LogErrorf("$FIRST$ panic=%v, stack=%v", p, string(debug.Stack()))<br> $SECOND$<br> }<br> }()<br> $THIRD$<br>}()
panic
捕获panic
defer func() {<br> if p := recover(); p != nil {<br> logger.LogErrorf("$START$ panic=%v, stack=%v", p, string(debug.Stack()))<br> $END$<br> }<br>}()
Algorithm
unionfind
路径压缩并查集
type PathCompressionUnionFind struct {<br> parents []int<br> size []int<br>}<br><br>func NewPathCompressionUnionFind(len int) *PathCompressionUnionFind {<br> parents := make([]int, len)<br> size := make([]int, len)<br> for i := range parents {<br> parents[i] = i<br> size[i] = 1<br> }<br><br> return &PathCompressionUnionFind{<br> parents: parents,<br> size: size,<br> }<br>}<br><br>func (t *PathCompressionUnionFind) Union(p, q int) {<br> pRoot := t.Find(p)<br> qRoot := t.Find(q)<br> if pRoot == qRoot {<br> return<br> }<br> t.parents[qRoot] = t.parents[pRoot]<br> t.size[pRoot] += t.size[qRoot]<br>}<br><br>func (t *PathCompressionUnionFind) Find(p int) int {<br> for t.parents[p] != p {<br> t.parents[p] = t.parents[t.parents[p]]<br> p = t.parents[p]<br> }<br> return p<br>}<br><br>func (t *PathCompressionUnionFind) GetSize(p int) int {<br> if p < 0 || p >= len(t.parents) {<br> return 0<br> }<br> return t.size[t.Find(p)]<br>}<br>
heap
堆
type $STRUCT$ struct{<br> weight int<br> $FIELDS$<br>}<br>type compare func(a, b interface{}) bool<br>type heapHandler struct{<br> arr []*$STRUCT$<br> cmp compare<br>}<br>func (h heapHandler) Len() int {return len(h.arr)}<br>func (h heapHandler) Swap(i, j int) { h.arr[i], h.arr[j] = h.arr[j], h.arr[i]}<br>func (h *heapHandler) Push(x interface{}) { h.arr = append(h.arr, x.(*$STRUCT$))}<br>func (h heapHandler) Less(i, j int) bool {return h.cmp(h.arr[i], h.arr[j])}<br>func (h *heapHandler) Pop() interface{} {<br> old := h.arr<br> n := h.Len()<br> x := old[n-1]<br> h.arr = old[:n-1]<br> return x<br>}<br>type MyHeap struct{h *heapHandler}<br>func NewMyHeap(arr []*$STRUCT$, cmp compare) *MyHeap {<br> res := &MyHeap{&heapHandler{cmp: cmp}}<br> if len(arr) == 0 {return res}<br> res.h.arr = arr<br> heap.Init(res.h)<br> return res<br>}<br>func (m *MyHeap) Push(x interface{}) {heap.Push(m.h, x)}<br>func (m *MyHeap) Peek() interface{} {return m.h.arr[0]}<br>func (m *MyHeap) Pop() interface{} {return heap.Pop(m.h)}<br>func (m *MyHeap) Len() int {return m.h.Len()}
binarysearchint
二分查找
func BinarySearchInt(arr []int, target int) int {<br> left := 0<br> right := len(arr) - 1<br> for left <= right {<br> mid := (left + right) >> 1<br> if arr[mid] == target {<br> return mid<br> }<br> if arr[mid] > target {<br> right = mid - 1<br> } else {<br> left = mid + 1<br> }<br> }<br> return -(left + 1)<br>}
0 条评论
下一页