golang json.Unmarshal里使用interface{}解析json字符串时int64位无法精确

先来看一段代码:

预期输出结果:

真实输出结果:

解决方法:

输出结果,符合预期

Golang 利用多核充分发挥服务器性能

默认情况下,语言是否使用多核心进行计算是由系统分根据计算的任务进行分配的,大多数情况下都不可能完全发挥出多核心CPU的优势。Golang从语言层面支持改变程序是否使用多核,进行更快速的计算。在我的计算机上,i7-4790四核心8线程的开启与不开启多核价计算的差距约为3倍。

Golang 1.4及以前默认的runtime.GOMAXPROCS设置为1,在1.5以后默认会修改为计算机真实的核心线程数,说明官方可以在1.5版本以后肯定了多核心计算的稳定性。

以上代码是我在本地测试多核计算与单核计算的代码,使用单核心时计算 10 次 10亿次加法运算,需要 3s,使用多核心计算时仅需要至多 1s 明显可以看出Golang在多核CPU上做运算时的优势。

Golang reflect包实际使用

首先,来看看这段 PHP 代码:

它会输出:

用这个方法调用匹配名字的函数,非常有效。

那么,在 Golang 中是否可能用函数的名字来调用某个函数呢?

作为一个静态、编译型语言,答案是否定的……又是肯定的!

在 Golang 中,你不能这样做:

但这里有一个限制:这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。

如果想要用这个方法实现调用不同函数原型的函数,需要用到 interface{}。

这样,就可以添加有着不同函数原型的函数到一个 map 中:

那么如何调用 map 中的函数呢?像这样吗:

funcs[“foo”]()

绝对不行!这无法工作!你不能直接调用存储在空接口中的函数。

反射走进我们的生活!在 Golang 中有着叫做“reflect”的包。

将函数的值从空接口中反射出来,然后使用 reflect.Call 来传递参数并调用它。

没有什么是很难理解的。

抄录注:原文写得清晰,拿PHP作了对比,我就直接拿来做个笔记!

原文:Golang反射调用函数

Golang 协程示例

线程是计算机最小的调度单元,协程(Coroutine)本质上是一种轻量级线程。但是它的开销会比线程小很多,多个协程可以按照次序在一个线程里执行。这就是golang适用于高并发场景的最根本的原因。

国内的盛大,金山,美团,豆瓣,小米都有使用go
国外就多了,在中国说得比较多的docker,完全采用go开发。有人称 docker 是 golang 的第一个杀手级应用,现在各大云计算平台几乎全都支持 docker 实例,包括 谷歌,亚马逊,阿里云等。

进程、线程、协程的关系和区别:

  • 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
  • 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。
  • 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。

    推荐阅读:Golang适合高并发场景的原因分析

golang 交叉编译

go语言默认就支持交叉编译,不过在编译的时候在你计算器上得有C的编译器,gcc

Linux 比如方便安装gcc,直接从源码或者网络上的镜像直接安装即可

Windown下安装MinGW,然后把bin目录,也就是含有gcc.exe这个目录加入环境变量path就可以了

比如:在Windows下编译Linux可执行文件:

还可以单独编译:

目前支持的平台:

 

golang time 时间格式化

这是一个奇葩的东西,记录一下

通常情况下,大多数语言格式化时间都是用YY-mm-dd这样的东西来格式化。golang的这种格式化方式真令人想不到的说

只能是 “2006-01-02 15:04:05” 这个时间。。。

当需要将本地时间,转为Unix时间时应该使用如下方法:

而不是直接使用 time.Parse(),这个方法转出来的时间是UTC时间…

将Unix时间缀转为datetime,如果是字符串,就先转为int类型

 

Go语言发送Http请求

Go语言还不太熟悉,做个笔记,这货发送这种简单的请求也是太简单的了。。。

Go语言发送Http请求方法有点多,这里例举了两种:

第一种主要用来发送表单一样的键值对

第二种主要用来发送数据,更底层一些