有问必答

有问必答

为什么Go里面大多数的接口返回的是int类型

有问必答ducklife 回复了问题 • 5 人关注 • 4 个回复 • 5535 次浏览 • 2019-08-19 13:00 • 来自相关话题

golang有没有好的开源游戏框架

技术讨论ducklife 回复了问题 • 34 人关注 • 14 个回复 • 29905 次浏览 • 2019-08-19 12:59 • 来自相关话题

求一些golang的教程,书籍也可以

有问必答lesliehuang 回复了问题 • 73 人关注 • 40 个回复 • 14816 次浏览 • 2019-08-13 19:06 • 来自相关话题

beego中struct中有field是slice类型怎么存储?

有问必答jeffSheng 回复了问题 • 3 人关注 • 3 个回复 • 4644 次浏览 • 2019-04-21 23:05 • 来自相关话题

为什么http.ResponseWriter是interface,但是http.Request是struct啊

有问必答chenqinghe 回复了问题 • 5 人关注 • 2 个回复 • 735 次浏览 • 2019-02-13 19:00 • 来自相关话题

访问依赖服务超时了,return error和panic哪个比较合适?

有问必答liqiang 回复了问题 • 3 人关注 • 2 个回复 • 915 次浏览 • 2019-01-25 15:35 • 来自相关话题

kafka2 go 的客户端用哪个好?

有问必答ddxx11223 回复了问题 • 3 人关注 • 3 个回复 • 843 次浏览 • 2019-01-20 10:16 • 来自相关话题

一些关于nats的问题求解惑

有问必答kevin 回复了问题 • 3 人关注 • 3 个回复 • 1851 次浏览 • 2018-12-24 12:08 • 来自相关话题

GoCN社区打算采用beego2+Vue重构,召集开发者(已满)

有问必答aidongsheng 回复了问题 • 80 人关注 • 57 个回复 • 30177 次浏览 • 2018-12-05 01:12 • 来自相关话题

go tool vet 检查的时候怎么跳过vendor目录

有问必答xfstart07 回复了问题 • 5 人关注 • 4 个回复 • 1805 次浏览 • 2018-07-31 15:55 • 来自相关话题

如何使用二进制形式发布go package

回复

有问必答astaxie 回复了问题 • 3 人关注 • 1 个回复 • 1404 次浏览 • 2018-07-31 12:12 • 来自相关话题

如何理解gometalinters的这个warning信息

有问必答leaxoy 回复了问题 • 2 人关注 • 1 个回复 • 595 次浏览 • 2018-06-17 23:23 • 来自相关话题

golang vendor路径问题

有问必答aeoluswing 回复了问题 • 2 人关注 • 4 个回复 • 15793 次浏览 • 2018-05-17 13:11 • 来自相关话题

golang 怎么在 release 版本避免编译一些代码?

有问必答lichao2018 回复了问题 • 3 人关注 • 3 个回复 • 4247 次浏览 • 2018-04-13 22:59 • 来自相关话题

go如何直接调取java的webservice么

有问必答trume 回复了问题 • 4 人关注 • 3 个回复 • 2858 次浏览 • 2018-03-26 20:48 • 来自相关话题

条新动态, 点击查看
astaxie

astaxie 回答了问题 • 2016-10-09 20:22 • 1 个回复 不感兴趣

golang的goroutine是如何实现的?

赞同来自:

[url=http://morsmachine.dk/go-scheduler]Go Schedule[/url] 纯翻译如下:   Go runtime的调度器: 在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内... 显示全部 »
[url=http://morsmachine.dk/go-scheduler]Go Schedule[/url] 纯翻译如下:   Go runtime的调度器: 在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内核不是已经有一个线程scheduler了嘛? 熟悉POSIX API的人都知道,POSIX的方案在很大程度上是对Unix process进场模型的一个逻辑描述和扩展,两者有很多相似的地方。 Thread有自己的信号掩码,CPU affinity等。但是很多特征对于Go程序来说都是累赘。 尤其是context上下文切换的耗时。另一个原因是Go的垃圾回收需要所有的goroutine停止,使得内存在一个一致的状态。垃圾回收的时间点是不确定的,如果依靠OS自身的scheduler来调度,那么会有大量的线程需要停止工作。 单独的开发一个GO得调度器,可以是其知道在什么时候内存状态是一致的,也就是说,当开始垃圾回收时,运行时只需要为当时正在CPU核上运行的那个线程等待即可,而不是等待所有的线程。 用户空间线程和内核空间线程之间的映射关系有:N:1,1:1和M:N N:1是说,多个(N)用户线程始终在一个内核线程上跑,context上下文切换确实很快,但是无法真正的利用多核。 1:1是说,一个用户线程就只在一个内核线程上跑,这时可以利用多核,但是上下文switch很慢。 M:N是说, 多个goroutine在多个内核线程上跑,这个看似可以集齐上面两者的优势,但是无疑增加了调度的难度。 [attach]1[/attach] Go的调度器内部有三个重要的结构:M,P,S M:代表真正的内核OS线程,和POSIX里的thread差不多,真正干活的人 G:代表一个goroutine,它有自己的栈,instruction pointer和其他信息(正在等待的channel等等),用于调度。 P:代表调度的上下文,可以把它看做一个局部的调度器,使go代码在一个线程上跑,它是实现从N:1到N:M映射的关键。 [attach]2[/attach] 图中看,有2个物理线程M,每一个M都拥有一个context(P),每一个也都有一个正在运行的goroutine。 P的数量可以通过GOMAXPROCS()来设置,它其实也就代表了真正的并发度,即有多少个goroutine可以同时运行。 图中灰色的那些goroutine并没有运行,而是出于ready的就绪态,正在等待被调度。P维护着这个队列(称之为runqueue), Go语言里,启动一个goroutine很容易:go function 就行,所以每有一个go语句被执行,runqueue队列就在其末尾加入一个 goroutine,在下一个调度点,就从runqueue中取出(如何决定取哪个goroutine?)一个goroutine执行。 为何要维护多个上下文P?因为当一个OS线程被阻塞时,P可以转而投奔另一个OS线程! 图中看到,当一个OS线程M0陷入阻塞时,P转而在OS线程M1上运行。调度器保证有足够的线程来运行所以的context P。 [attach]4[/attach] 图中的M1可能是被创建,或者从线程缓存中取出。 当MO返回时,它必须尝试取得一个context P来运行goroutine,一般情况下,它会从其他的OS线程那里steal偷一个context过来, 如果没有偷到的话,它就把goroutine放在一个global runqueue里,然后自己就去睡大觉了(放入线程缓存里)。Contexts们也会周期性的检查global runqueue,否则global runqueue上的goroutine永远无法执行。 [attach]3[/attach] 另一种情况是P所分配的任务G很快就执行完了(分配不均),这就导致了一个上下文P闲着没事儿干而系统却任然忙碌。但是如果global runqueue没有任务G了,那么P就不得不从其他的上下文P那里拿一些G来执行。一般来说,如果上下文P从其他的上下文P那里要偷一个任务的话,一般就‘偷’run queue的一半,这就确保了每个OS线程都能充分的使用。  
bigwhite

bigwhite 回答了问题 • 2016-10-11 13:03 • 8 个回复 不感兴趣

怎么学习golang?

赞同来自:

记得早期接触go时,看的是Golang之父之一的Rob Pike的Go course 3部曲(3个ppt),如果你没有,可以到[这里](https://pan.baidu.com/s/1miFEDJy)下载(注意:由于rob pike的这个ppt在go 1之前... 显示全部 »
记得早期接触go时,看的是Golang之父之一的Rob Pike的Go course 3部曲(3个ppt),如果你没有,可以到[这里](https://pan.baidu.com/s/1miFEDJy)下载(注意:由于rob pike的这个ppt在go 1之前发布的,ppt上的有些语法与go 1有少许差别,注意识别)。 要想深入了解Go,写出idiomatic的golang代码,官方doc:effective go, go faq,以及go language specification也是不可或缺的。 之后再系统的学习后的资料,建议看k&a写的go圣经-the go programming language、 《Go in action》 以及国内雨痕大师的《go语言学习笔记》(尤其是代码分析的部分),学习笔记一书适合稍微有些go经验,且抱着极大热情挖掘go runtime背后的原理的人去学习。 剩下的就是不断的去用go coding, coding, coding了,无捷径。
astaxie

astaxie 回答了问题 • 2016-10-11 21:41 • 9 个回复 不感兴趣

golang 的channel是否适合做消息队列?

赞同来自:

我猜你看到的文章的担心是万一程序挂了怎么办,在缓冲channel里面的数据就可能丢失了,如果这个是可以忍受的话其实是非常适合做消息队列的
我猜你看到的文章的担心是万一程序挂了怎么办,在缓冲channel里面的数据就可能丢失了,如果这个是可以忍受的话其实是非常适合做消息队列的
astaxie

astaxie 回答了问题 • 2016-10-11 22:12 • 4 个回复 不感兴趣

为什么Go里面大多数的接口返回的是int类型

赞同来自:

len出来的值是检查用于计算的,如果是uint的话,那么加减一下负数就不行了 详见:https://groups.google.com/forum/#!topic/golang-nuts/jJWAAMdquwQ
len出来的值是检查用于计算的,如果是uint的话,那么加减一下负数就不行了 详见:https://groups.google.com/forum/#!topic/golang-nuts/jJWAAMdquwQ
name5566

name5566 回答了问题 • 2016-10-12 11:36 • 14 个回复 不感兴趣

golang有没有好的开源游戏框架

赞同来自:

> 使用 Leaf 已知的上线项目: > * 2014 年,某手游(棋牌)项目上线 > * 2016 年,某 H5 手游项目上线 > * 2016 年,某卡牌手游项目上线 > 正在研发项目 N 个,已知情况 N >= 4 来自:https://github.... 显示全部 »
> 使用 Leaf 已知的上线项目: > * 2014 年,某手游(棋牌)项目上线 > * 2016 年,某 H5 手游项目上线 > * 2016 年,某卡牌手游项目上线 > 正在研发项目 N 个,已知情况 N >= 4 来自:https://github.com/name5566/leaf/wiki
leoliu

leoliu 回答了问题 • 2016-10-12 13:44 • 40 个回复 不感兴趣

求一些golang的教程,书籍也可以

赞同来自:

《The Golang Programming Language》 《Golang 学习笔记》
《The Golang Programming Language》 《Golang 学习笔记》
sryan

sryan 回答了问题 • 2016-10-13 11:44 • 9 个回复 不感兴趣

golang 如何动态创建struct

赞同来自:

静态语言貌似不能直接实现 可以自己实现个map[string]func(string)interface{} 将要动态生成的结构体的函数注册上去 通过string来调用相应的函数来获取对应的结构体
静态语言貌似不能直接实现 可以自己实现个map[string]func(string)interface{} 将要动态生成的结构体的函数注册上去 通过string来调用相应的函数来获取对应的结构体
astaxie

astaxie 回答了问题 • 2016-10-13 22:04 • 14 个回复 不感兴趣

想用golang写个分布式的监控,大神给点建议

赞同来自:

这个问题很有意思,很多场景设计都会来考虑拉和推两种方案,我分别对拉和推两种的优缺点对比以下,你自己权衡一下,欢迎大家继续补充 ## 拉的方案(不写agent) 优点: - 不需要agent,不需要再部署新的程序 缺点: - 网络中断的情况下,就无法监控机器... 显示全部 »
这个问题很有意思,很多场景设计都会来考虑拉和推两种方案,我分别对拉和推两种的优缺点对比以下,你自己权衡一下,欢迎大家继续补充 ## 拉的方案(不写agent) 优点: - 不需要agent,不需要再部署新的程序 缺点: - 网络中断的情况下,就无法监控机器的信息 ## 推的方案(agent) 优点: - 本地运行,在和中控机失去网络连接的时候还是可以继续保存监控数据 缺点: - 需要部署agent,如果机器多得话将来升级也是比较麻烦 拉取和推送其实大家可以考虑,微博的follow逻辑,直播流里面也有同样的问题,很多场景都会遇到 至于说第二种方案走什么协议,这种程序我建议走tcp协议,HTTP的话相对重了一点。
jinzhu

jinzhu 回答了问题 • 2016-10-19 15:38 • 14 个回复 不感兴趣

2016 年 10 月,当前好用的 ORM 是哪个?

赞同来自:

作为作者,推荐 GORM ;)
作为作者,推荐 GORM ;)
sheepbao

sheepbao 回答了问题 • 2016-10-30 20:16 • 18 个回复 不感兴趣

字符串连接哪一种方式最高效

赞同来自:

```go package main import ( "bytes" "fmt" "strings" "time" ) var way map[int]string func benchmarkStringFunction(n int, ind... 显示全部 »
```go package main import ( "bytes" "fmt" "strings" "time" ) var way map[int]string func benchmarkStringFunction(n int, index int) (d time.Duration) { v := "ni shuo wo shi bu shi tai wu liao le a?" var s string var buf bytes.Buffer t0 := time.Now() for i := 0; i < n; i++ { switch index { case 0: // fmt.Sprintf s = fmt.Sprintf("%s[%s]", s, v) case 1: // string + s = s + "[" + v + "]" case 2: // strings.Join s = strings.Join([]string{s, "[", v, "]"}, "") case 3: // stable bytes.Buffer buf.WriteString("[") buf.WriteString(v) buf.WriteString("]") } } d = time.Since(t0) if index == 3 { s = buf.String() } fmt.Printf("string len: %d\t", len(s)) fmt.Printf("time of [%s]=\t %v\n", way[index], d) return d } func main() { way = make(map[int]string, 5) way[0] = "fmt.Sprintf" way[1] = "+" way[2] = "strings.Join" way[3] = "bytes.Buffer" k := 4 d := [5]time.Duration{} for i := 0; i < k; i++ { d[i] = benchmarkStringFunction(10000, i) } } ``` 结果: ``` string len: 410000 time of [fmt.Sprintf]= 426.001476ms string len: 410000 time of [+]= 307.044147ms string len: 410000 time of [strings.Join]= 738.44362ms string len: 410000 time of [bytes.Buffer]= 742.248µs ``` * strings.Join 最慢 * fmt.Sprintf 和 string + 差不多 * bytes.Buffer又比上者快约500倍
astaxie

astaxie 回答了问题 • 2016-11-13 13:29 • 4 个回复 不感兴趣

golang vendor路径问题

赞同来自:

刚和 @viktor1992 看了一下源码,看到这个vendor的函数 ``` // vendoredImportPath returns the expansion of path when it appears in parent. // If pare... 显示全部 »
刚和 @viktor1992 看了一下源码,看到这个vendor的函数 ``` // vendoredImportPath returns the expansion of path when it appears in parent. // If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path, // x/vendor/path, vendor/path, or else stay path if none of those exist. // vendoredImportPath returns the expanded path or, if no expansion is found, the original. func vendoredImportPath(parent *Package, path string) (found string) { if parent == nil || parent.Root == "" { return path } ``` 这个里面有一个概念parent,我们可以看到Go官方关于vendor的文档设计的时候都有这个,也就是说你的源码要有一个包存起来,我们看一下这个实验里面的代码。 首先`a.go`放在了gopath低目录,也就是他的parent是nil,所以这个返回了`wer`,而这个包又不在gopath下面,所以第一个报错了。 第二个你创建了test目录,那么他的parent就是test,那么就会去找test/vendor/path和vendor/path下面找,所以vendor不管你放在test下面还是gopath下面都是可以找到的。
philc

philc 回答了问题 • 2016-12-26 17:20 • 4 个回复 不感兴趣

json解析bool

赞同来自:

把B声明为指针 ```go type A struct { B *bool `json:"b"` } func main() { var a A str := `{"b":false}` json.Unmarshal([]byte(str), &a... 显示全部 »
把B声明为指针 ```go type A struct { B *bool `json:"b"` } func main() { var a A str := `{"b":false}` json.Unmarshal([]byte(str), &a) if a.B != nil { log.Println(*a.B) } } ```
println 是把结果输出到 standard error fmt.Println 是把结果输出到 standard output
println 是把结果输出到 standard error fmt.Println 是把结果输出到 standard output
收到非常多大家的邮件,我会慢慢刷选一下,建一个微信开发群,我们一起建立roadmap,每个人都会拿到自己的任务,希望搞得有点意思
收到非常多大家的邮件,我会慢慢刷选一下,建一个微信开发群,我们一起建立roadmap,每个人都会拿到自己的任务,希望搞得有点意思
smallfish1

smallfish1 回答了问题 • 2018-03-18 20:42 • 8 个回复 不感兴趣

有哪些值得学习的 Go 语言开源项目?

赞同来自:

推荐 [prometheus](https://github.com/prometheus/prometheus) 。 Prometheus 是一个开源的基于Metrics 的一站式监控告警系统,在过去一年对其几个核心模块源码的阅读使我收获颇多,然后基于此写... 显示全部 »
推荐 [prometheus](https://github.com/prometheus/prometheus) 。 Prometheus 是一个开源的基于Metrics 的一站式监控告警系统,在过去一年对其几个核心模块源码的阅读使我收获颇多,然后基于此写了一本电子书《[Prometheus 实战](https://www.gitbook.com/book/songjiayang/prometheus/details)》,希望对大家有所帮助。

大家是如何处理 golang web 应用静态资源的?

技术讨论astaxie 回复了问题 • 5 人关注 • 1 个回复 • 4798 次浏览 • 2016-10-14 13:08 • 来自相关话题

求一些golang的教程,书籍也可以

有问必答lesliehuang 回复了问题 • 73 人关注 • 40 个回复 • 14816 次浏览 • 2019-08-13 19:06 • 来自相关话题

golang有没有好的开源游戏框架

技术讨论ducklife 回复了问题 • 34 人关注 • 14 个回复 • 29905 次浏览 • 2019-08-19 12:59 • 来自相关话题

为什么Go里面大多数的接口返回的是int类型

有问必答ducklife 回复了问题 • 5 人关注 • 4 个回复 • 5535 次浏览 • 2019-08-19 13:00 • 来自相关话题

为什么Go里面大多数的接口返回的是int类型

回复

有问必答ducklife 回复了问题 • 5 人关注 • 4 个回复 • 5535 次浏览 • 2019-08-19 13:00 • 来自相关话题

golang有没有好的开源游戏框架

回复

技术讨论ducklife 回复了问题 • 34 人关注 • 14 个回复 • 29905 次浏览 • 2019-08-19 12:59 • 来自相关话题

求一些golang的教程,书籍也可以

回复

有问必答lesliehuang 回复了问题 • 73 人关注 • 40 个回复 • 14816 次浏览 • 2019-08-13 19:06 • 来自相关话题

beego中struct中有field是slice类型怎么存储?

回复

有问必答jeffSheng 回复了问题 • 3 人关注 • 3 个回复 • 4644 次浏览 • 2019-04-21 23:05 • 来自相关话题

为什么http.ResponseWriter是interface,但是http.Request是struct啊

回复

有问必答chenqinghe 回复了问题 • 5 人关注 • 2 个回复 • 735 次浏览 • 2019-02-13 19:00 • 来自相关话题

访问依赖服务超时了,return error和panic哪个比较合适?

回复

有问必答liqiang 回复了问题 • 3 人关注 • 2 个回复 • 915 次浏览 • 2019-01-25 15:35 • 来自相关话题

kafka2 go 的客户端用哪个好?

回复

有问必答ddxx11223 回复了问题 • 3 人关注 • 3 个回复 • 843 次浏览 • 2019-01-20 10:16 • 来自相关话题

一些关于nats的问题求解惑

回复

有问必答kevin 回复了问题 • 3 人关注 • 3 个回复 • 1851 次浏览 • 2018-12-24 12:08 • 来自相关话题

GoCN社区打算采用beego2+Vue重构,召集开发者(已满)

回复

有问必答aidongsheng 回复了问题 • 80 人关注 • 57 个回复 • 30177 次浏览 • 2018-12-05 01:12 • 来自相关话题

go tool vet 检查的时候怎么跳过vendor目录

回复

有问必答xfstart07 回复了问题 • 5 人关注 • 4 个回复 • 1805 次浏览 • 2018-07-31 15:55 • 来自相关话题

如何使用二进制形式发布go package

回复

有问必答astaxie 回复了问题 • 3 人关注 • 1 个回复 • 1404 次浏览 • 2018-07-31 12:12 • 来自相关话题

如何理解gometalinters的这个warning信息

回复

有问必答leaxoy 回复了问题 • 2 人关注 • 1 个回复 • 595 次浏览 • 2018-06-17 23:23 • 来自相关话题

golang vendor路径问题

回复

有问必答aeoluswing 回复了问题 • 2 人关注 • 4 个回复 • 15793 次浏览 • 2018-05-17 13:11 • 来自相关话题

golang 怎么在 release 版本避免编译一些代码?

回复

有问必答lichao2018 回复了问题 • 3 人关注 • 3 个回复 • 4247 次浏览 • 2018-04-13 22:59 • 来自相关话题

go如何直接调取java的webservice么

回复

有问必答trume 回复了问题 • 4 人关注 • 3 个回复 • 2858 次浏览 • 2018-03-26 20:48 • 来自相关话题

golang支持ftp、sftp客户端的库哪个比较好一些?

有问必答niugou 发表了文章 • 2 个评论 • 4390 次浏览 • 2016-10-19 11:20 • 来自相关话题

github上搜索的一些结果,都没有试过。 https://github.com/jlaffaye/ftp https://github.com/smallfish/ftp https://github
github上搜索的一些结果,都没有试过。

https://github.com/jlaffaye/ftp
https://github.com/smallfish/ftp
https://github.com/jramnani/go-ftp
大家遇到问题Go的问题了怎么办,来这里问吧