原 golang小技巧汇总

i冬瓜 · · 1392 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

获取命令行的参数

先定义变量
var value = flag.String("key", "默认值", "说明:xxx")
再解析命令
flag.Parse()

获得当前栈帧的信息

runtime包的Caller方法可以获得栈帧的信息,skip为栈帧的位置,0为当前函数的位置。
其中pc为program counter(我也不理解这个含义),file为当前函数所在的文件的文件名,lile为代码行号,ok为是否可以获取到信息
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
例如:
有个函数ABC(),在包pack下,然后在main方法里调用了pack.ABC()
在ABC里面调用_,filename,_c_ := runtime.Caller(0)可以获得ABC函数所在的文件的文件名包括路径。
_,filename,_c_ := runtime.Caller(1)可以获得main函数的文件名包括路径,因为是main调用了ABC,main比ABC先1步进栈

搭建一个文件服务器

首先获得文件服务器的handler
h := http.FileServer("文件服务根路径");
添加url和handler映射
http.Handle("/", h)
开启服务
http.ListenAndServe(":" + port, nil);

创建一对(读写连接)的文件

想文件w写入数据,可以从r读取出来
r, w, _ := os.Pipe();
下面是将os.Stdout作为w来写入,然后可以从r里读取出写入的内容
r, w, _ := os.Pipe();
originalOut := os.Stdout
os.Stdout = w
outChan := make(chan string)
go func() {
	var buf bytes.Buffer
	io.Copy(&buf, r)
	outChan <- buf.String()
}()
time.Sleep(1 * time.Second)
fmt.Print("aaa")
w.Close()
os.Stdout = originalOut
info := <-outChan
fmt.Println(info)

运行时执行cmd

exec包的Command函数可以执行cmd
func Command(name string, arg ...string) *Cmd
比如:执行go main.go
cmdName := "go"
cmdArgs := []string{"run", "main.go"}
cmd := exec.Command(cmdName, cmdArgs...)

 


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:i冬瓜

查看原文:原 golang小技巧汇总

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1392 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传