GitHub路径: https://github.com/astaxie/beego.官网地址:https://beego.me/.
go get -u github.com/astaxie/beego下载beego
go get -u github.com/beego/bee下载bee
bee run -gendoc=true -downdoc=true热编译
bee generate docs自动生成swagger
@Title
接口的标题,用来标示唯一性,唯一,可选
格式:之后跟一个描述字符串
@Description
接口的作用,用来描述接口的用途,唯一,可选
格式:之后跟一个描述字符串
@Param
请求的参数,用来描述接受的参数,多个,可选
格式:变量名传输类型类型是否必须描述
传输类型:
类型:
变量名和描述是一个字符串
是否必须:true 或者false
string
int
int64
对象,这个地方大家写的时候需要注意,需要是相对于当前项目的路径.对象,例如models.Object表示models目录下的Object对象,这样bee在生成文档的时候会去扫描改对象并显示给用户改对象。
query 表示带在url串里面?aa=bb&cc=dd
form 表示使用表单递交数据
path 表示URL串中得字符,例如/user/{uid}那么uid就是一个path类型的参数
body 表示使用raw body进行数据的传输
header 表示通过header进行数据的传输
@Success
成功返回的code和对象或者信息
格式:code 对象类型信息或者对象路径
code:表示HTTP的标准statuscode,200 201等
对象类型:{object}表示对象,其他默认都认为是字符类型,会显示第三个参数给用户,如果是{object}类型,那么就会去扫描改对象,并显示给用户
对象路径和上面Param中得对象类型一样,使用路径.对象的方式来描述
@Failure
错误返回的信息,
格式: code 信息
code:同上Success
错误信息:字符串描述信息
@router
上面已经描述过支持两个参数,第一个是路由,第二个表示支持的HTTP方法
go test忽略log信息,go test -v冗长模式,打印实时的log信息
go test -(test.)v -(test.)run "Test_Caller_G"测试Test_Caller_G方法
go test -v err_test.go测试并运行这个文件
go test -test.bench="Benchmark_The_Caller_G"
go build
go build main.go
go build -o unichain main.go
panic:
1、内建函数
2、假如函数F中书写了panic语句,会终止其后要执行的代码,在panic所在函数F内如果存在要执行的defer函数列表,按照defer的逆序执行
3、返回函数F的调用者G,在G中,调用函数F语句之后的代码不会执行,假如函数G中存在要执行的defer函数列表,按照defer的逆序执行
4、直到goroutine整个退出,并报告错误
recover:
1、内建函数
2、用来控制一个goroutine的panicking行为,捕获panic,从而影响应用的行为
3、一般的调用建议
a). 在defer函数中,通过recever来终止一个goroutine的panicking过程,从而恢复正常代码的执行
b). 可以获取通过panic传递的error
1. 单元测试原则:
a) 文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码
b) 你必须import testing这个包
c) 测试用例会按照源代码中写的顺序依次执行(也可以单独执行某个方法)
d) 所有的测试用例函数必须是Test开头,测试函数TestXxx()的参数是testing.T,我们可以使用该类型来记录错误或者是测试状态
e) 测试格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名。
f) 函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。
2. 性能测试原则
a) 压力测试用例必须遵循如下格式,其中XXX可以是任意字母数字的组合,但是首字母不能是小写字母
funcBenchmarkXXX(b *testing.B) { ... }
b) go test不会默认执行压力测试的函数,如果要执行压力测试需要带上参数-test.bench,语法:-test.bench="test_name_regex",例如go test-test.bench=".*"表示测试全部的压力测试函数
c) 在压力测试用例中,请记得在循环体内使用testing.B.N,以使测试可以正常的运行
d) 文件名也必须以_test.go结尾
1. 字符串分割
func main() {
fmt.Println(strings.Split("a,b,c,d,e", ",")) //[a b cd e]
}
2. 字符串拼接
func main() {
s := []string{"hello", "word", "xiaowei"}
fmt.Println(strings.Join(s, "-")) // hello-word-xiaowei
}
结构体字段首字母必须大写,否则不会被解析!!!
new 的作用是分配内存,并返回一个指向新分配类型零值的指针(*T),make 的作用是为slice,map 或 chan 分配内存,初始化并返回引用(T)
指针是对象有址有值,值是地址,指向对象的地址。可以随意指向,也可为空指针
引用是别名常量指针,绑定对象,无法改变,也不可为空
安装
git clonehttps://github.com/grpc/grpc-go.git %GOPATH%/src/google.golang.org/grpc
git clone https://github.com/golang/net.git %GOPATH%/src/golang.org/x/net
git clone https://github.com/golang/text.git%GOPATH%/src/golang.org/x/text
go get -ugithub.com/golang/protobuf/proto
goget -u github.com/golang/protobuf/protoc-gen-go
git clonehttps://github.com/google/go-genproto.git %GOPATH%/src/google.golang.org/genproto
cd %GOPATH%/src/
go install google.golang.org/grpc
编译命令
· -I
参数:指定import路径,可以指定多个-I
参数,编译时按顺序查找,不指定时默认查找当前目录
· --go_out
:golang编译支持,支持以下参数
o plugins=plugin1+plugin2
- 指定插件,目前只支持grpc,即:plugins=grpc
o M
参数 - 指定导入的.proto文件路径编译后对应的golang包名(不指定本参数默认就是.proto
文件中import
语句的路径)
o import_prefix=xxx
- 为所有import
路径添加前缀,主要用于编译子目录内的多个proto文件,这个参数按理说很有用,尤其适用替代一些情况时的M
参数,但是实际使用时有个蛋疼的问题导致并不能达到我们预想的效果,自己尝试看看吧
o import_path=foo/bar
- 用于指定未声明package
或go_package
的文件的包名,最右面的斜线前的字符会被忽略
o 末尾:
编译文件路径
.proto
文件路径
(
支持通配符
)
protoc --go_out=plugins=grpc:. common.proto在当前目录下编译名为common.proto的文件
protoc --go_out=plugins=grpc:. unichain-go\protoc\orderer\service.proto编译指定目录下名为service.proto的文件
若编译时引用了其他的文件可能会报如下错误,只需要再命令上加入两个--proto_path即可,一个是引用的路径,一个是待编译文件的路径
protoc -I =C:\Users\dell-20\go\src\unichain-go\protoc\orderer --go_out=plugins=grpc:.unichain-go\protoc\orderer\service.proto
protoc --go_out=plugins=grpc:. protoc\gossip\message.proto
git clone [url] 下载源码【1】
git branch查看本地分支git branch -a包括本地和远程
git branch wangff-api创建名为wangff-api的分支【2】
git checkout wangff-api切换到wangff-api的分支【3】
git commit -a -m“abc“ 将所有修改的源码提交,注释abc【4】
git push -u origin wangff-api推送到wangff-api的分支【5】
git branch -d wangff-api删除本地wangff-api分支
git branch -D wangff-api强制删除本地wangff-api分支
git fetch 拉取本地不存在的远程分支
git remote prune origin 清楚本地无效的远程分支
git push origin --delete wangff-api删除远程wangff-api分支
git pull -u origin wangff-api-mutli-params: wangff-api-mutli-params更新本地代码
Merge Request提交合并请求这里是在浏览器创建的【6】
进入分支
选中你想merge 的分支,点击Merge request
选择你要切换的分支
选完之后点击Comparebranches and continue
填写相关信息之后,点击Submitmerge request,之后相关责任人就可以看见并讨论处理
cat /etc/os-release 查看操作系统相关信息
xrandr查看当前系统分辨率和支持设置的分辨率
xrandr -s 1600x1200[_60.00]设置当前系统分辨率为1600x1200[刷新频率为60.00Hz]
cvt 1920 1080 60新增1920x1080 刷新频率为60的系统分辨率
ls -l 文件名称查看linux文件的权限
ls -ld 文件夹名称(所在目录)查看linux文件夹的权限
chmod [u/g/o/a][+/-/=][r/w/x]file指定某类用户的权限
· [ u / g / o / a ] 为权限范围,其中
u:User,即文件或目录的拥有者
g:Group,即文件或目录的所属群组
o:Other,除了文件或目录拥有者和所属群组外,其他用户都属于这个范围
a:All,即全部用户
· 权限操作
+表示增加权限
-表示取消权限
=表示取消之前的权限,并给予唯一的权限
· 权限代号
r:读取权限,数字代号为“4”
w:写入权限,数字代号为“2”
x:执行权限,数字代号为“1”
-:不具备任何权限,数字代号为“0”
· file,文件名(路径)
chmod [xyz] file同时指定三类用户的权限
其中x,y,z分别指定User、Group、Other的权限;用三位二进制数表示 ” r , w , x”(注意顺序)三种权限,其中 0 代表没有该权限,1 代表有该权限,如 100 则表示,有 ‘r”权限,无 “w x”权限;再将这个三位的二进制数转为十进制,则是 x (或y,z)的值
chmod [xyz] -R file递归处理,修改文件的权限,包括子目录中的文件权限也会修改
gnome-terminal -x bash -c "sh ./run.sh;exec bash;"
-x 后面的为要在打开的终端中执行的脚本,根据需要自己修改就行了。
exec bash 是让打开的终端在执行完脚本后不关闭。
mv [选项] 源文件或目录 目标文件或目录 移动
- i 交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件。
- f 禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,指定此选项后,i选项将不再起作用。
如果所给目标文件(不是目录)已存在,此时该文件的内容将被新文件覆盖。为防止用户用mv命令破坏另一个文件,使用mv命令移动文件时,最好使用i选项。
cp [选项] 源文件或目录 目标文件或目录 复制
- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
- d 拷贝时保留链接。
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。
需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。
rm [选项] 文件… 删除
- f 忽略不存在的文件,从不给出提示。
- r 指示rm将参数中列出的全部目录和子目录均递归地删除。
- i 进行交互式删除。
使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。为了防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件将被删除。如果输入任何其他东西,文件则不会删除。
打开“系统设置“,点击”语言支持“,然后弹出下面的框图,点击”安装“。
在把下面的Keyboardinput method system:IBus改为fcitx,重启之后就可以了
lsof -i用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具。以root用户来执行lsof -i命令。lsof -i:端口号 用于查看某一端口的占用情况
echo stat | nc 127.0.0.1 2181
通过nc 命令连接到指定的 ZK 服务器, 然后发送 stat 可以查看 ZK 服务的状态
通用格式:find pathname -options[-print -exec -ok]
例子:
find/ -name filename 再根目录里面搜索文件名为filename的文件
find/etc -name *s*在目录里面搜索带有s的文件
find/etc -name *S 在目录里面搜索以s结尾的文件
find/etc -name s*在目录里面搜索以s开头的文件
find/ -amin -10在系统中搜索最后10分钟访问的文件
find/ -atime -2查找在系统中最后48小时访问的文件
find/ -empty 查找在系统中为空的文件或者是文件夹
find/ -group groupname查找在系统中属于groupname的文件
find/ -mmin -5查找在系统中最后5分钟修改过的文件
find/ -mtime -1查找在系统中最后24小时修改过的文件
find/-nouser查找在系统中属于费用户的文件
find/ -user username 查找在系统中属于username的文件
find/ -ctime -1查找在系统中最后24小时被改变状态的文件
find/ -fstype type查找在系统中文件类型为?的文件
find/ -user user1name -or -useruser2name查找在系统中属于user1name或着属于user2name的文件
find/ -user user1name -and-user2name在系统中查找既属于user1name又属于user2name用户的文件.
sudo apt-get install golang
apt-get --purge remove golang
# 删除软件及其配置文件
apt-get --purge remove <package>
# 删除没用的依赖包
apt-get autoremove <package>
# 此时dpkg的列表中有“rc”状态的软件包,可以执行如下命令做最后清理:
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
Linux下:
mongo -version 查看mongodb版本
service mongodb start 启动服务
service mongodb stop 停止服务
pgrep mongo -l 查看进程是否启动
show dbs 显示数据库列表
show collections 显示当前数据库中的集合(类似关系数据库中的表table)
show users 显示所有用户
use yourDB 切换当前数据库至yourDB
db.help() 显示数据库操作命令
db.yourCollection.help() 显示集合操作命令,yourCollection是集合名
在安装go插件时,会自动更新很多依赖库文件,都是从Github更新下来,但是因为Github的文件中,多有应用go官网中的文件,导致,因为网络缘故,不能直接下载,导致安装失败,如下:
Installing github.com/nsf/gocode SUCCEEDED
Installing github.com/uudashr/gopkgs/cmd/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline FAILED
Installing github.com/acroca/go-symbols FAILED
Installing golang.org/x/tools/cmd/guru FAILED
Installing golang.org/x/tools/cmd/gorename FAILED
Installing github.com/fatih/gomodifytags SUCCEEDED
Installing github.com/haya14busa/goplay/cmd/goplay SUCCEEDED
Installing github.com/josharian/impl FAILED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing sourcegraph.com/sqs/goreturns FAILED
Installing github.com/golang/lint/golint FAILED
Installing github.com/cweill/gotests/... FAILED
Installing github.com/derekparker/delve/cmd/dlv SUCCEEDED
8 tools failed to install.
这些失败的库,不是没有下载下来,而是以来的文件在go官网上,导致失败。以下为解决办法,
1
、在
%GOPATH%\src\
目录下,建立
golang.org
文件夹,并再新建
x
文件夹。
目录为
"%GOPATH\src\golang.org\x\"
2
、完成目录切换后,开始下载插件包:
git clone https://github.com/golang/tools.git tools
3、执行完以后,会多一个tools文件夹。
4、git clone https://github.com/golang/lint.git lint
5、打开vsCode终端,切换到终端,进入“%GOPATH”目录,执行
go installgithub.com/ramya-rao-a/go-outline
go installgithub.com/acroca/go-symbols
go installgolang.org/x/tools/cmd/guru
go installgolang.org/x/tools/cmd/gorename
go get github.com/josharian/impl
go install github.com/josharian/impl
go install github.com/rogpeppe/godef
go install github.com/sqs/goreturns
go installgithub.com/golang/lint/golint
go installgithub.com/cweill/gotests/gotests
go install github.com/ramya-rao-a/go-outline
go installgithub.com/acroca/go-symbols
go installgolang.org/x/tools/cmd/guru
go installgolang.org/x/tools/cmd/gorename
go install github.com/josharian/impl
go install github.com/rogpeppe/godef
go install github.com/sqs/goreturns
go install github.com/golang/lint/golint
go get github.com/cweill/gotests/gotests
go installgithub.com/cweill/gotests/gotests
按此方法,可以安装成功。
1. 安装插件
go get -u github.com/kardianos/govendor
2. 查看安装是否成功
govendor
3. 为项目增加依赖包
govendor add +external
4. 删除无用的依赖包
govendor remove +u
5. 查看项目依赖包状态(具体状态)
govendor list (+u)
6. 下载依赖
govendor fetch github.com/tjfoc/gmsm
7.
Packagescan be specified by their "status".
+local (l) packages in your project
+external (e) referenced packages in GOPATH but not in current project
+vendor (v) packages in the vendor folder
+std (s) packages in the standard library
+excluded (x) external packages explicitly excluded from vendoring
+unused (u) packages in the vendor folder, but unused
+missing (m) referenced packages but not found
+program (p) package is a main package
+outside +external +missing
+all +all packages
1. 启动:
在/CMD/node/ 文件夹下
点击文件,打开WindowsPowerShell,
键入命令go run .\main.go start -c.\cmd\node1.json
bin/zookeeper-server-start.sh config/zookeeper.properties &启动zookeeper bin/zookeeper-server-stop.sh 停止zookeeper
bin/kafka-server-start.sh config/server.properties &启动kafka bin/kafka-server-stop.sh停止kafka
bin/kafka-topics.sh --create --zookeeper localhost:2181--replication-factor 1 --partitions 1 --topic testtopic创建Topic bin/kafka-topics.sh--delete --zookeeper localhost:2181 --topic testtopic删除Topic
bin/kafka-console-producer.sh --broker-list localhost:9092 --topictesttopic运行producer
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topictesttopic --from-beginning运行customer
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topictesttopic 显示topic、parition和lead节点等配置信息
bin/kafka-topics.sh --list --zookeeper localhost:2181 查看topic
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-listlocalhost:9092 --topic conntopic --time -1 查看当前集群中主题的最大偏移量
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-listlocalhost:9092 --topic conntopic --time -2 查看当前集群中主题的最小偏移量
## List Docker CLI commands
docker
docker container --help
## Display Docker version and info
docker --version
docker version
docker info
##Createimage using this directory's Dockerfile 创建docker镜像并命名为friendlyhello
docker build -t friendlyhello .
## Execute Docker image 执行镜像、端口从4000映射到80、后台运行
docker run hello-world
docker run -p 4000:80 friendlyhello
docker run -d -p 4000:80 friendlyhello
## List Docker images 展示本地镜像
docker images
docker image ls
docker image rm <image id># Removespecified image from this machine
docker rmi REPOSITORY:TAG # 删除指定的image
docker image rm $(docker image ls -a -q)# Remove all images from this machine
## List Docker containers (running, all,all in quiet mode) 显示镜像ID和运行信息
docker container ls
docker container ls -a
docker container ls --all
docker container ls –aq
docker container stop <CONTAINER ID>
docker container kill <hash> # Force shutdown ofthe specified container
docker container rm <hash># Removespecified container from this machine
docker container rm $(docker container ls -a -q)# Remove all containers
docker: Errorresponse from daemon: lstat/var/lib/docker/overlay2/467469c733b0c3121a197cd7c2c60a0923ac969a434256105cb4c98336b228ab:no such file or directory.
See 'docker run--help'.
1 . systemctl stop docker #停止docker服务
2. rm -rf /var/lib/docker/* #删除目录
3. systemctl start docker #再启动docker服务
4. 重新导入docker镜像
5. 再启动镜像,成功。
docker build -t appname .
docker run appname [params]
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi
docker pull wurstmeister/zookeeper 下载zookeeper 镜像
docker pull wurstmeister/kafka 下载kafka 镜像
docker run -d --name zookeeper -p 2181 -t wurstmeister/zookeeper 启动zookeeper
docker run -d --name kafka --publish 9092:9092 \
--link zookeeper \
--envKAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=localhost\
--envKAFKA_ADVERTISED_PORT=9092 \
--volume/etc/localtime:/etc/localtime \
wurstmeister/kafka:latest 启动kafka
docker exec -it ${CONTAINER ID} /bin/bash 进入kafka容器
bin/kafka-topics.sh --create --zookeeper 172.17.0.1:32772 --replication-factor1 --partitions 1 --topic conntopic 创建Topic
exit 退出容器
那么到底是怎么回事?我们的Scratch容器内已经有静态链接的可执行文件。难道我们犯了什么错误?
事实证明,Go不是静态链接库的,或者至少不是所有的库。在Linux下,我们可以看到动态链接库用以下命令:
ldd unichain
输出:
1. linux-vdso.so.1 => (0x00007fff039fe000)
2. libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f61df30f000)
3. libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f61def84000)
4. /lib64/ld-linux-x86-64.so.2 (0x00007f61df530000)
为了创建静态链接的可执行文件,我们需要使用cgo编译器,而不是Go编译器。
CGO_ENABLED=0 go build -o unichian main.go
重新运行ldd命令:
输出:
not a dynamicexecutable
然后重新build docker ,运行即可
docker swarm init #初始化集群
docker stack deploy -c docker-compose_sample.ymlunichainlab #开启
docker stack rm unichainlab #关闭
docker swarm leave --force
docker-compose up
docker service ls
docker service logs --detailsunichainlab_zoo1