有问必答

有问必答

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

有问必答my3157 回复了问题 • 19 人关注 • 14 个回复 • 3880 次浏览 • 17 小时前 • 来自相关话题

golang变量作用域

有问必答sunnynewlife 回复了问题 • 6 人关注 • 3 个回复 • 1224 次浏览 • 2017-10-26 14:59 • 来自相关话题

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

有问必答huhuyou2 回复了问题 • 46 人关注 • 26 个回复 • 4676 次浏览 • 2017-10-26 09:19 • 来自相关话题

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

有问必答Zaaksam 回复了问题 • 67 人关注 • 49 个回复 • 7002 次浏览 • 2017-09-21 11:58 • 来自相关话题

使用什么docker image来运行Go程序

有问必答myonlyzzy 回复了问题 • 23 人关注 • 22 个回复 • 3807 次浏览 • 2017-09-01 10:15 • 来自相关话题

golang 如何动态创建struct

有问必答Lampo 回复了问题 • 19 人关注 • 9 个回复 • 4409 次浏览 • 2017-08-25 10:35 • 来自相关话题

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

技术讨论cye 回复了问题 • 23 人关注 • 12 个回复 • 8303 次浏览 • 2017-08-16 17:23 • 来自相关话题

Docker内部如何访问主机的服务

有问必答cloverstd 回复了问题 • 5 人关注 • 2 个回复 • 888 次浏览 • 2017-08-03 13:36 • 来自相关话题

golang 开发环境问题

有问必答abin 回复了问题 • 1 人关注 • 1 个回复 • 444 次浏览 • 2017-07-24 17:16 • 来自相关话题

关于beego orm 的查询

有问必答romny 回复了问题 • 4 人关注 • 3 个回复 • 1582 次浏览 • 2017-07-14 21:08 • 来自相关话题

release的时候如何把我们的版本号打包到应用中

有问必答kid_408 回复了问题 • 14 人关注 • 6 个回复 • 1348 次浏览 • 2017-07-11 14:44 • 来自相关话题

Go 扩展包 netutil.LimitListener 如何接入 beego?

回复

有问必答mnhkahn 发起了问题 • 1 人关注 • 0 个回复 • 568 次浏览 • 2017-06-30 17:10 • 来自相关话题

beego如何设置controller方法的超时

有问必答astaxie 回复了问题 • 2 人关注 • 1 个回复 • 827 次浏览 • 2017-05-28 10:44 • 来自相关话题

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

有问必答arstd 回复了问题 • 21 人关注 • 14 个回复 • 3256 次浏览 • 2017-05-27 17:15 • 来自相关话题

垃圾回收gctrace信息含义

回复

有问必答mnhkahn 发起了问题 • 2 人关注 • 0 个回复 • 596 次浏览 • 2017-05-05 10:13 • 来自相关话题

条新动态, 点击查看
astaxie

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

golang的goroutine是如何实现的?

赞同来自:

Go Schedule  纯翻译如下:
 

Go runtime的调度器:
在了解Go的运行时的scheduler之前,需要先了解为什么需要它,因为我们可能会想,OS内核不是已经有一个线程scheduler了嘛?
熟悉POSIX API的人都知道,POSI... 显示全部 »
Go Schedule  纯翻译如下:
 

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在多个内核线程上跑,这个看似可以集齐上面两者的优势,但是无疑增加了调度的难度。


1


Go的调度器内部有三个重要的结构:M,P,S
M:代表真正的内核OS线程,和POSIX里的thread差不多,真正干活的人
G:代表一个goroutine,它有自己的栈,instruction pointer和其他信息(正在等待的channel等等),用于调度。
P:代表调度的上下文,可以把它看做一个局部的调度器,使go代码在一个线程上跑,它是实现从N:1到N:M映射的关键。


2


图中看,有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。

4

图中的M1可能是被创建,或者从线程缓存中取出。

当MO返回时,它必须尝试取得一个context P来运行goroutine,一般情况下,它会从其他的OS线程那里steal偷一个context过来,
如果没有偷到的话,它就把goroutine放在一个global runqueue里,然后自己就去睡大觉了(放入线程缓存里)。Contexts们也会周期性的检查global runqueue,否则global runqueue上的goroutine永远无法执行。

3

另一种情况是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里面的数据就可能丢失了,如果这个是可以忍受的话其实是非常适合做消息队列的
name5566

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

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

赞同来自:

> 使用 Leaf 已知的上线项目:
> * 2014 年,某手游(棋牌)项目上线
> * 2016 年,某 H5 手游项目上线
> * 2016 年,某卡牌手游项目上线
> 正在研发项目 N 个,已知情况 N >= 4

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

来自:https://github.com/name5566/leaf/wiki
leoliu

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

求一些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 • 15 个回复 不感兴趣

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

赞同来自:

```go
package main

import (
"bytes"
"fmt"
"strings"
"time"
)

var way map[int]string
... 显示全部 »
```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倍
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.Unmar... 显示全部 »
把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,每个人都会拿到自己的任务,希望搞得有点意思

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

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

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

有问必答huhuyou2 回复了问题 • 46 人关注 • 26 个回复 • 4676 次浏览 • 2017-10-26 09:19 • 来自相关话题

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

技术讨论cye 回复了问题 • 23 人关注 • 12 个回复 • 8303 次浏览 • 2017-08-16 17:23 • 来自相关话题

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

有问必答negronihe 回复了问题 • 4 人关注 • 3 个回复 • 2036 次浏览 • 2016-10-16 13:06 • 来自相关话题

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

回复

有问必答my3157 回复了问题 • 19 人关注 • 14 个回复 • 3880 次浏览 • 17 小时前 • 来自相关话题

golang变量作用域

回复

有问必答sunnynewlife 回复了问题 • 6 人关注 • 3 个回复 • 1224 次浏览 • 2017-10-26 14:59 • 来自相关话题

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

回复

有问必答huhuyou2 回复了问题 • 46 人关注 • 26 个回复 • 4676 次浏览 • 2017-10-26 09:19 • 来自相关话题

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

回复

有问必答Zaaksam 回复了问题 • 67 人关注 • 49 个回复 • 7002 次浏览 • 2017-09-21 11:58 • 来自相关话题

使用什么docker image来运行Go程序

回复

有问必答myonlyzzy 回复了问题 • 23 人关注 • 22 个回复 • 3807 次浏览 • 2017-09-01 10:15 • 来自相关话题

golang 如何动态创建struct

回复

有问必答Lampo 回复了问题 • 19 人关注 • 9 个回复 • 4409 次浏览 • 2017-08-25 10:35 • 来自相关话题

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

回复

技术讨论cye 回复了问题 • 23 人关注 • 12 个回复 • 8303 次浏览 • 2017-08-16 17:23 • 来自相关话题

Docker内部如何访问主机的服务

回复

有问必答cloverstd 回复了问题 • 5 人关注 • 2 个回复 • 888 次浏览 • 2017-08-03 13:36 • 来自相关话题

golang 开发环境问题

回复

有问必答abin 回复了问题 • 1 人关注 • 1 个回复 • 444 次浏览 • 2017-07-24 17:16 • 来自相关话题

关于beego orm 的查询

回复

有问必答romny 回复了问题 • 4 人关注 • 3 个回复 • 1582 次浏览 • 2017-07-14 21:08 • 来自相关话题

release的时候如何把我们的版本号打包到应用中

回复

有问必答kid_408 回复了问题 • 14 人关注 • 6 个回复 • 1348 次浏览 • 2017-07-11 14:44 • 来自相关话题

Go 扩展包 netutil.LimitListener 如何接入 beego?

回复

有问必答mnhkahn 发起了问题 • 1 人关注 • 0 个回复 • 568 次浏览 • 2017-06-30 17:10 • 来自相关话题

beego如何设置controller方法的超时

回复

有问必答astaxie 回复了问题 • 2 人关注 • 1 个回复 • 827 次浏览 • 2017-05-28 10:44 • 来自相关话题

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

回复

有问必答arstd 回复了问题 • 21 人关注 • 14 个回复 • 3256 次浏览 • 2017-05-27 17:15 • 来自相关话题

垃圾回收gctrace信息含义

回复

有问必答mnhkahn 发起了问题 • 2 人关注 • 0 个回复 • 596 次浏览 • 2017-05-05 10:13 • 来自相关话题

大家遇到问题Go的问题了怎么办,来这里问吧