Golang-go语言常用知识

main函数接收参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import (
"flag"
)
func main() {
showHelp := flag.Bool("h", false, "show help")
name := flag.String("n", "everyone", "The greeting object")
flag.Parse()

if *showHelp {
flag.PrintDefaults()
return
}
fmt.Println("hello ", *name)
}

golang profile的使用方法

  1. 代码中添加如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import (
    _ "net/http/pprof" //采集 HTTP Server 的运行时数据进行分析
    )
    func main() {
    go func() {
    addr := fmt.Sprintf(":%d", 8090)
    http.ListenAndServe(addr, nil)
    }()
    }
  2. 编译pprof

    1
    2
    git clone https://github.com/google/pprof.git
    go build

编译命令请参考 https://github.com/google/pprof/blob/master/appveyor.yml

  1. 编译go-torch

    1
    https://github.com/uber-archive/go-torch
  2. 火焰图生成命令:

  • cpu 使用火焰图:

    1
    go-torch -u http://127.0.0.1:4500
  • mem 火焰图:
    – –inuse_space 分析常驻内存:

    1
    go-torch -inuse_space http://127.0.0.1:4500/debug/pprof/heap --colors=mem

– –alloc_space 分析程序启动以来所有分配的内存

1
go-torch -alloc_space http://127.0.0.1:4500/debug/pprof/heap --colors=mem

  1. 不用火焰图,分析cpu、mem使用
  • –inuse_space 分析常驻内存:

    1
    go tool pprof -inuse_space http://127.0.0.1:4500/debug/pprof/heap
  • –alloc_space 分析程序启动以来分配的所有内存:

    1
    go tool pprof -alloc_space http://127.0.0.1:4500/debug/pprof/heap
  • 分析cpu 热点代码

    1
    go tool pprof http://127.0.0.1:4500/debug/pprof/profile
  1. 一些显示项的含义
  • flat代表的是该函数自身代码的执行时长;
  • cum代表的是该函数自身代码+所有调用的函数的执行时长;
  • flat%和cum%指的就是flat耗时和cum耗时占总耗时的百分比;
  • sum%指的就是每一行的flat%与上面所有行的flat%总和,代表从上到下的累计值;
  1. 参考链接:

判断某个时间是否在某个时间区间之内

注意判断边界条件,比如: “2019-09-25 15:40:45” 并不在 “2019-09-25 15:40:45” 与 “2019-09-25 15:40:46”之间。

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
 package main

import (
"fmt"
"time"
)

const (
checkTimeFormat string = "%04d-%02d-%02d %02d:%02d:%02d"
timeFormat = "2006-01-02 15:04:05"
)

func testTimeDuration() {
startHour := 15
startMin := 40
endHour := 16
endMin := 59

startTimeStr := fmt.Sprintf(checkTimeFormat, time.Now().Year(), time.Now().Month(), time.Now().Day(),
startHour, startMin, 0)
endTimeStr := fmt.Sprintf(checkTimeFormat, time.Now().Year(), time.Now().Month(), time.Now().Day(),
endHour, endMin, 0)
nowTimeStr := time.Now().Format(timeFormat)

startTime, err := time.Parse(timeFormat, startTimeStr)
endTime, err := time.Parse(timeFormat, endTimeStr)
nowTime, err := time.Parse(timeFormat, nowTimeStr)
fmt.Println("start:", startTime)
fmt.Println("now:", nowTime)
fmt.Println("end:", endTime)

if err == nil && nowTime.After(startTime) && nowTime.Before(endTime) {
fmt.Println("yes")
} else {
fmt.Println("no")
}
}

func main() {
testTimeDuration()
}

Golang通过GOTRACEBACK生成程序崩溃后core文件

方法1:

1
export GOTRACEBACK=crash

eg:

1
2
export GOTRACEBACK=crash
nohup ${LIMIT} ${BIN_DIR}/proxy ${CONFIG_PARAM} -log ${LOG_DIR}/${PROXY_LOG} 1>>${LOG_DIR}/${PROXY_LOG} 2>&1 </dev/null &

方法2:

1
nohup env GOTRACEBACK=crash

eg:

1
/usr/bin/nohup env GOTRACEBACK=crash /home/work/goworkpace/bin/main >> /home/work/goworkpace/log/crash.log