分类 Golang 下的文章



官方文档https://golang.org/pkg/database/sql/#DB,虽然写了如何使用它来执行SQL数据库查询和语句的例子,但是没有很好的说明如何正确的配置sql.DB改善性能,SetMaxOpenConns(), SetMaxIdleConns() and SetConnMaxLifetime()这三个方法也通常被初学者忽略。
golang_mysql_driver.jpg

Open and idle connections:

一个sql.DB是包含许多'open'和'idle'连接的数据库连接池的对象。 当你使用它执行数据库任务时(例如执行SQL语句或查询行),连接标记为打开。 任务完成后,连接变为空闲状态

当你使用sql.DB执行数据库任务时,它将首先检查连接池中是否有空闲连接。 如果有一个可用,那么Go将重新使用现有连接并在任务持续期间将其标记为打开。 如果连接池中没有空闲的连接,那么Go会创建一个新的连接并'打开'它。

Read more...


JavaScript 是一个字符占用一位的。例如 Hello, 世界 包含 9 个字符,然而在Golang 直接调用len() 方法获取
长度 确是 13个字符。我们知道Golang 是UTF-8编码的。

在 Go 语言中,是不能用 len 函数来统计字符串中的字符个数的,这是因为在 Go 中,字符串是以 UTF-8 为格式进行存储的,在字符串上调用 len 函数,取得的是字符串包含的 byte 的个数。

例如字符串:Hello, 世界 包含 9 个字符。使用 len("Hello, 世界") 得到的结果为 13,因为这个字符串占用 13 个字节:

s := "Hello, 世界"
fmt.Println(len(s)) // 13
fmt.Println([]byte(s)) // [72 101 108 108 111 44 32 228 184 150 231 149 140]

Read more...


// PanicTrace trace panic stack info.
func PanicTrace(kb int) []byte {
    s := []byte("/src/runtime/panic.go")
    e := []byte("\ngoroutine ")
    line := []byte("\n")
    stack := make([]byte, kb<<10) //4KB
    length := runtime.Stack(stack, true)
    start := bytes.Index(stack, s)
    stack = stack[start:length]
    start = bytes.Index(stack, line) + 1
    stack = stack[start:]
    end := bytes.LastIndex(stack, line)
    if end != -1 {
        stack = stack[:end]
    }
    end = bytes.Index(stack, e)
    if end != -1 {
        stack = stack[:end]
    }
    stack = bytes.TrimRight(stack, "\n")
    return stack
}

Read more...