Pinned Post

Recent Posts

Go Wasm(WebAssembly) 相关资料

therecipe/qt:QT 的 Go 绑定: https://github.com/therecipe/qt

试试在树莓派上玩 Golang?
https://github.com/stianeikeland/go-rpio
Raspberry Pi GPIO library for go-lang

go 代理 https://goproxy.io/ 墙内用户不用再为无法加载 go model 发翻了

Twitter的Snowflake算法(俗称雪花算法)的 Golang 实现: https://github.com/bwmarrin/snowflake

Go 夜读,Go学习, Go 源码阅读及 Go 语言相关技术讨论分享: https://github.com/developer-learning/night-reading-go

os.exec 包中的 cmd.Run(), 手册中运行该命令并等待它完成,但貌似并没等待命令结束?
临时换成 cmd.Start() cmd.Wait()

Go exec 执行外部命令时的输出重定向

使用 go.exec 包执行外部命令时,无法直接使用输入输出重定向命 <>,需要使用 WriterReader 来实现.


dumpFile, err := os.OpenFile("./data/"+batchNumber+"-"+tab+".sql", os.O_CREATE|os.O_RDWR, os.ModePerm)
if err != nil {
    panic("无法打开文件:" + err.Error())
}
defer dumpFile.Close()
stderr := new(bytes.Buffer)
args := []string{
    "--no-create-db",
    "--no-create-info",
    "--skip-opt",
    "--quick",
    "--where=id>" + strconv.Itoa(lastID) + " and id<=" + strconv.Itoa(currentID),
    "-h" + Conf.DB.Host,
    "-u" + Conf.DB.User,
    "-p" + Conf.DB.Password,
    Conf.DB.Name,
            "tabname",
}

// fmt.Println("args:", args)

cmd := exec.Command("mysqldump", args...)
cmd.Stderr = stderr
cmd.Stdout = dumpFile

err = cmd.Start()
if err != nil {
    logger.Infof("导出文件时发生错误:%s", err.Error())
    return
}

cmd.Run()
cmd.Wait()

go 判断进程是否存在

		if err = syscall.Kill(pid, 0); err == nil {
			isRunning = true
		} else {
			isRunning = false
		}

		// p, e := os.FindProcess(pid)
		// if e == nil {
		// 	fmt.Println("WTF???", p)
		// 	isRunning = true
		// } else {
		// 	isRunning = false
		// }

encoding/gob 包可以实现二进制数据流的编码解码转换

貌似禁用掉 KeepAlive 后就会立即关闭了(有待继续观察),难道是为了连接复用?

	var client http.Client
	proxy := func(_ *http.Request) (*url.URL, error) {
		return url.Parse("http://xx.xx.xx.xx:xxxx")
	}
	transport := &http.Transport{
		Proxy:             proxy,
		DisableKeepAlives: true,
	}
	client = http.Client{Transport: transport}

好像 Go 的 http.Client 连接完后并没有马上释放掉连接?(即使 response.Body.Close() 后好像也并没有)

go 获取运行时内存使用情况:

var mem runtime.MemStats
runtime.ReadMemStats(&mem)

runtime.MemStats 结构:

Alloc:69257680 //golang语言框架堆空间分配的字节数 大概68M
TotalAlloc:79489528 //从服务开始运行至今分配器为分配的堆空间总 和,只有增加,释放的时候不减少。大约79M
Sys:1345724664 //服务现在系统使用的内存, 大约1345M
Lookups:3 //被runtime监视的指针数
Mallocs:307494 //服务malloc的次数
Frees:9105  //服务回收的heap objects的字节数 free次数
HeapAlloc:69257680 //golang语言框架堆空间分配的字节数 大概68M
HeapSys:71434240  //系统分配的堆内存 大概71M
HeapIdle:974848 //申请但是未分配的堆内存或者回收了的堆内存(空闲)字节数 大概1M
HeapInuse:70459392 //正在使用的堆内存字节数 大概70M
HeapReleased:0 //返回给OS的堆内存,
HeapObjects:298389  //堆内存块申请的量
StackInuse:1220804608 //正在使用的栈字节数 约1220M
StackSys:1220804608 //系统分配的作为运行栈的内存 约1220M
MSpanInuse:6924360  //用于测试用的结构体使用的字节数 不受GC控制, 约7M
MSpanSys:6979584 //系统为测试用的结构体分配的字节数 约7M
MCacheInuse:6816 //mcache结构体申请的字节数(不会被视为垃圾回收) 约6K
MCacheSys:16384 //操作系统申请的堆空间用于mcache的字节数,约16K
BuckHashSys:1468496 //用于剖析桶散列表的堆空间 约14K
GCSys:40984576 //垃圾回收标记元信息使用的内存 约40M
OtherSys:4036776 //golang系统架构占用的额外空间 约4M
NextGC:135394784  //垃圾回收器检视的内存大小 约135M
LastGC:1506577064496115700 //最后一次GC的时间戳
PauseTotalNs:1834800 //系统暂停的时间,大约1.8毫秒

go 读取用户输入, fmt.Scanln(&startAt) 读取用户输入时,若有空格则只会读取空格后面部份,可使用 bufio.Reader 来读取:


var inputReader *bufio.Reader
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("请输入开始时间")
startAt, err = inputReader.ReadString('\n')

go 获取程序运行时路径, 兼容 linux/mac/windows


tmp, _ := exec.LookPath(os.Args[0])
tmp, _ = filepath.Abs(tmp)
pathArr := strings.Split(tmp, dirSplitStr)
pathArr = pathArr[0 : len(pathArr)-1]
AppRootPath = strings.Join(pathArr, "/")
if strings.HasPrefix(AppRootPath, "/var/folders") { // 通过 go run 运行时的临时路径
    AppRootPath = "/Users/jetking/work/golang/src/spider"
}