文档章节

Go1.2新功能简介

chai2010
 chai2010
发布于 2013/09/09 16:43
字数 1101
阅读 6631
收藏 29
点赞 4
评论 19

<!-- Go1.2有哪些改进? -->

距离2013.08.12正式发布Go1.1.2大约1个月了. 目前Go语言已经进入Go1.2的发布流程, 预计将在2013年底发布.

本文主要列举Go1.2的一些大的改进, 并会持续保持更新.

语言的改变

禁止nil对象取值

对于Go1.0, 有以下代码:

type T struct {
	X [1<<24]byte
	Field int32
}

func main() {
	var x *T
}

操作 x.Field 将会对应到 1<<24 位置的内存. 在Go1.2中, 将导致 panic 或 错误.

切片语法增加cap域

之前在切片时, cap默认为最大. 比如:

var array [10]int
slice := array[2:4]

slice的容量是8. 在Go1.2中, 如希望容量为6, 可以这样:

slice = array[2:4:6]

如果第一部分的开始地址省略, 则默认为0.

有了可定制的cap语法,就可以自己new一个大内存,然后自己构造malloc/free内存管理函数了。

每次malloc返回的slice的cap被严格限定为申请的size。

该语法的设计文档: https://docs.google.com/document/d/1GKKdiGYAghXRxC2BFrSEbHBZZgAGKQ-yXK-hRKBo0Kk/pub

cgo支持C++源码

CGO支持函数指针, 用法请参考 https://code.google.com/p/go/source/browse/misc/cgo/test/fpvar.go.

CGO支持C++语法, 但是只支持C语言的导入符号.

针对C++增加了 CPPFLAGSCXXFLAGS 参数设置选项.

比较适合用C语言导出, 但是用C++实现的库.

注: windows版本的MinGW还不支持外部链接, 详情请参考 Issue6533.

runtime实现的变化

goroutines 的函数入口采用抢占式调度.

在之前的版本中, 如果goroutines内部有死循环, 那么其他的 goroutines 可能无法获取此线程的CPU资源, 特别是在 GOMAXPROCS 设置为 1 个线程的时候.

在Go1.2中部分解决了此问题: 调度器会在函数的 入口处被偶尔触发. 也就是说, 如果任何循环 内部调用了一个非内联的函数的话, 其他goroutines 也将有机会在同一个线程执行.

在Go1.2, goroutine 的默认堆栈大小临时由4KB改为8KB. 新改的8KB大小对于很多实际的程序可以带来一定的性能提升. 当然, 更大的默认堆栈也导致了程序可能使用更多的内存, 在后续的Go开发中采用更好的堆栈技术解决这个问题.

同时goroutine的栈有最大限制(不是无限的), 64位系统默认限制为1GB, 32位系统模型限制为250MB. 如果需要调整默认值, 可以调用 runtime/debug 包的 SetMaxStack 函数修改. 具体请参考: CL12541052

程序开启的系统线程有增加了最大数量限制(默认为10000). 如果需要调整默认值, 可以调用 runtime/debug 包的 SetMaxThreads 函数修改. 具体请参考: CL13037043

关于动态库支持

Linux/Arm 版本已经支持外部链接. 这是Go的编译工具链支持动态库特性的一个关键环节.

gccgo的状态

期望GCC4.9能包含完整的Go1.2. 目前的GCC4.8.2包含Go1.1.2.

性能优化

  • compress/bzip2: 30%的性能提升
  • crypto/des: 5倍的性能提升
  • encoding/json: encoding 30% 的性能提升
  • net: windows/BSD下 网络和 runtime 的深度集成(Linux/OS X在Go1.1已经支持), 30% 的性能提升

标准库的变化

较大的变化有:

  • encoding: 新包, 提供通用的 encoding 接口
  • fmt: 引入参数索引支持, 主要是处理不同语言翻译之后参数顺序的变化
  • sync/atomic: 增加了 Swap 函数
  • text/template: 增加 eq/lt 等比较函数, 增加 {{else if ... }}简化语法
  • runtime: 简化 SetFinalizer 参数 f 的参数类型的限制, 只要可赋值即可
  • testing: 增加的 TB 接口
  • image/gif 增加了 encode 函数
  • MD5/HASH等增加便利的函数

fmt新支持的参数索引:

fmt.Printf("%[3]c %[1]c %[1]c %c\n", 'a', 'b', 'c')
// output: c a a b

简化的HASH用法:

hash := sha1.Sum([]byte("123"))
fmt.Printf("H(data) = %x\n", hash)

杂项消息(个人补充)

  • go 命令行工具迁移到 go.tools, 并将大幅改进版面
  • go.text/encoding 增加了 GBK 的支持, 彻底解决中文Windows命令行中文乱码问题.
  • go.image 增加了 bmp 的保存 和 分块 tiff 的读取支持, 目前还不支持超大tiff图像.
  • notepad++ 更好的高亮显示, builtin函数的自动补全, 函数/方法列表等功能.

© 著作权归作者所有

共有 人打赏支持
chai2010

chai2010

粉丝 413
博文 98
码字总数 81391
作品 8
武汉
程序员
加载中

评论(19)

雨里有条鱼
雨里有条鱼

引用来自“林夕如梦”的评论

1.5.2 amd64 的go 在windows上mingw还是能外部链接吗?

引用来自“chai2010”的评论

1.5 就可以了, 可以支持 C++ 代码编译.
嗯,我的问题,测试可以了
chai2010
chai2010

引用来自“林夕如梦”的评论

1.5.2 amd64 的go 在windows上mingw还是能外部链接吗?
1.5 就可以了, 可以支持 C++ 代码编译.
雨里有条鱼
雨里有条鱼
1.5.2 amd64 的go 在windows上mingw还是能外部链接吗?
雨里有条鱼
雨里有条鱼

引用来自“chai2010”的评论

引用来自“林夕如梦”的评论

go1.2调用c++的静态库,出现问题,无法识别new,需要用cppflags之类的设置吗?

new等C++特有的特征只能在C++文件中访问. 头文件只能导出C的函数和结构体.
如果是Windows, Go1.2还可能遇到一些链接问题, 具体请参考 Issue4069 .
cppflags只是用于指定C++版本的链接库.

嗯,昨晚搞定了,原来windows下cgo不能用libxxx.a, 使用#cgo LDFLAGS -lxxx,会出现undefined,只能通过dll,Go1.3不知道会不会支持
chai2010
chai2010

引用来自“林夕如梦”的评论

go1.2调用c++的静态库,出现问题,无法识别new,需要用cppflags之类的设置吗?

new等C++特有的特征只能在C++文件中访问. 头文件只能导出C的函数和结构体.
如果是Windows, Go1.2还可能遇到一些链接问题, 具体请参考 Issue4069 .
cppflags只是用于指定C++版本的链接库.
雨里有条鱼
雨里有条鱼
go1.2调用c++的静态库,出现问题,无法识别new,需要用cppflags之类的设置吗?
chai2010
chai2010

引用来自“encro”的评论

“如果如果任何循环”

已经更正, 多谢提醒 :)
encro
encro
“如果如果任何循环”
张露兵
张露兵
template功能确实该改进下了。
狗头666
狗头666
感觉又编辑了?又加了点内容
Go 1.2 RC5 发布(继续RC)

Go1.2新功能预览: http://golang.org/doc/go1.2 Go 1.2 RC5下载: https://code.google.com/p/go/downloads/list...

李察德-泰森 ⋅ 2013/11/18 ⋅ 16

Go 1.2 RC4 发布

Go1.2新功能预览: http://golang.org/doc/go1.2 Go 1.2 RC4下载: https://code.google.com/p/go/downloads/list...

李察德-泰森 ⋅ 2013/11/13 ⋅ 11

Go 1.2 RC3 发布

Go1.2新功能预览: http://golang.org/doc/go1.2 Go 1.2 RC2下载: https://code.google.com/p/go/downloads/list...

李察德-泰森 ⋅ 2013/11/01 ⋅ 46

Go 1.2 RC2 发布

Go1.2新功能预览: http://my.oschina.net/chai2010/blog/160143 Go 1.2 RC2下载: https://code.google.com/p/go/downloads/list...

chai2010 ⋅ 2013/10/18 ⋅ 30

GCC 4.8.2 发布

GCC 4.8.2 的主要更新是包含了完整的对 Go1.1.2 的支持。 对还未发布的 Go1.2 的支持预计要等到 GCC4.9。 GCC 4.8.2 还包含了一些BUG修改,具体请参考更新日志。 http://gcc.gnu.org/gcc-4.8...

chai2010 ⋅ 2013/10/17 ⋅ 20

【工具使用系列】关于 MATLAB 神经网络工具箱,你需要知道的事

如何使用 MATLAB 神经网络工具箱 什么是 MATLAB 神经网络工具箱 神经网络简介 神经网络模型及训练 生物神经元模型 神经网络模型 神经网络的训练 神经网络的分类 神经网络工具箱简介 工具箱的...

AllenMoore ⋅ 01/30 ⋅ 0

【PPT分享】PowerDesigner10.0与模型驱动开发.ppt

作者简介 我的名字是王晓昀 (WANG Xiao Yun) 我于1978年上北京大学.只上了三个月. 我于1979年去法国上学 1986年大学毕业后在巴黎的SDP软件公司工作 1988年开始开发PowerDesigner 1989年开发在...

红薯 ⋅ 2010/09/03 ⋅ 9

51CTO博客2.0新功能上线,快来跟我一起用一句话介绍自己

在今天这个万众瞩目世界杯,人人等待端午节的日子里,我们51CTO博客2.0终于又迎来了一次版本更新。 现在大家跟我一起使用本次更新的新功能,用一句话介绍自己吧!! Q:一句话简介可以在那儿被...

51CTO博客 ⋅ 06/14 ⋅ 0

Work Like Alibaba系列分享资料整理(含PDF、视频、文字):持续更新中

阿里巴巴逐年增加的双11营业额和财年集团收入的背后隐藏着怎样的秘密?这18年来,它又是用怎样的工作方法、工作形式打造出高效、创新的企业帝国。带你全方位了解阿里的开发、产品、运营、销售...

rdc鼓励师 ⋅ 2017/08/27 ⋅ 0

史上最全的 Sublime Text 汉化、插件安装合集

0.前言 本文用于给新手小白用户指明前进方向,不用做商业推广。 其次,鼓励购买正版,拒绝盗版。 好了,口号喊完,接下来就直接开始正文。 1. Sublime Text 介绍 首先在开始前,先来介绍一下...

mr_lp ⋅ 2017/03/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 32分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部