有问必答

有问必答

垃圾回收gctrace信息含义

回复

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

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

技术讨论chrislee 回复了问题 • 19 人关注 • 11 个回复 • 3146 次浏览 • 2017-03-25 09:59 • 来自相关话题

Golang 的框架或者包有听说过有漏洞的么?

开源程序astaxie 回复了问题 • 2 人关注 • 1 个回复 • 602 次浏览 • 2017-03-07 13:00 • 来自相关话题

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

有问必答toyijiu 回复了问题 • 21 人关注 • 15 个回复 • 2451 次浏览 • 2017-03-02 21:43 • 来自相关话题

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

有问必答adolphlwq 回复了问题 • 16 人关注 • 16 个回复 • 1586 次浏览 • 2017-02-28 11:20 • 来自相关话题

println 与 fmt.Println 一起使用为何不是顺序打印?

Golangsongtianyi 回复了问题 • 4 人关注 • 4 个回复 • 555 次浏览 • 2017-02-20 11:23 • 来自相关话题

将配置文件打包进二进制文件中

有问必答xnotepad 回复了问题 • 2 人关注 • 1 个回复 • 389 次浏览 • 2017-02-16 10:59 • 来自相关话题

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

有问必答pathbox 回复了问题 • 15 人关注 • 9 个回复 • 2801 次浏览 • 2017-02-15 11:42 • 来自相关话题

go原生的RPC的文档资料,在哪里看啊

有问必答codinghxl 回复了问题 • 6 人关注 • 7 个回复 • 996 次浏览 • 2017-01-21 08:26 • 来自相关话题

JSON unmarshal float类型怎么保持JSON一样的数据

有问必答lrita 回复了问题 • 5 人关注 • 3 个回复 • 498 次浏览 • 2017-01-05 14:43 • 来自相关话题

beego有防止页面重复提交的功能吗

有问必答pathbox 回复了问题 • 4 人关注 • 5 个回复 • 727 次浏览 • 2017-01-04 22:01 • 来自相关话题

解析的JSON里面字段是动态的怎么处理?

有问必答lrita 回复了问题 • 7 人关注 • 3 个回复 • 825 次浏览 • 2017-01-04 15:28 • 来自相关话题

json解析bool

有问必答lotus 回复了问题 • 6 人关注 • 4 个回复 • 801 次浏览 • 2016-12-27 17:50 • 来自相关话题

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

有问必答三只熊 回复了问题 • 16 人关注 • 12 个回复 • 2224 次浏览 • 2016-12-10 21:55 • 来自相关话题

网站实现一个全局的方法,实现导航栏显示登陆注册按钮或者登录用户的信息

有问必答lotus 回复了问题 • 6 人关注 • 5 个回复 • 737 次浏览 • 2016-12-06 14:27 • 来自相关话题

条新动态, 点击查看
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 • 11 个回复 不感兴趣

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 • 22 个回复 不感兴趣

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

赞同来自:

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

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

golang 如何动态创建struct

赞同来自:

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

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

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

赞同来自:

这个问题很有意思,很多场景设计都会来考虑拉和推两种方案,我分别对拉和推两种的优缺点对比以下,你自己权衡一下,欢迎大家继续补充

## 拉的方案(不写agent)
优点:
- 不需要agent,不需要再部署新的程序

缺点:
- 网络中断的情况下,就无法监控机器... 显示全部 »
这个问题很有意思,很多场景设计都会来考虑拉和推两种方案,我分别对拉和推两种的优缺点对比以下,你自己权衡一下,欢迎大家继续补充

## 拉的方案(不写agent)
优点:
- 不需要agent,不需要再部署新的程序

缺点:
- 网络中断的情况下,就无法监控机器的信息

## 推的方案(agent)
优点:
- 本地运行,在和中控机失去网络连接的时候还是可以继续保存监控数据

缺点:
- 需要部署agent,如果机器多得话将来升级也是比较麻烦

拉取和推送其实大家可以考虑,微博的follow逻辑,直播流里面也有同样的问题,很多场景都会遇到

至于说第二种方案走什么协议,这种程序我建议走tcp协议,HTTP的话相对重了一点。
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

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

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

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

有问必答titian 回复了问题 • 34 人关注 • 22 个回复 • 2418 次浏览 • 2016-11-06 14:35 • 来自相关话题

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

技术讨论chrislee 回复了问题 • 19 人关注 • 11 个回复 • 3146 次浏览 • 2017-03-25 09:59 • 来自相关话题

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

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

垃圾回收gctrace信息含义

回复

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

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

回复

技术讨论chrislee 回复了问题 • 19 人关注 • 11 个回复 • 3146 次浏览 • 2017-03-25 09:59 • 来自相关话题

Golang 的框架或者包有听说过有漏洞的么?

回复

开源程序astaxie 回复了问题 • 2 人关注 • 1 个回复 • 602 次浏览 • 2017-03-07 13:00 • 来自相关话题

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

回复

有问必答toyijiu 回复了问题 • 21 人关注 • 15 个回复 • 2451 次浏览 • 2017-03-02 21:43 • 来自相关话题

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

回复

有问必答adolphlwq 回复了问题 • 16 人关注 • 16 个回复 • 1586 次浏览 • 2017-02-28 11:20 • 来自相关话题

println 与 fmt.Println 一起使用为何不是顺序打印?

回复

Golangsongtianyi 回复了问题 • 4 人关注 • 4 个回复 • 555 次浏览 • 2017-02-20 11:23 • 来自相关话题

将配置文件打包进二进制文件中

回复

有问必答xnotepad 回复了问题 • 2 人关注 • 1 个回复 • 389 次浏览 • 2017-02-16 10:59 • 来自相关话题

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

回复

有问必答pathbox 回复了问题 • 15 人关注 • 9 个回复 • 2801 次浏览 • 2017-02-15 11:42 • 来自相关话题

go原生的RPC的文档资料,在哪里看啊

回复

有问必答codinghxl 回复了问题 • 6 人关注 • 7 个回复 • 996 次浏览 • 2017-01-21 08:26 • 来自相关话题

JSON unmarshal float类型怎么保持JSON一样的数据

回复

有问必答lrita 回复了问题 • 5 人关注 • 3 个回复 • 498 次浏览 • 2017-01-05 14:43 • 来自相关话题

beego有防止页面重复提交的功能吗

回复

有问必答pathbox 回复了问题 • 4 人关注 • 5 个回复 • 727 次浏览 • 2017-01-04 22:01 • 来自相关话题

解析的JSON里面字段是动态的怎么处理?

回复

有问必答lrita 回复了问题 • 7 人关注 • 3 个回复 • 825 次浏览 • 2017-01-04 15:28 • 来自相关话题

json解析bool

回复

有问必答lotus 回复了问题 • 6 人关注 • 4 个回复 • 801 次浏览 • 2016-12-27 17:50 • 来自相关话题

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

回复

有问必答三只熊 回复了问题 • 16 人关注 • 12 个回复 • 2224 次浏览 • 2016-12-10 21:55 • 来自相关话题

网站实现一个全局的方法,实现导航栏显示登陆注册按钮或者登录用户的信息

回复

有问必答lotus 回复了问题 • 6 人关注 • 5 个回复 • 737 次浏览 • 2016-12-06 14:27 • 来自相关话题

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