Go语言中文网 为您找到相关结果 976

golang 使用 strings.Split 切割的注意

s := strings.Split("", "") fmt.Println(s, len(s)) s = strings.Split("abc,abc", "") fmt.Println(s, len(s)) s = strings.Split("", ",") fmt.Println(s, len(s)) s = strings.Split("abc,abc", ",") fmt.Println(s, len(s)) s = strings.Split("abc,abc", "|") fmt.Println(s, len(s)) fmt.Println(len("")) fmt.Println(len([]string{""})) str := "" fmt.Println(str[0]...阅读全文

博文 2014-10-04 19:27:43 984195889

Go语言debug调试

文:http://www.cnblogs.com/yourihua/archive/2012/06/15/2541745.html说明:作为一门静态语言,似乎支持调试是必须的,而且,Go初学者喜欢问的问题也是:大家都用什么IDE?怎么调试?其实,Go是为多核和并发而生,真正的项目,你用单步调试,原本没问题的,可能会调出有问题。更好的调试方式是跟PHP这种语言一样,用打印的方式(日志或print)。当然,简单的小程序,如果单步调试,可以看到一些内部的运行机理,对于学习还是挺有好处的。下面介绍一下用GDB调试Go程序:(目前IDE支持调试Go程序,用的也是GDB。要求GDB 7.1以上)以下内容来自雨痕的《Go语言学习笔记》(下载Go资源):默认情况下,编译过的二进制文件已经包含了 DWARFv...阅读全文

博文 2014-12-14 09:00:07 halcyonbaby

Go 1.5 发布,完全移除 C,使用 Go 编译 Go

Go 1.5 正式发布,这是 Go 的第六个重要版本。 此版本包括大量重大改进,编译工具链从[ C 转换到 Go](https://golang.org/doc/go1.5#c),从 Go 代码库中完全移除 C 代码。[完完全全重新设计了](https://golang.org/doc/go1.5#gc)垃圾收集器,减少垃圾收集器的停顿时间。改进 scheduler,允许修改默认 [GOMAXPROCS](https://golang.org/pkg/runtime/#GOMAXPROCS) 值(并发执行 goroutines 数量),可以从 1 修改到逻辑 CPUs 的数量。改进 linker,允许分布式 Go 包作为分享库链接到 Go 程序,可以构建 Go 包到归档或者分享库,可以...阅读全文

golang url encode

import ( fm "fmt" "net/url" rt "runtime" ) func main() { var urlStr string = "http://baidu.com/index.php/?abc=1_羽毛" l, err := url.ParseQuery(urlStr) fm.Println(l, err) l2, err2 := url.ParseRequestURI(urlStr) fm.Println(l2, err2) l3, err3 := url.Parse(urlStr) fm.Println(l3, err3) fm.Println(l3.Path) fm.Println(l3.RawQuery) fm.Println(l3.Query()) fm....阅读全文

博文 2014-10-04 19:26:04 the-moving-ear

GoLang redis 连接池

最近被日志是折腾得死去活来,写文件无疑效率是最高的,但是分布式又成问题,虽然稍微折腾一下配合NFS,还是可以搞一搞的,但是始终语言设计没有那么方便。 最终决定用redis,换了redis以为就好了,因为内存运行嘛,谁知道tcp连接开销大得一塌糊涂,服务器负载一下子高了许多,使用netstat -an 查看发现一堆的 TIME_WAIT,连ssh到服务器都巨慢无比,所谓天下武功唯快不破,这么慢80岁老太太跳一支广场舞都能给灭了吧。 既然 tcp连接开销这么大,当然首要任务就是解决连接问题,明显一个请求一次连接是很不靠谱的,还不如直接往硬盘写日志呢,当然写日志第一段也说了,不支持分布式,业务分配没那么好。 那么,能不能先定只用一个连接呢,这显然是不行的,一个连接多个php-fpm互掐也会造成瓶颈...阅读全文

博文 2015-05-07 14:00:01 echo不惑

用 go 语言开发 android app

一. 下载官方源码 https://github.com/golang/mobile git clone https://github.com/golang/mobile.git 二. 将mobile目录移动到 $gopath/golang.org/x中 mkdir -p $gopath/golang.org/x && mv mobile $gopath/golang.org/x/ 三. 复制官方例子 basic 到 gopath 中 cp -a $gopath/golang.org/x/mobile/example/basic $gopath/ 四. 运行编译命令 cd $gopath/src/basic ./make.bash 1. 如果出现错误 go build runtime: an...阅读全文

博文 2015-01-28 11:00:02 oldfeel

vim 安装vim-go 打造GOLANG 专用IDE

分两步: 第一步:安装vim插件管理器Vundle 第二步:安装vim-go插件。 另外:我也写了一个自动安装的脚本。手懒的朋友,可以自行下载使用:https://github.com/aimin/InstallvimGo.git --------------------------------------------------------------------------------------- 开始: 第一步:安装Vundle 根据Vundle的安装说明,首先安装Vundle: $ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 然后对.vimrc进行配置,将Vundle的相关配...阅读全文

博文 2015-04-26 13:00:00 samxx8

一个有关Golang变量作用域的坑

一个有关Golang变量作用域的坑 一 13 bigwhite技术志 Go, Golang, scope, 作用域, 函数, 变量作用域, 坑 4 Comments 临近下班前编写和调试一段Golang代码,但运行结果始终与期望不符,怪异的很,下班前依旧无果。代码Demo如下: //testpointer.go package main import ( "fmt" ) var p *int func foo() (*int, error) { var i int = 5 return &i, nil } func bar() { //use p fmt.Println(*p) } func main() { p, err := foo() if err != nil { fmt.Print...阅读全文

博文 2015-01-20 09:24:46 bigwhite

[go语言] golang的goroutine机制和runtime.GOMAXPROCS

之前对golang的goroutine机制和runtime.GOMAXPROCS不是很理解,今天抽空研究了一下,学习了其他大牛的文章。把自己的理解写下来。如有错误,请指正 golang的goroutine机制有点像线程池: 一、go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(goroutine). 二、正常情况下一个cpu对象启一个工作线程对象,线程去检查并执行goroutine对象。碰到goroutine对象阻塞的时候,会启动一个新的工作线程,以充分利用cpu资源。所有有时候线程对象会比处理器对象多很多 我们用如下图分别表示P、M、G 在单核情况下,所有goroutine运行在同一个线程(M0)中,...阅读全文

博文 2015-03-08 05:00:01 EthanDorisHope

GO的TCP性能测试,优化结果

之前做过一次测试,没有任何优化的情况下C++(16Gbps)是GO(4Gbps)的4倍性能,参考http://blog.csdn.net/win_lin/article/details/40744175 这次针对TCP部分对go做了优化,测试结果令人满意。GO单进程(7Gbps)不输c++(8Gbps),是c++使用writev(16Gbps)的一半,GO多进程(59Gbps)完胜c++是c++的好几倍。 测试代码参考:https://github.com/winlinvip/srs.go/tree/master/research/tcp 备注:之前的测试是在虚拟机上,这次在物理机上,结果可能会略有不同。 Why TCP TCP是网络通讯的基础,而web则是基于HTTP框架,HTTP又基于T...阅读全文

博文 2014-11-22 14:00:01 winlinvip

Go语言TCP Socket编程

Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的。 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,socket在各大主流OS平台上都得到了很好的支持。关于tcp programming,最好的资料莫过于W. Richard Stevens 的网络编程圣经《UNIX网络 编程 卷1:套接字联网API》 了,书中...阅读全文

博文 2015-11-18 10:13:26 bigwhite

golang读取ini配置文件

golang读取ini配置文件 一、安装config配置解释包: go get github.com/larspensjo/config 二、载入其包及代码设置 package main import ( "flag" "fmt" "github.com/larspensjo/config" "log" "runtime" ) var ( configFile = flag.String("configfile", "config.ini", "General configuration file") ) //topic list var TOPIC = make(map[string]string) func main() { runtime.GOMAXPROCS(runtime.NumC...阅读全文

博文 2014-10-04 19:26:58 liaojie

近期遇到的3个Golang代码问题

近期遇到的3个Golang代码问题 一 23 bigwhite技术志 Channel, GDB, Go, Golang, goroutine, heartbeat, martini, runtime, template, top, Web, 坑, 惯用法, 模板, 调度 No Comments 这两周来业余时间都在用Golang写代码,现在处于这样一个状态:除了脚本,就是Golang了。反正能用golang实现的,都用golang写。 Golang语言相对成熟了,但真正写起来,还是要注意一些“坑”的,下面是这周遇到的三个问题,这里分享出来,希望能对遇到同样问题的童鞋有所帮助。 一、误用定时器,狂占CPU golang中有一个通过channel实现timeout或tick timer的非常id...阅读全文

博文 2015-02-15 18:02:09 bigwhite

轻松搭建基于go1.5开发Android应用的环境

原文[https://blog.weizhe.net/?p=534](https://blog.weizhe.net/?p=534) 有兴趣的同学欢迎来一起玩:[https://github.com/vzever/gomobileapp](https://github.com/vzever/gomobileapp) go1.5beta2已经发布,正式版将在8月份发布.而早在go1.4就已发布了golang/mobile项目用以实现Android应用的开发.当前gomobile的环境部署已经相对成熟了.但项目声明必须基于go1.5,所以go1.4的同学必须要升级.因为在go1.4执行gomobile init的时候是不能通过的. 注:如果没有网络权限访问golang.org,请创...阅读全文

go语言的chan

chan是一个FIFO队列,chan分成两种类型同步和异步同步的chan完成发送者和接受者之间手递手传递元素的过程,必须要求对方的存在才能完成一次发送或接受异步的chan发送和接受都是基于chan的缓存,但当缓存队列填满后,发送者就会进入发送队列, 当缓存队列为空时,接受者就会接入等待队列。 chan的数据结构: struct Hchan { uintgo qcount; // total data in the q uintgo dataqsiz; // size of the circular q uint16 elemsize; uint16 pad; // ensures proper alignment of the buffer that follows Hchan in mem...阅读全文

博文 2015-05-18 03:00:01 richmonkey

Golang编程经验总结

如何选择web框架: 首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要技术。当然如果想要ruby里面Rail那种高层次全栈式的MVC框架, Golang里面暂时没有,但是不是所有人都喜欢这种复杂的框架。Golang里面一些应用层面的技术需要自己去组装,比如session,cache, log等等. 可选择的web框架有martini, goji等,都是轻量级的。 Golang的web项目中的keepalive 关于keepalive, 是比较复杂的, 注意以下几点: http1.1 默认支持keepalive, 但是不同浏览器对keepalive都有个超时时间, 比如firefox: 默认超时时间115秒, 不同浏览器不一样; Nginx默认超时时间7...阅读全文

博文 2015-02-04 17:00:02 u013834131

Go语言的defer,你真的懂了吗?

2013-04-25 Go语言的defer,你真的懂了吗? example1 func f() (result int) { defer func() { result++ }() return 0 } example2 func f() (r int) { t := 5 defer func() { t = t + 5 }() return t } example3 func f() (r int) { defer func(r int) { r = r + 5 }(r) return 1 } 先不要运行代码,自己在心里跑一遍结果,然后再去验证。如果三个都做对了并且不好蒙的...好吧,不用往下看了,你已经懂defer了。 额,如果example1中你算的是0,你就错了;如果example2...阅读全文

博文 2015-03-16 11:57:12 zenlife

使用go tool pprof分析内存泄漏、CPU消耗

go中提供了pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来。 使用 net/http/pprof 做WEB服务器的性能监控 如果你的go程序是用http包启动的web服务器,想要查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。 import _ "net/http/pprof"然后就可以在浏览器中使用http://localhost:port/debug/pprof/ 直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。当然,非WEB的也可以用下面方式启动WEB。在 main...阅读全文

博文 2016-05-10 02:00:02 ghj1976

go runtime.Gosched()的作用分析

untime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。 看代码: package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 2; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") } 输出结果: hello world hello 注意结果: 1、先输出了hello,后输出了world. 2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程就...阅读全文

博文 2015-05-07 10:48:20 baiyuxiong

Golang Android 开发

前言 随着Golang发布1.4正式版,Android下的开发也可以实现(go/mobile)了,就等1.5版本的ios支持了,可以使用golang跨平台开发游戏了... 环境准备 Ant 下载apache-ant并配置好环境变量。 $ANT_HOME=antpath //你的ant目录$PATH=$ANT_HOME/bin:$PATH Android 下载SDK,android-ndk-r9d(这里之所以不用r10d是因为在测试时ndk源码出现问题,而r9d没有问题)。安装并配置环境变量。 $ANDROID_HOME=sdkpath //你的sdk目录$NDK_ROOT=ndkpath //你的ndk目录$PATH=$ANDROID_HOME/tools:$ANDROID_HOME/pla...阅读全文

博文 2015-02-03 10:00:01 ____追梦人

golang 坑集

func main() { x := 1 defer func(a int) { fmt.Println("a=", a) }(x) defer func() { fmt.Println("x=", x) }() x++ } 结果: x=2 a=1 说明: defer 调用所需参数在 defer 语句执行时就被已计算好了 (拷贝传递),闭包内则是引用,defer执行顺序FIFO 数组和slice 数组是值类型 slice是引用类型, 数组的创建 arr:=[...]int{1,2,3} arr:=[3]int{} arr:=new([10]int) (注意new返回的是[10]int的指针类) slice的创建 slice:=[]int{1,2,3} slice:=arr[n:m]( n <...阅读全文

博文 2014-10-04 19:27:11 健哥大人

go channel实现

go channel实现 转载自:http://alpha-blog.wanglianghome.org/2012/04/13/go-channel-implementation/ G语言经过多年的发展,于最近推出了第一个稳定版本。相对于C/C++来说,Go有很多独特之出,比如提供了相当抽象的工具,如channel和goroutine。本文主要介绍channel的实现方式。 简介 channel有四个操作: 创建:c = make(chan int)发送:c <- 1提取:i <- c关闭:close(c) 根据创建方式的不同,channel还可分为有buffer的channel和没有buffer的channel。buffer的大小由make的第二个参数指定,默认为0,即没有buffer。创...阅读全文

博文 2014-10-06 16:37:04 kai_ding

一个CGO的问题

写了个CGO的调用,用到了crypto这个库,但是程序有时候会正常运行,有时候又会崩溃,都是在同一个地方崩溃。崩溃的情况下报了这个错误: fatal error: unexpected signal during runtime execution [signal 0xb code=0x1 addr=0xfffffffff80011c0 pc=0x3dd1c6a437] runtime stack: runtime.gothrow(0x6fd250, 0x2a) /usr/local/go/src/runtime/panic.go:503 +0x8e runtime.sigpanic() /usr/local/go/src/runtime/sigpanic_unix.g...阅读全文

golang gRPC示例

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。 1、普通帐号安装protobuf unzip protobuf-cpp-3.0.0-alpha-3.zip cd protobuf-3.0.0-alpha-3/ ./configure make && sudo make install go get -u github....阅读全文

博文 2015-06-22 22:02:29 dazheng

一个有关Golang变量作用域的坑

自:http://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/ 临近下班前编写和调试一段Golang代码,但运行结果始终与期望不符,怪异的很,下班前依旧无果。代码Demo如下: //testpointer.go package main import ( "fmt" ) var p *int func foo() (*int, error) { var i int = 5 return &i, nil } func bar() { //use p fmt.Println(*p) } func main() { p, err := foo() if err != nil { fmt.Println(err) retu...阅读全文

博文 2015-06-02 04:00:05 sevenyuan

Go如何杀死goroutine?

在函数里开一个 goroutine 并不会因为函数的结束而退出,所以以下有一段代码是我在网站上找到的,我略作修改,以证明这种办法无法让goroutine退出,在函数终结退出后,依然有routine在奔跑, 请教大家如何杀死goroutine?不甚感激:::: for { go 拜谢() } http://bbs.mygolang.com/thread-18-1-1.html package main import ( "fmt" "runtime" "time" ) func job(ch int, timeout time.Duration) { t := time.NewTimer(time...阅读全文

为golang程序使用pprof远程查看httpserver运行堆栈,cpu耗时等信息

pprof是个神马玩意儿? pprof - manual page for pprof (part of gperftools) 是gperftools工具的一部分 gperftools又是啥? These tools are for use by developers so that they can create more robust applications. Especially of use to those developing multi-threaded applications in C++ with templates. Includes TCMalloc, heap-checker, heap-profiler and cpu-profiler. 一个性能分析的工具,...阅读全文

博文 2015-03-21 19:00:01 zhangqingping

Go 1.6 GC improvements 转自google doc

Go 1.6 GC improvements Austin Clements and Rick Hudson 2015-08-13 Go 1.5 is the first release with our new, low-pause concurrent garbage collector (GC). This is a significant stride over past releases and should open up Go to applications where it was previously unsuitable, but there is still plenty of work to do. For 1.6, our primary goal with the...阅读全文

博文 2015-08-14 11:00:07 myml

goroutine与调度器

我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。 这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有4个重要结构,分别是M、G、P、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。 Sched结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。 M代表内核级线程,一个M就是一个线程,gorouti...阅读全文

博文 2014-11-13 21:58:16 skoo

Go1.5 改进摘要

Go1.5 改进简介 纯Go(+少量汇编)实现 runtime 和 编译器 改进 垃圾回收器, 支持 并发 (有个指标好像是 停顿在 10 毫秒以内). GOMAXPROCS 默认值改为 CPU 核数 internal 限制规则推广到第三方包 (之前只有 std 包启用) 增加 vendor 支持, 基本解决 第三方库的依赖问题和版本问题 增加 trace 命令, 更友好的剖析程序运行状态 增加 go doc 命令 语法变化 增加 map 字面量. 以前的代码: m := map[Point]string{ Point{29.935523, 52.891566}: "Persepolis", Point{-25.352594, 131.034361}: "Uluru", Point{37.4...阅读全文

博文 2015-07-08 16:00:00 chai2010

Go 语言试用--mysql 操作

周海汉 /文 2013.8.30 安装测试 官网 http://golang.org/ 下载 https://code.google.com/p/go/downloads/list wget https://go.googlecode.com/files/go1.1.2.linux-amd64.tar.gz 解压后会生成go目录 [andy@s1 test]$ cat hello.go package mainimport “fmt” func main() { fmt.Println(“Hello, 世界”) } [andy@s1 test]$ go build hello.go hello.go:3:8: cannot find package “fmt” in any of: /usr...阅读全文

博文 2014-10-13 12:00:00 yand789

Go语言 GC优化经验分享

不想看长篇大论的,这里先给个结论,go的gc还不完善但也不算不靠谱,关键看怎么用,尽量不要创建大量对象,也尽量不要频繁创建对象,这个道理其实在所有带gc的编程语言也都通用。 想知道如何提前预防和解决问题的,请耐心看下去。 我们项目的服务端完全用Go语言开发的,游戏数据都放在内存中由go 管理。 在上线测试后我对程序做了很多调优工作,最初是稳定性优先,所以先解决的是内存泄漏问题,主要靠memprof来定位问题,接着是进一步提高性能,主要靠cpuprof和自己做的一些统计信息来定位问题。 调优性能的过程中我从cpuprof的结果发现发现gc的scanblock调用占用的cpu竟然有40%多,于是我开始搞各种对象重用和尽量避免不必要的对象创建,效果显著,CPU占用降到了10%多。 但我还是挺不甘心...阅读全文

博文 2014-10-11 18:00:01 abv123456789

Go语言内幕(6):启动和内存分配初始化

本文由 伯乐在线 - yhx 翻译,黄利民 校稿。未经许可,禁止转载!英文出处:Siarhei Matsiukevich。欢迎加入翻译组。 《Go语言内幕(1):主要概念与项目结构》 《Go语言内幕(2):深入 Go 编译器》 《Go语言内幕(3):链接器、链接器、重定位》 《Go语言内幕(4):目标文件和函数元数据》 《Go语言内幕(5):运行时启动过程》 本文是 Golang 内部机制探索系列博客的后续。这个系列博客的目的是探索 Go 启动过程,这个过程也是理解 Go 运行时(runtime)的关键之处。本文中我们将一起去看看启动过程的第二个部分,分析参数是怎么被初始化的及其中有哪些函数调用等等。 启动顺序 我们从上次结束的地方继续。在 runtime.r0_to 函数中,我们还有一部分...阅读全文

博文 2016-06-01 14:49:26 伯乐在线

go里面select-case和time.Ticker的使用注意事项

上周末参加Go技术聚会,京东的美女工程师讲到一个select-case和time.Ticker的使用注意事项(真实的应用场景是:在测试收包的顺序的时候,加了个tick就发现丢包了),觉得很有意思,记录一下。 package main import ( "fmt" "runtime" "time" ) func init() { runtime.GOMAXPROCS(runtime.NumCPU()) } func main() { ch := make(chan int, 1024) go func(ch chan int) { for { val := <-ch fmt.Printf("val:%d\n", val) } }(ch) tick := time.NewTicker(1 * t...阅读全文

golang pprof记录

runtime/pprof 我们要加入对pprof包里的方法调用,程序才能将运行时候程序的堆内存分配状态记录到文件(也可以是写到其他地方,例如网络等)中,以便进一步的分析. 如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。(Go语言的pprof是Google C++ profiler的移植.) 比如下面的例子: import ( "flag" "fmt" "os" "runtime/pprof" ) var cpuprofile = flag.String("cpuprofile",...阅读全文

博文 2015-03-06 03:00:16 benlightning

用Go语言进行ajax回传

一、后端部分 要想使用ajax,先要准备一个func (http.ResponseWriter, *http.Request)类型的函数来处理前端发过来的请求。 func OnAjax(res http.ResponseWriter, req *http.Request) { io.WriteString(res, "这是从后台发送的数据") } 接下来,要把一个网址和它对应起来,例如主页下的“/ajax”: http.HandleFunc("/ajax", OnAjax) 二、HTML部分 网页上的内容很简单,只有一个按钮和一个文字输入框。 阅读全文

博文 2015-03-24 15:00:01 独立风华

[翻译]理解 Go 语言的内存使用

许多人在刚开始接触 Go 语言时,经常会有的疑惑就是“为什么一个 Hello world 会占用如此之多的内存?”。Understanding Go Lang Memory Usage 很好的解释了这个问题。不过“简介”就是“简介”,更加深入的内容恐怕要读者自己去探索了。另外,文章写到最后,作者飘了,估计引起了一些公愤,于是又自己给自己补刀,左一刀,右一刀…… ————翻译分隔线———— 理解 Go 语言的内存使用 2014年12月22日,星期一 温馨提示:这仅是关于 Go 语言内存的简介,俗话说不入虎穴、焉得虎子,读者可以进行更加深入的探索。 大多数 Go 开发者都会尝试像这样简单的 hello world 程序: package main import ( "fmt" "time" ) ...阅读全文

博文 2014-12-24 18:00:03 mikespook

Golang汇编快速指南

本文翻译自Golang官方文档,原文地址: https://golang.org/doc/asm 这篇文档是对于Go编译器套件(6g, 8g, etc.)中不常用的汇编语言的快速预览,涵盖面不是很广泛。 Go的汇编语言基于Plan 9的汇编,Plan 9网站的页面上有详细描述。如果你想编写汇编语言,你应该读这篇文档,虽然它是Plan 9相关的。这边文档总结了汇编的语法,并且描述了使用汇编语言和Go程序交互时的特殊之处。 有一点是很重要的是,Go的汇编中没有直接体现出底层的机器。有些汇编细节能直接对应到机器,但有些不是。这是因为编译器套件在常规过程中不需要汇编语言。取而代之的是,编译器产生二进制的不完整的汇编指令集,链接器会完成它。实际上,链接器做了汇编指令的选择,所以当你看到类似于MOV这样...阅读全文

博文 2015-04-24 17:37:04 华子

Go 1.5中值得关注的几个变化

Go 1.5中值得关注的几个变化 七 10 bigwhite技术志 bootstrap, GC, Go, Go1.5, Golang, GOPATH, Gopher, GopherCon, GopherCon2015, GOROOT, goroutine, internal, runtime, RussCox, vendor, 垃圾收集器, 汇编, 编译, 编译器, 跨平台编译, 运行时, 链接器 1 Comment 在GopherCon2015开幕之 际,Google Go Team终于放出了Go 1.5Beta1版本的安装包。在go 1.5Beta1的发布说明中,Go Team也诚恳地承认Go 1.5将打破之前6个月一个版本的发布周期,这是因为Go 1.5变动太大,需要更多时间来准备这次...阅读全文

博文 2015-07-14 11:17:30 bigwhite

【转】Go内部实现之timer

原文地址: [timer in Go's runtime](http://www.bigendian123.com/go/2013/09/12/go-runtime-timer/) 我们总是使用sleep()类函数来让线程暂停一段时间,在Go语言里,也是使用Sleep()来暂停goroutine。 那么Go语言的sleep究竟是如何现实的呢?当然你翻看标准库中的time包里面的sleep.go源码时, 你可能会觉得看不明白,因为支持sleep功能的真正实现是在runtime里面。不难想到sleep功能是根据定时器来实现的, 因此接下来看看runtime中的timer究竟长什么样子。 timer的实现主要位于runtime/time.goc文件中。 主要数据结构 ...阅读全文

在Golang中,Log打印行号等信息

做个小笔记, 默认情况下,log模块的只打印日期和时间, 没具体行号,比较不爽,嘿嘿 package main /* #include */ import "C" import "log" func main() { log.SetFlags(log.Lshortfile | log.LstdFlags) log.Println( C.random()) } 打印结果: 2012/07/24 19:27:55 X.cgo1.go:14: 1804289383 其中, log.Lshortfile 还可以设置为log.Llongfile 即完整文件路径 获取当前行数,文件名,函数名(方法名): package main import ( "runtime" "fmt" )...阅读全文

博文 2014-11-07 17:31:35 Wendal Chen

深入讨论channel timeout

Go 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select,如下: select { case <-c: case <-time.After(time.Second): } 这两天在写码的过程中突然对这样实现 channel 超时产生了怀疑,这种方式真的好吗?于是我写了这样一个测试程序: package main import ( "os" "time" ) func main() { c := make(chan int, 100) go func() { for i := 0; i < 10; i++ { c <- 1 time.Sleep(time.Second) } os.Exit(0) }() for { selec...阅读全文

博文 2014-11-16 09:31:31 skoo

Golang网络库中socket阻塞调度源码剖析

本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理。代码中大部分是Go代码,小部分是汇编代码。完整理解本文需要Go语言知识,并且用Golang写过网络程序。更重要的是,需要提前理解goroutine的调度原理。 1. TCP的连接对象: 连接对象: 在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) (n int, err error) Close() error LocalAddr() Addr RemoteAddr() Addr SetReadDeadline(t time.Time) err...阅读全文

博文 2015-10-15 09:48:14 华子

Go 1.6中值得关注的几个变化

北京时间2016年2月18日凌晨,在Go 1.5发布 半年后,Go 1.6正式Release 了。与Go 1.5的“惊天巨变”(主要指Go自举)相比,Go 1.6的Change 算是很小的了,当然这也与Go 1.6的dev cycle过于短暂有关。但Go社区对此次发布却甚是重视,其热烈程度甚至超出了Go 1.5。在Dave Cheney的倡导 下,Gophers们在全球各地举行了Go 1.6 Release Party。 Go Core Team也在Reddit上开了一个AMA – Ask Me Anything,RobPike、Russ Cox(Rsc)、Bradfitz等Go大神齐上阵,对广大Gophers们在24hour内的问题有问必答。 言归正传,我们来看看Go 1.6中哪些变化值得...阅读全文

博文 2016-02-21 16:14:03 bigwhite

golang系统性能监控初探

系统服务(这里不局限于golang写的后台服务,也包括c++,java等后台语言)需要考虑的两个问题 1. 系统的资源使用情况(cpu利用率,内存分配情况等,runtime和syscall都提供了支持,这个是系统内部性质,往往是设计系统资源问题,需要在设计的时候慎重考虑) 2. 系统的服务情况(就是服务时延,这个是client可以直接感知的,往往是client最关注的,决定了服务的qps) 提前评估系统的资源消耗是很重要的,在公司里面,能提供选择的机器类型是很多种的。比如腾讯,往往动则上亿qq号的量,很多时候需要在内存中cache用户的实时信息,如果内存评估不对,后面如果要进行机器迁移,则比较麻烦。另外,cpu的数目太少,则并发性弱,影响服务的性能,特别是在一台机器上部署了多个服务后,抢cp...阅读全文

博文 2014-10-04 19:26:14 weijiaen

golang 垃圾回收 gc

http://ruizeng.net/golang-gc-internals/ 摘要 在实际使用go语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究。本文对研究的结果进行一下总结。 什么是垃圾回收? 曾几何时,内存管理是程序员开发应用的一大难题。传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发者的噩梦。如何解决这个头疼的问题呢?过去一般采用两种办法: 内存泄露检测工具。这种工具的原理一般是静态代码扫描,通过扫描程序检测可能出现内存泄露的代码段。然而检测工具难免有疏漏和不足,只能起到辅助作用。 智能指针。这是c++中引...阅读全文

博文 2016-06-23 02:00:00 diegodu

Go语言的堆栈分析

本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快速找到问题,有时候你想尽可能多的记录异常但仍觉得不够,搞清楚堆栈的意义有助于定位Bug或者记录更完整的信息。 本文将讨论堆栈跟踪信息以及如何在堆栈中识别函数所传递的参数。Functions 先从这段代码开始: Listing 1 01 package main 02 03 func main() { 04 slice := make([]string, 2, 4) 05 Example(slice, "hello", 10) 06 } 07 08 func Example(slice []str...阅读全文

博文 2015-02-15 03:00:01 zeeman

Go 1.5中值得关注的几个变化

在GopherCon2015开幕之 际,Google Go Team终于放出了Go 1.5Beta1版本的安装包。在go 1.5Beta1的发布说明中,Go Team也诚恳地承认Go 1.5将打破之前6个月一个版本的发布周期,这是因为Go 1.5变动太大,需要更多时间来准备这次发布(fix bug, Write doc)。关于Go 1.5的变化,之前Go Team staff在各种golang技术会议的slide 中暴露不少,包括: - 编译器和运行时由C改为Go(及少量汇编语言)重写,实现了Go的self Bootstrap(自举) - Garbage Collector优化,大幅降低GC延迟(Stop The World),实现Gc在单独的goroutine中与其他user gorout...阅读全文

博文 2015-08-22 12:00:00 wkyb608

go run的一个小细节

Golang的一个优势就是编译快,可以当脚本语言使用,利用go run直接执行.go文件,就像执行脚本一样。 我很喜欢这点,一般都懒得build。但在尝试beego(https://github.com/astaxie/beego)框架时,刚照着写了个hello world,总是不对,提示找不到模版。 开始了漫长的调试,查看源代码、修改配置、、、各种不行。 2013/05/01 10:03:11 [C] [Handler crashed with error can't find templatefile in the path:index.tpl] 2013/05/01 10:03:11 [C] [/build/buildd/golang-1/src/pkg/runtime/proc.c ...阅读全文

博文 2014-10-10 10:00:00 wyd_npu

Golang中Timer的陷阱

Golang的Timer类,是一个普遍意义上的定时器,它有着普通定时器的一些特性,例如: 给定一个到期时间,和一个回调函数,到期后会调用回调函数 重置定时器的超时时间 停止定时器 Golang的Timer在源码中,实现的方式是以一个小顶堆来维护所有的Timer集合。接着启动一个独立的goroutine,循环从小顶堆中的检测最近一个到期的Timer的到期时间,接着它睡眠到最近一个定时器到期的时间。最后会执行开始时设定的回调函数。Timer到期之后,会被Golang的runtime从小项堆中删除,并等待GC回收资源。 下面给出实际的代码: package main import ( "time" "fmt" ) func main() { timer := time.NewTimer(3 * t...阅读全文

博文 2015-04-24 12:15:20 华子