golang 在一个协程内部,再创建一个或多个协程,是否会产生依赖(父子)关系?

做了一个小实验,这里随笔记录一下经过,备注后续深入研究。

test代码:


package main

import (
    "fmt"
    "time"
)

func main() {
    go func() {
        fmt.Println("father alive")

        go func() {
            time.Sleep(time.Second * 2)
            fmt.Println("child alive")
        }()
        defer fmt.Println("father dead")
        return
    }()
    time.Sleep(time.Second * 3)
}

 

 

运行结果:

可以得出结论:不同于linux里的进程依赖,golang里,协程都是互相独立的,没有依赖(父子)关系。main函数本身也运行在一个goroutine中,main是所有协程的被依赖者,这里是个特例。

golang test说明解读

go test是go语言自带的测试工具,其中包含的是两类,单元测试和性能测试

通过go help test可以看到go test的使用说明:

格式形如:

go test [-c] [-i] [build flags] [packages] [flags for test binary]

参数解读:

-c : 编译go test成为可执行的二进制文件,但是不运行测试。

-i : 安装测试包依赖的package,但是不运行测试。

关于build flags,调用go help build,这些是编译运行过程中需要使用到的参数,一般设置为空

关于packages,调用go help packages,这些是关于包的管理,一般设置为空

关于flags for test binary,调用go help testflag,这些是go test过程中经常使用到的参数

-test.v : 是否输出全部的单元测试用例(不管成功或者失败),默认没有加上,所以只输出失败的单元测试用例。

-test.run pattern: 只跑哪些单元测试用例

-test.bench patten: 只跑那些性能测试用例

-test.benchmem : 是否在性能测试的时候输出内存情况

-test.benchtime t : 性能测试运行的时间,默认是1s

-test.cpuprofile cpu.out : 是否输出cpu性能分析文件

-test.memprofile mem.out : 是否输出内存性能分析文件

-test.blockprofile block.out : 是否输出内部goroutine阻塞的性能分析文件

-test.memprofilerate n : 内存性能分析的时候有一个分配了多少的时候才打点记录的问题。这个参数就是设置打点的内存分配间隔,也就是profile中一个sample代表的内存大小。默认是设置为512 * 1024的。如果你将它设置为1,则每分配一个内存块就会在profile中有个打点,那么生成的profile的sample就会非常多。如果你设置为0,那就是不做打点了。

你可以通过设置memprofilerate=1和GOGC=off来关闭内存回收,并且对每个内存块的分配进行观察。

-test.blockprofilerate n: 基本同上,控制的是goroutine阻塞时候打点的纳秒数。默认不设置就相当于-test.blockprofilerate=1,每一纳秒都打点记录一下

-test.parallel n : 性能测试的程序并行cpu数,默认等于GOMAXPROCS。

-test.timeout t : 如果测试用例运行时间超过t,则抛出panic

-test.cpu 1,2,4 : 程序运行在哪些CPU上面,使用二进制的1所在位代表,和nginx的nginx_worker_cpu_affinity是一个道理

-test.short : 将那些运行时间较长的测试用例运行时间缩短

Golang实现MySQL不定字段,动态字段查询

package main

import (
“database/sql”
“fmt”
_ “github.com/go-sql-driver/mysql”
)

func main() {
//连接数据库
db, err := sql.Open(“mysql”, “root:@tcp(localhost:3306)/go?charset=utf8”)
if err != nil {
fmt.Println(“连接数据库失败”, err.Error())
return
}
defer db.Close()

//查询数据库
query, err := db.Query(“select * from go_user”)
if err != nil {
fmt.Println(“查询数据库失败”, err.Error())
return
}
defer query.Close()

//读出查询出的列字段名
cols, _ := query.Columns()
//values是每个列的值,这里获取到byte里
values := make([][]byte, len(cols))
//query.Scan的参数,因为每次查询出来的列是不定长的,用len(cols)定住当次查询的长度
scans := make([]interface{}, len(cols))
//让每一行数据都填充到[][]byte里面
for i := range values {
scans[i] = &values[i]
}

//最后得到的map
results := make(map[int]map[string]string)
i := 0
for query.Next() { //循环,让游标往下推
if err := query.Scan(scans…); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
fmt.Println(err)
return
}

row := make(map[string]string) //每行数据

for k, v := range values { //每行数据是放在values里面,现在把它挪到row里
key := cols[k]
row[key] = string(v)
}
results[i] = row //装入结果集中
i++
}

//查询出来的数组
for k, v := range results {
fmt.Println(k, v)
}

db.Close() //用完关闭
}

Goland常用快捷键大全

文件相关快捷键:

CTRL+E,打开最近浏览过的文件。
CTRL+SHIFT+E,打开最近更改的文件。
CTRL+N,可以快速打开struct结构体。
CTRL+SHIFT+N,可以快速打开文件。

代码格式化:

CTRL+ALT+T,可以把代码包在一个块内,例如if{…}else{…}。
CTRL+ALT+L,格式化代码。
CTRL+空格,代码提示。
CTRL+/,单行注释。CTRL+SHIFT+/,进行多行注释。
CTRL+B,快速打开光标处的结构体或方法(跳转到定义处)。
CTRL+“+/-”,可以将当前方法进行展开或折叠。

查找和定位

CTRL+R,替换文本。
CTRL+F,查找文本。
CTRL+SHIFT+F,进行全局查找。
CTRL+G,快速定位到某行。

代码编辑

ALT+Q,可以看到当前方法的声明。
CTRL+Backspace,按单词进行删除。
SHIFT+ENTER,可以向下插入新行,即使光标在当前行的中间。
CTRL+X,删除当前光标所在行。
CTRL+D,复制当前光标所在行。
ALT+SHIFT+UP/DOWN,可以将光标所在行的代码上下移动。
CTRL+SHIFT+U,可以将选中内容进行大小写转化。

 

一、Goland快捷键设置

GoLand支持各种编辑器的快捷键映射:File->Settings->Keymap
Go语言开发(十)、GoLand常用快捷键

二、GoLand常用快捷键

1、查询快捷键

CTRL+N 查找类
CTRL+SHIFT+N 查找文件
CTRL+SHIFT+ALT+N 查找类中的方法或变量
CTRL+B 快速打开光标处的类或方法
CTRL+ALT+B 找所有的子类
CTRL+SHIFT+B 找变量的类
CTRL+G 定位行
CTRL+F 在当前窗口查找文本
CTRL+SHIFT+F 在指定窗口查找文本
CTRL+R 在 当前窗口替换文本
CTRL+SHIFT+R 在指定窗口替换文本
ALT+SHIFT+C 查找修改的文件
CTRL+E 最近打开的文件
F3 向下查找关键字出现位置
SHIFT+F3 向上一个关键字出现位置
F4 查找变量来源
CTRL+ALT+F7 选中的字符查找工程出现的地方
CTRL+SHIFT+O 弹出显示查找内容
ALT+F1 查找文件所在目录位置
CTRL+H 显示类结构图
CTRL+Q 显示注释文档
CTRL+SHIFT+I 简短查看源定义
CTRL+SHIFT+P 查看表达式类型(在表达式上或者表达式末尾使用)

2、自动代码

Alt+Enter 导入包,自动修正
CTRL+ALT+L 格式化代码
CTRL+ALT+I 自动缩进
CTRL+ALT+O 优化导入的类和包
ALT+INSERT 生成代码(如GET,SET方法,构造函数等)
CTRL+SHIFT+SPACE 自动补全代码
CTRL+空格 代码提示
CTRL+ALT+SPACE 类名或接口名提示
CTRL+P 方法参数提示
CTRL+J 自动代码
CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
SHIFT+F6 重构-重命名
CTRL+I 实现接口
CTRL+SHIFT+Space 智能类型推断式返回(return关键字后使用)
CTRL+ALT+V 自动生成表达式返回值
CTRL+ALT+M 重构表达式为函数(光标在表达式末尾)
CTRL+Space 快速返回实现(return关键字后使用)

3、复制快捷方式

CTRL+D 复制行
CTRL+X 剪切,删除行

4、其他快捷方式

CIRL+U 大小写切换
CTRL+Z 倒退
CTRL+SHIFT+Z 向前
CTRL+ALT+F12 资源管理器打开文件夹
SHIFT+ALT+INSERT 竖编辑模式
Ctrl+/ 将当前行代码注释或取消注释
Ctrl+Shift+/ 在当前光标位置添加/**/或将/*xxxx*/内容取消注释
CTRL+W 选中代码,连续按会有其他效果
ALT+ ←/→ 切换代码视图
CTRL+ALT ←/→ 返回上次编辑的位置
ALT+ ↑/↓ 在方法间快速移动定位
ALT+1 快速打开或隐藏工程面板
CTRL+SHIFT+UP/DOWN 代码向上/下移动。
CTRL+UP/DOWN 光标跳转到第一行或最后一行下
ESC 光标返回编辑框
SHIFT+ESC 光标返回编辑框,关闭无用的窗口
ALT+J 相同单词多选
CTRL+SHIFT+A 工具调用
Ctrl+PageUp/PageDown 光标跳转到第一行或最后一行