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

有问必答wanglihua 回复了问题 • 2 人关注 • 2 个回复 • 545 次浏览 • 2016-10-17 08:43 • 来自相关话题

10.17 每日早报

文章分享astaxie 发表了文章 • 0 个评论 • 258 次浏览 • 2016-10-17 08:17 • 来自相关话题

10.17 每日早报

新闻:

1.可穿戴式空气过滤设备——忻风随身空气匣在北京发布

2.中国标准化协会携海尔旗下物流品牌日日顺共同推出智慧物流全流程服务标准

3.零零无限在美发布跟拍无人机Hover... 查看全部

10.17 每日早报


新闻:


1.可穿戴式空气过滤设备——忻风随身空气匣在北京发布


2.中国标准化协会携海尔旗下物流品牌日日顺共同推出智慧物流全流程服务标准


3.零零无限在美发布跟拍无人机Hover Camera Passport,主打安全、便携和易用


4.生日管家和心意点点完成合并,新公司取名心生家族(集团),两个品牌保持独立


5.Google News在美英推出Fact Check(事实检查)标签,协助分辨新闻报道真伪


6.金融科技初创公司Affirm宣布获得一笔1亿美元债务融资,融资总额达5.25亿美元


7.老牌健身房青鸟体育获3000万A轮融资,中体鼎新领投


资源:


2016中国移动电商市场研究报告
http://lab.cmcm.com/sjfx/2016-10-11/119.html


2016 Q3独角兽公司融资概况
http://36kr.com/p/5054569.html


注:上述内容来源于互联网,由EGO整理

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

有问必答astaxie 回复了问题 • 6 人关注 • 4 个回复 • 537 次浏览 • 2016-10-17 07:43 • 来自相关话题

Crane,支持最新swarmkit 特性的容器管理面板,完全开源

回复

开源程序xds2000 发起了问题 • 1 人关注 • 0 个回复 • 570 次浏览 • 2016-10-17 07:07 • 来自相关话题

golang 模板中怎么进行位运算?

有问必答mocos 回复了问题 • 2 人关注 • 2 个回复 • 541 次浏览 • 2016-10-16 22:56 • 来自相关话题

[译]空结构体

文章分享itfanr 发表了文章 • 12 个评论 • 2126 次浏览 • 2016-10-16 21:45 • 来自相关话题

这篇文章探讨了我喜欢的Go数据类型,空结构体。

空结构体是一个没有field的结构体类型。这里有几个例子,有命名和匿名形式:

... 查看全部

这篇文章探讨了我喜欢的Go数据类型,空结构体。


空结构体是一个没有field的结构体类型。这里有几个例子,有命名和匿名形式:


type Q struct{}
var q struct{}

所以,如果空结构体没有成员,我们该怎么使用它?


width


在深入研究空结构体本身前,我想简要讨论下width


术语width来自于gc编译器,尽管它的词源可能追溯到几十年年。


width描述了类型实例占用的字节数目。因为一个进程的地址空间是一维的,我认为witdh比size更合适。


width一个类型的属性。因为Go程序的每个值都有一个类型,值类型定义了它的witdh,一般是8比特的倍数。


我们可以发现任何值的宽度,它的类型的width使用unsafe.Sizeof()函数:


var s string
var c complex128
fmt.Println(unsafe.Sizeof(s)) // prints 8
fmt.Println(unsafe.Sizeof(c)) // prints 16

http://play.golang.org/p/4mzdOKW6uQ


数组类型的width是它的元素类型的倍数:


var a [3]uint32
fmt.Println(unsafe.Sizeof(a)) // prints 12

http://play.golang.org/p/YC97xsGG73


结构体提供了更灵活的方式来定义组合类型,它的width是所有组成类型的width的总和,加上padding:


type S struct {
a uint16
b uint32
}
var s S
fmt.Println(unsafe.Sizeof(s)) // prints 8, not 6

上面的例子演示了padding的一方面,值必须在内存中对齐为它的width的倍数。在这个场景中,在a和b中间被编译器加入了2个字节的padding。


更新:Russ Cox已经解释了width和对齐无关。你可以阅读下面的评论


空类型


现在,我们已经探讨了width,很明显空类型的width是零。它占用了零字节的存储空间:


var s struct{}
fmt.Println(unsafe.Sizeof(s)) // prints 0

因为空类型占用了零字节,所以它不需要填充。这样,空结构体组成的一个结构体也不占用存储空间:


type S struct {
A struct{}
B struct{}
}
var s S
fmt.Println(unsafe.Sizeof(s)) // prints 0

http://play.golang.org/p/PyGYFmPmMt


我们可以用空类型做什么


适用于Go语言的正交性,空类型和其他类型一样,是一个结构类型。你所使用的正常的结构体的所有的属性适用于空的结构。


你可以声明一个结构体数组struct{}s,但是他们当然不会占用存储空间:


var x [1000000000]struct{}
fmt.Println(unsafe.Sizeof(x)) // prints 0

http://play.golang.org/p/0lWjhSQmkc


struct{}s的切片仅仅消耗他们的slice头的空间。就像上面演示的那样,他们的后端数组不消耗空间:


var x = make([]struct{}, 1000000000)
fmt.Println(unsafe.Sizeof(x)) // prints 12 in the playground

http://play.golang.org/p/vBKP8VQpd8


当然,正常的子切片,内置的len和cap和预期一样工作:


var x = make([]struct{}, 100)
var y = x[:50]
fmt.Println(len(y), cap(y)) // prints 50 100

http://play.golang.org/p/8cO4SbrWVP


你可以获取struct{}值的地址,当它的可以地址化,就像其他值一样:


var a struct{}
var b = &a

有意思的是,两个struct{}值的地址可能是相同的:


var a, b struct{}
fmt.Println(&a == &b) // true

http://play.golang.org/p/uMjQpOOkX1


对于[]struct{}s,这个属性也是可见的:


a := make([]struct{}, 10)
b := make([]struct{}, 20)
fmt.Println(&a == &b) // false, a and b are different slices
fmt.Println(&a[0] == &b[0]) // true, their backing arrays are the same

http://play.golang.org/p/oehdExdd96


为什么是这样?如果你考虑一下,空结构体不包含成员,所以可以不包含数据。如果空结构体不包含数据,不能决定是否两个struct{}值是否是相同的。它们在效果上,是可替代的。


a := struct{}{} // not the zero value, a real new struct{} instance
b := struct{}{}
fmt.Println(a == b) // true

http://play.golang.org/p/K9qjnPiwM8


注意:这个属性不是spec所需要的,但是注意:Two distinct zero-size variables may have the same address in memory.


struct{} 作为 method receiver


现在,我们已经演示了空结构体有任何其他类型一样的行为,因此,我们可以把它们作为函数接收者来使用:


type S struct{}

func (s *S) addr() { fmt.Printf("%p\n", s) }

func main() {
var a, b S
a.addr() // 0x1beeb0
b.addr() // 0x1beeb0
}

http://play.golang.org/p/YSQCczP-Pt


在这个例子中,展示了all zero sized值的地址为0x1beeb0。精确的地址可能因Go的版本而不同。


封装


谢谢你的阅读。本文已接近800字,比预期更多,我还有更多的计划。


尽管本文关注于语言黑盒,有一个空结构体重要的实际用途。chan struct{}用来在不同的go routine之间发送信号。


翻译


本文的中文版在这里


更新:Damian Gryski指出我忽略了 Brad Fitzpatrick的iter包。我留下它作为读者的练习来探索Brad的深远影响的贡献。


相关文章



  1. Struct composition with Go

  2. Friday pop quiz: the smallest buffer

  3. Constant errors

  4. Stupid Go declaration tricks


英文原文


如果我翻译得不对,请帮我改善:
https://github.com/itfanr/articles-about-golang/blob/master/2016-10/2.the-empty-struct.md

Linux下一个程序正在写文件,另外一个程序删除该文件,会怎样?

有问必答astaxie 回复了问题 • 3 人关注 • 1 个回复 • 593 次浏览 • 2016-10-16 20:46 • 来自相关话题

空结构体struct{}的用法

有问必答astaxie 回复了问题 • 5 人关注 • 3 个回复 • 1557 次浏览 • 2016-10-16 20:09 • 来自相关话题

神奇的copy函数

有问必答CTO 回复了问题 • 4 人关注 • 2 个回复 • 473 次浏览 • 2016-10-16 19:34 • 来自相关话题

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

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

glang如何实现小票打印

有问必答jicg 回复了问题 • 4 人关注 • 2 个回复 • 548 次浏览 • 2016-10-16 12:57 • 来自相关话题

强烈建议 bee 工具创建目录结构时,去掉s

有问必答astaxie 回复了问题 • 3 人关注 • 6 个回复 • 501 次浏览 • 2016-10-16 11:23 • 来自相关话题

进程退出时如何保证占用的端口完全释放?

有问必答vz 回复了问题 • 8 人关注 • 6 个回复 • 781 次浏览 • 2016-10-16 08:55 • 来自相关话题

当初就这么入坑了Golang

Golangevolsnow 发表了文章 • 4 个评论 • 405 次浏览 • 2016-10-16 00:38 • 来自相关话题

当初入坑Golang倒不是工作需要,而是个人兴趣。

因为之前想写个机器人玩,顺便学门编译型语言(之前在写Python),最后挑选了语法简洁,跨平台支持的Go,不曾想最终会为之折服并着迷。。。

周末还写了篇博客希望吸引更多的人入... 查看全部

当初入坑Golang倒不是工作需要,而是个人兴趣。


因为之前想写个机器人玩,顺便学门编译型语言(之前在写Python),最后挑选了语法简洁,跨平台支持的Go,不曾想最终会为之折服并着迷。。。


周末还写了篇博客希望吸引更多的人入坑:smiling_imp::从零到一:用Golang编写机器人


不知大家是为何入坑Golang的,现在感觉如何?

struct的拷贝问题

有问必答tonyluj 回复了问题 • 8 人关注 • 4 个回复 • 866 次浏览 • 2016-10-15 23:07 • 来自相关话题