go单元测试之性能测试

一、 创建 **_test 文件

二、 输入 demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package main

import (
"fmt"
"strconv"
"testing"
)

func BenchmarkSprintf(b *testing.B) {
num := 10
b.ResetTimer()
for i := 0; i < b.N; i++ {
fmt.Sprintf("%d", num)
}
}

func BenchmarkFormat(b *testing.B) {
num := int64(10)
b.ResetTimer()
for i := 0; i < b.N; i++ {
strconv.FormatInt(num, 10)
}
}

func BenchmarkItoa(b *testing.B) {
num := 10
b.ResetTimer()
for i := 0; i < b.N; i++ {
strconv.Itoa(num)
}
}

阅读全文

go vet使用指南

一、go vet 功能介绍

Go vet 命令在编写代码时非常有用。它可以帮助您检测应用程序中任何可疑、异常或无用的代码。相当于增强版的 goland 编译器代码检查工具。

阅读全文

go-tool内置工具

待完成

go tool
f
|No|工具名称|介绍|
|—|—|—|
1|addr2line||
2|api|
3|asm|
4|buildid|
5|cgo|
6|compile|
7|cover|
8|dist|
9|doc|在本地单间 go 官网文档|
10|fix|
11|go_bootstrap|
12|link|
13|nm|
14|objdump|
15|pack|
16|pprof|
17|test2json|
18|trace|
19|vet|

阅读全文

goland-FileWatchers 工具使用指南

一、工具介绍

FileWatchers 工具是 goland 自带的代码自动检查维护工具,配置规则如下图:

img

阅读全文

二分查找数组配置

查找算法最简单直接的是暴力查找,如果对性能要求不高时间又紧张一时半会还想不好,那就用暴力吧,时间复杂度为 O(n)

如果细心的你发现数据是有顺序的,可以用二分查找,时间复杂度为 O(logN)

如果对性能要求特别高并且数据集是确定的,可以提前生成 hash 表,然后通过 hash 表来查找,时间复杂度为 O(1)。

阅读全文

github-tealeg-xlsx-读取excel文件

项目功能

对 excel 文件进行解析,生成。

项目地址

github.com/tealeg/xlsx

阅读全文

什么是配置文件

引言

接到需求要做一个 aws 批量添加 alarm 的需求。我竟然用 yaml 文件去保存服务器资源数据,非常不好处理,我还抱怨 viper 不提供获取对象数组的方法,额~

阅读全文

map[interface{}]interface{}转json

知识点

json 的 marshal 和 unmarshal是不支持 map[interface {}]interface{}{} 类型的变量的,主要是 key 不能是interface{}类型

阅读全文

golang 不可寻址情况大全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main

type Named interface {
// Name 用于获取名字。
Name() string
}

type Dog struct {
name string
}

func (dog *Dog) SetName(name string) {
dog.name = name
}

func (dog Dog) Name() string {
return dog.name
}

func main() {
// 示例1。
const num = 123
//_ = &num // 常量不可寻址。
//_ = &(123) // 基本类型值的字面量不可寻址。

var str = "abc"
_ = str
//_ = &(str[0]) // 对字符串变量的索引结果值不可寻址。
//_ = &(str[0:2]) // 对字符串变量的切片结果值不可寻址。
str2 := str[0]
_ = &str2 // 但这样的寻址就是合法的。

//_ = &(123 + 456) // 算术操作的结果值不可寻址。
num2 := 456
_ = num2
//_ = &(num + num2) // 算术操作的结果值不可寻址。

//_ = &([3]int{1, 2, 3}[0]) // 对数组字面量的索引结果值不可寻址。
//_ = &([3]int{1, 2, 3}[0:2]) // 对数组字面量的切片结果值不可寻址。
_ = &([]int{1, 2, 3}[0]) // 对切片字面量的索引结果值却是可寻址的。
//_ = &([]int{1, 2, 3}[0:2]) // 对切片字面量的切片结果值不可寻址。
//_ = &(map[int]string{1: "a"}[0]) // 对字典字面量的索引结果值不可寻址。

var map1 = map[int]string{1: "a", 2: "b", 3: "c"}
_ = map1
//_ = &(map1[2]) // 对字典变量的索引结果值不可寻址。

//_ = &(func(x, y int) int {
// return x + y
//}) // 字面量代表的函数不可寻址。
//_ = &(fmt.Sprintf) // 标识符代表的函数不可寻址。
//_ = &(fmt.Sprintln("abc")) // 对函数的调用结果值不可寻址。

dog := Dog{"little pig"}
_ = dog
//_ = &(dog.Name) // 标识符代表的函数不可寻址。
//_ = &(dog.Name()) // 对方法的调用结果值不可寻址。

//_ = &(Dog{"little pig"}.name) // 结构体字面量的字段不可寻址。

//_ = &(interface{}(dog)) // 类型转换表达式的结果值不可寻址。
dogI := interface{}(dog)
_ = dogI
//_ = &(dogI.(Named)) // 类型断言表达式的结果值不可寻址。
named := dogI.(Named)
_ = named
//_ = &(named.(Dog)) // 类型断言表达式的结果值不可寻址。

var chan1 = make(chan int, 1)
chan1 <- 1
//_ = &(<-chan1) // 接收表达式的结果值不可寻址。

}

阅读全文

golang-遍历文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main() {
//方式一
filepath.Walk("temp/", func (path string, info os.FileInfo, err error) error {
fmt.Println(path)
return nil
})

//方式二
getFileList("temp/")
}

func getFileList(path string) {
fs,_:= ioutil.ReadDir(path)
for _,file:=range fs{
if file.IsDir(){
fmt.Println(path+file.Name())
getFileList(path+file.Name()+"/")
}else{
fmt.Println(path+file.Name())
}
}
}

阅读全文