11月 152017
 

gops用来查看系统中存在的go进程。

注意事项:

gops有可能没发现你的go进程:

一方面可能进程是藏在容器中的,在宿主机上gops就发现不了

另一种情况,就是gops参考的是进程文件的特征,该特征在不同go版本可能不一样,比如,我的gops能发现go 1.11的go进程,就发现不了go 1.14的go进程

如下:

gops能list出来系统中的go进程,如果内置了agent的话,还能添加个星号,带星号的进程可以进行深度的分析(因为有agent呀)

那么,gops是如何找到所有go进程,又是如何识别出来agent的呢?

关键代码是这么写的:

 

  1. 拿到所有的系统进程
  2. 分析进程文件可以检测是否go进程
  3. 在进程的用户目录下查找 .config/gops/{$pid}  文件,如果存在,就认为是有内置了agent了,该文件中存放的是agentlisten的端口号

如下:

 Posted by at 下午 4:04
7月 182017
 

示例:

上面是 golang.org/x/net/proxy/direct.go 里面的代码

  1. 我们显然是可以在proxy包外访问到Direct变量的
  2. 我们显然是无法在proxy包外new 一个 direct 结构变量的
  3. 由于2,而且我们无法改变Direct的变量类型,所以,我们做不到给Direct进行重新赋值
 Posted by at 下午 12:03
4月 202016
 

参考文章: https://baokun.li/archives/go-get-proxy/

在你的nginx中添加配置:

注意:修改你自己的域名

另:

  1. 可能你自己的gitlab没有配置https,那么可以给go get 添加 -insecure 选项即可
  2. 可能你的gitlab仓库需要输入用户名和密码,那么你可以改成public的就好了

 

 Posted by at 下午 1:10
2月 172016
 

Delve is a debugger for the Go programming language. The goal of the project is to provide a simple, full featured debugging tool for Go. Delve should be easy to invoke and easy to use. Chances are if you’re using a debugger, most likely things aren’t going your way. With that in mind, Delve should stay out of your way as much as possible.

地址: https://github.com/derekparker/delve

 Posted by at 上午 11:24
11月 132015
 

题记:是否输出居然和是否和行尾换行有关系

代码:

why? …

因为printf是行缓冲的,不看到换行就不输出,可以在printf后面刷新标准输出:

另,在C的printf后面使用Go的fmt.Println(“^_^”)来输出一些东西,是不是就可以把C要打印的东西给输出来了呢?

代码如下:

结果发现,End 输出了,Hello world还是没输出。

原因:C的输出buffer和Go的不是一个

思考:

亲,你见过用C写的一个Hello world程序是必须有换行的吗?如下:

呃,这个确实没问题,why? C在退出的时候刷新输出缓冲了呗

说明:

To access a symbol originating from the C side, use the package name C. That is, if you want to call the C function printf() from Go code, you write C.printf(). Since variable argument methods like printf aren’t supported yet (issue 975)

翻译:如果你想调用C中的printf,那就是 C.printf(). 但是,向pringf这种可变参数个数的函数穿残还没有被支持,所以还不能直接写C.printf(). 只好自己包一下了

 

 Posted by at 下午 3:01
2月 022015
 

 缘起

在使用google的hg和Google-cloud-sdk时都会遇到需要设置http代理的问题;

方式1: export http_proxy=10.xx.xx.xx:8888      // 无效

方式2: export http_proxy=http://10.xx.xx.xx:8888     // 无效

方式3: export https_proxy=http://10.xx.xx.xx:8888   // 无效

为什么?

分析

通过下面对使用的python的httplib2的代码分析发现:

  1.  http_proxy 或https_proxy  大小写不敏感,也可以写作: HTTP_PROXY   HTTPS_PROXY  (当然,别大小写同时存在)
  2. 代理的形式必须是url形式,如: http://host:port
  3. 对于http请求只参考 HTTP_PROXY , 对于 https 请求只参考 HTTPS_PROXY
  4. 可以通过 no_proxy (大小写不敏感)环境变量使得部分指定的域名不走代理,多个域名用“逗号”分隔,“*”代表所有

 

其他:

对于Go写的程序来讲,对于https请求来讲,优先参考 https_proxy,然后参考http_proxy; 参考: net/http/transport.go

所以,如果有类似错误如下:

Get https://code.google.com/p/snappy-go/source/checkout?repo=: x509: certificate has expired or is not yet valid

请检查是否需要设置 http_proxy

 

关于 no_proxy 的进一步说明:

在玩docker的时候,由于docker是不欢迎 http_proxy https_proxy 这些环境变量的,于是添加 no_proxy 环境变量绕过,如下:

看起来似乎没啥问题,但是问题还是出现了,由于no_proxy 原本是 空的,于是现在的no_proxy 就成了:

似乎也没啥问题呀,但是cloud sdk的httplib2 不小心把 空 匹配了所有域名了,代码如下: (坑爹不?)

 

 

 

 Posted by at 下午 7:22
1月 232015
 

缘起

有些时候为了避免参数的copy,会尽可能将参数定义为指针类型;如果参数是一个接口,那么是不是要定义为接口的指针呢?如果不定一为指针是不是会导致“值传递”呢?

测试

 

http://play.golang.org/p/sw7ejPVV1t

结论

永远不要把接口参数前面添加一个星号

 Posted by at 下午 4:01