每日早报

每日早报

GoCN每日新闻(2017-05-10)

回复

每日新闻astaxie 发起了问题 • 2 人关注 • 0 个回复 • 899 次浏览 • 2017-05-10 09:31 • 来自相关话题

GoCN每日新闻(2017-05-08)

文章分享shibengen 回复了问题 • 3 人关注 • 2 个回复 • 794 次浏览 • 2017-05-08 10:12 • 来自相关话题

GoCN每日新闻(2017-05-07)

文章分享raindylong 回复了问题 • 3 人关注 • 1 个回复 • 794 次浏览 • 2017-05-07 14:02 • 来自相关话题

can't assign requested address 错误解决

文章分享astaxie 发表了文章 • 8 个评论 • 2039 次浏览 • 2017-05-04 10:25 • 来自相关话题

最近一直在写新版本的beego2,在做MUX测试的时候遇到了这个问题,

BenchmarkBeegoMuxRequests-8         panic: Post... 			查看全部
					

最近一直在写新版本的beego2,在做MUX测试的时候遇到了这个问题,


BenchmarkBeegoMuxRequests-8         panic: Post http://127.0.0.1:59079/repos/: ... ests: dial tcp 127.0.0.1:59079: connect: can't assign requested address

这个错误看上去是我的测试耗掉了所有的local port,但是local port 不应该是复用的吗?


我的测试里面的代码片段是这样的:


for _, route := range routes {
res, err := Request(route.method, ts.URL+route.path)
if err != nil {
panic(err)
}
res.Body.Close()
}

这个时候我去翻看了一下response里面的body的文档


// The default HTTP client's Transport does not
// attempt to reuse HTTP/1.0 or HTTP/1.1 TCP connections
// ("keep-alive") unless the Body is read to completion and is
// closed.

大家看到里面的话,只有当body读取并关闭,而我上面的代码只是关闭了,Body并没有读取。所以导致了client没有reuse TCP connection。


所以这个完全明白了,我们必须在关闭之前完全的读取Body里面的数据,我把原来的代码改成了下面之后就解决了问题


for _, route := range routes {
res, err := Request(route.method, ts.URL+route.path)
if err != nil {
panic(err)
}
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()
}

GoCN每日新闻(2017-05-04)

回复

文章分享astaxie 发起了问题 • 1 人关注 • 0 个回复 • 855 次浏览 • 2017-05-04 09:58 • 来自相关话题

每日新闻邮件订阅

文章分享mnhkahn 回复了问题 • 3 人关注 • 1 个回复 • 869 次浏览 • 2017-05-03 09:16 • 来自相关话题

GoCN每日新闻(2017-05-02)

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 1252 次浏览 • 2017-05-02 09:32 • 来自相关话题

GoCN每日新闻(2017-05-01)

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 1274 次浏览 • 2017-05-01 09:28 • 来自相关话题

10.25 每日早报

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

10.25 每日早报

新闻:

1.Node.js包管理器npm 4.0发布,新增大量重要改进

2.奔驰分时租赁平台Car2Share随心开正式进驻SOHO中国,半小时租费9.9元

3.优步中国开始新... 查看全部

10.25 每日早报


新闻:


1.Node.js包管理器npm 4.0发布,新增大量重要改进


2.奔驰分时租赁平台Car2Share随心开正式进驻SOHO中国,半小时租费9.9元


3.优步中国开始新App首发版内测,上线人工客服、与微信完成对接


4.原Uber中国高级副总裁柳甄加盟今日头条,具体任职暂未透露


5.分时租赁平台嗒嗒用车获得2000万人民币的A轮投资占股10%,旗下均为新能源汽车


6.滴滴快车拼车发布业务数据,日均订单已突破200万单,平均拼成率达70%


7.大疆发布禅思Z30远摄变焦云台相机,支持30倍光变,面向行业无人机应用市场


8.GeekPwn2016黑客嘉年华在上海开幕,神奇小子Geohot携自动驾驶系统Comma One 2参会


资源:


阿里&BCG:人工智能,未来制胜之道
http://www.bcg.com.cn/cn/newsandpublications/publications/reports/report20161013001.html


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

panic/recover工作原理

文章分享themoonstone 发表了文章 • 1 个评论 • 1237 次浏览 • 2016-10-24 15:09 • 来自相关话题

在Golang里面没有大家所熟悉的try-cache异常机制、而是用panic/recover代替 异常throw / catch和panic / recover是有些类似的,比如、recover的作用是捕获并返回panic提交的错误对象、这可以理解为通... 查看全部

在Golang里面没有大家所熟悉的try-cache异常机制、而是用panic/recover代替
异常throw / catch和panic / recover是有些类似的,比如、recover的作用是捕获并返回panic提交的错误对象、这可以理解为通过调用panic抛出一个值、该值可以通过调用recover函数进行捕获。
主要的区别是,即使当前goroutine处于panic状态,或当前goroutine中存在活动紧急情况,恢复调用仍可能无法检索这些活动紧急情况抛出的值。


For example:


package main

import (
"fmt"
)

func main() {
defer func() {
defer func() {
fmt.Println("6:", recover())
}()
}()
defer func() {
func() {
fmt.Println("5:", recover())
}()
}()
func() {
defer func() {
fmt.Println("1:", recover())
}()
}()
func() {
defer fmt.Println("2:", recover())
}()
func() {
fmt.Println("3:", recover())
}()

fmt.Println("4:", recover())
panic(1)
defer func() {
fmt.Println("0:", recover()) // never go here
}()
}

上述程序中的7个恢复调用都没有恢复程序。 程序崩溃并打印出堆栈跟踪:


$ go run example1.go
1:
2:
3:
4:
5:
6:
panic: 1


goroutine 1 [running]:
...
显然,第0个恢复调用是不可达的。 对于其他recover,让我们先检查Go规范:
如果满足以下任一条件,recover的返回值为nil:



  • 1.panic参数是nil

  • 2.当前goroutine没有产生panic

  • 3.recover不是由延迟函数直接调用。


让我们忽略第一个条件。 第二个条件覆盖第一/第二/第三和第四recover调用。 第三个覆盖第5个recover调用。 然而,三个条件中没有一个覆盖第六个recover调用。
怎样才能让recover调用起作用?如下 :


import("fmt")
func main(){
defer func(){
fmt.Println(recover())// 1
}()
panic(1)
}

现在,panic值被recover调用捕获,并且程序不会崩溃。
那么,使recover调用生效的主要规则是什么?
首先,让我们学习一些概念和说明。


概念:延迟函数调用概念:延迟函数调用


当函数被延迟调用时,或者函数的调用使用defer关键字作为前缀,则调用被称为延迟调用。


package main
func main(){
defer func(){// deferred function calling
func(){// not a deferred function calling
defer recover()// deferred function calling
}()
}()
func(){
// not a deferred function calling
defer func(){
/// deferred function calling
}()
}()
}

概念:函数调用级别和Goroutine执行级别


函数调用级别是指函数调用的深度,与主函数或者goroutine的入口函数相关。


package main

funcmain(){
// level 0
go func(){
// level 0
func(){
// level 1
}()
func(){
// level 1
func(){
// level 2
}()
}()
}()
func(){
// level 1
func(){
// level 2
go func(){
// level 0
}()
}()
go func(){
// level 0
}()
}()
}

goroutine当前执行点的调用级别称为goroutine的执行级别。


说明:panic只能向上传播


是的,panic只能向上传播,沿着函数调用堆栈反向。panic从不通过深入到函数调用中传播。


package main

import"fmt"
func main(){// calling level 0
defer func(){// calling level 1
fmt.Println("Now, the panic is still in calling level 0")
func(){// calling level 2
fmt.Println("Now, the panic is still in calling level 0")
func(){// calling level 3
fmt.Println("Now, the panic is still in calling level 0")
}()
}()
}()
defer fmt.Println("Now, the panic is in calling level 0")
func(){
// calling level 1
defer fmt.Println("Now, the panic is in calling level 1")
func(){// calling level 2
defer fmt.Println("Now, the panic is in calling level 2")
func(){// calling level 3
defer fmt.Println("Now, the panic is in calling level 3")
panic(1)
}()
}()
}()
}

The output:
Now, the panic is in calling level 3


Now, the panic is in calling level 2


Now, the panic is in calling level 1


Now, the panic is in calling level 0


Now, the panic is still in calling level 0


Now, the panic is still in calling level 0


Now, the panic is still in calling level 0


panic: 1


goroutine 1 [running]:


...


概念:panic级别


panic级别意味着panic传播到函数调用的哪一层级、因为panic只能向上传递、所以panic等级永远不加增加、只会减小、在goroutine中,当前panic的水平永远不会大于goroutine的执行水平。


说明:在同一层级上、新的panics会压制原有panics


Example:
package main

import"fmt"
func main(){
defer fmt.Println("program will not crash")
defer func(){
fmt.Println(recover())// 3
}()
defer fmt.Println("now, panic 3 suppresses panic 2")
defer panic(3)
defer fmt.Println("now, panic 2 suppresses panic 1")
defer panic(2)
panic(1)
}

Outputs:


now, panic 2 suppresses panic 1


now, panic 3 suppresses panic 2


3


program will not crash


在以上程序中、我们最终只能看到一个panic 3、panic 3被recover捕获、因此程序不会崩溃
在一个goroutine中,在任何时候在相同的调用级别将有至多一个主动panic。 特别是,当执行点运行在goroutine的调用级别0时,在goroutine中最多只有一个活动的panic。


说明:多个主动panic在一个Goroutine中的共存


Example:


package main

import"fmt"
func main(){// callnig level 0
defer fmt.Println("program will crash, for panic 3 is stll active")
defer func(){// calling level 1
defer func(){// calling level 2
fmt.Println(recover())// 6
}()// the level of panic 3 is 0.// the level of panic 6 is 1.
defer fmt.Println("now, there are two active panics: 3 and 6")
defer panic(6)// will suppress panic 5
defer panic(5)// will suppress panic 4
panic(4)// will not suppress panic 3, for they have differrent levels
// the level of panic 3 is 0.// the level of panic 4 is 1.
}()
defer fmt.Println("now, only panic 3 is active")
defer panic(3)// will suppress panic 2
defer panic(2)// will suppress panic 1
panic(1)
}

在该示例中,panic 6、两个处于active状态中的panic之一被recover捕获。 但是其他panic,panic 3,在主调用结束时仍然活动,所以程序将崩溃。
Outputs:


now, only panic 3 is active


now, there are two active


panics: 3 and 6


6


program will crash, for panic
3 is stll active


panic: 1


panic: 2

panic: 3

goroutine 1 [running]:
...


说明:低级的panics将会被首先捕获


Example:


package main

import"fmt"
func main(){
defer func(){
defer func(){
fmt.Println("panic",recover(),"is recovered")// panic 2 is recovered
}()
defer fmt.Println("panic",recover(),"is recovered")// panic 1 is recovered
defer fmt.Println("now, two active panics coexist")
panic(2)
}()
panic(1)
}

Outputs:


now, two active panics coexist


panic 1 is recovered


panic 2 is recovered


那么,什么是使recover调用生效的主要规则是什么?
规则很简单


在一个goroutine中,如果recover调用的调用函数是F并且F调用的级别是L,则为了使recover调用生效,F调用必须是延迟调用,并且必须存在主动panic的水平为L-1。
相对来说、这是一个比go规格更好的描述、 现在你可以回页面检查为什么第一个例子中的第6个recover调用不会生效了


原文链接:http://www.tapirgames.com/blog/golang-panic-recover-mechanism

10.24 每日早报

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

10.24 每日早报

新闻:

1.AT&T以股票加现金的形式收购时代华纳,收购总额854亿美元

2.美国DNS服务提供商Dyn遭受大规模DDoS攻击,导致诸多巨头网站停止服务

3.IBM和日... 查看全部

10.24 每日早报


新闻:


1.AT&T以股票加现金的形式收购时代华纳,收购总额854亿美元


2.美国DNS服务提供商Dyn遭受大规模DDoS攻击,导致诸多巨头网站停止服务


3.IBM和日本证券公司SBI合作开发区块链债券交易系统


4.知识产权电商平台知呱呱宣布获得清华启迪战略投资,知识产权服务平台3.0上线


5.魅族将推出Flyme平板系统和TV 系统,以及线下用户课堂和线上直播培训等业务


6.优步与墨西哥最大网上银行Bankaool合作发行信用卡,以解决不发达地区网上交易问题


7.互联网影视公司奇树有鱼获中南文化1050万元投资占股3%


资源:


2016年中国跨境电商邮件营销市场报告
http://www.webpowerchina.com/knowledge/page.php?id=486


中国互联网汽车电商产业生态图谱2016
http://www.analysys.cn/view/report/detail.html?columnId=8&articleId=1000323


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

10.22 每日早报

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

10.22 每日早报

新闻:

1.EMS与腾讯达成战略合作,用互联网+与社交赋能传统快递业

2.Docker借阿里云落地中国,后者获得Docker Engine商用版及Docker DataCenter运营权查看全部

10.22 每日早报


新闻:


1.EMS与腾讯达成战略合作,用互联网+与社交赋能传统快递业


2.Docker借阿里云落地中国,后者获得Docker Engine商用版及Docker DataCenter运营权


3.暴风正式推出语音聊天功能暴风语音Blizzard Voice,支持旗下所有游戏


4.沃尔玛战略投资新达达5千万美元,共同打造生鲜商超O2O零售模式


5.NBC环球将数字出版商BuzzFeed追加2亿美元投资,后者最新估值17亿美元


6.团贷网宣布获得3.75亿元C轮融资,品牌升级要做小型“陆金所”


7.工商总局公告有不法分子假借办理预付卡或预付消费的名义从事非法集资


资源:


从全球市值BIG5公司看未来科技发展趋势
http://www.aliresearch.com/blog/article/detail/id/21112.html


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

10.21 每日早报

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

10.21 每日早报

新闻:

1.特斯拉发布AutoPilot 2.0,车身8个摄像头提供360度环视功能

2.斗米兼职获4000万美元B轮融资,高瓴资本、腾讯、百度等参投

3.小鸣单车发布第二代智... 查看全部

10.21 每日早报


新闻:


1.特斯拉发布AutoPilot 2.0,车身8个摄像头提供360度环视功能


2.斗米兼职获4000万美元B轮融资,高瓴资本、腾讯、百度等参投


3.小鸣单车发布第二代智能共享单车XM02,与凯路仕自行车达成战略合作


4.途家并购携程、去哪儿的公寓民宿业务,后者民宿业务团队和房源归属途家


5.美国移动运营商AT&T启用无人机辅助信号塔巡检,省时省钱且环保


6.沃尔玛联合京东首次参战双11,山姆会员商店及沃尔玛国际旗舰店上线


7.食品安全法实施条例征求意见,入网食品安全问题或导致平台负责人被约谈


8.天音控股2亿元投资魅族,获0.655%股份


资源:


2016年中国二手车电子商务行业白皮书
http://report.iresearch.cn/report/201610/2663.shtml


中国体育创业全景白皮书:丛林法则与新蓝海
http://tech.qq.com/a/20161020/004573.htm


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

10.19 每日早报

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

10.19 每日早报

新闻:

1.Linux基金会宣布JS Foundation基金会成立,其前身为jQuery团队

2.苏宁阿里拟共同出资10亿元设立重庆猫宁电子商务有限公司,苏宁占股51%

3.... 查看全部

10.19 每日早报


新闻:


1.Linux基金会宣布JS Foundation基金会成立,其前身为jQuery团队


2.苏宁阿里拟共同出资10亿元设立重庆猫宁电子商务有限公司,苏宁占股51%


3.锤子科技发布新机Smartisan M1和M1L


4.辣椒快打完成3000万Pre-A轮融资,用户可以通过手机在电视上打游戏


5.酒类快消B2B电商易酒批再获1亿美金C轮融资,景林资产领投


6.工信部指导的中国区块链技术和产业发展论坛成立大会暨首届开发者大会在北京举行


7.蚂蚁花呗启动双11临时提额,六成用户可获益,最高可提5.5万


资源:


中国互联网婚恋交友行业研究报告(2016年Q3)
http://www.bigdata-research.cn/content/201610/357.html


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

10.18 每日早报

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

10.18 每日早报

新闻:

1.三星电子宣布使用10纳米技术量产芯片,率先实现业界突破

2.工商登记信息显示唯品会全资收购浙江贝付,正式获得第三方支付牌照

3.红点创投成立首支中国基金,完成首期基... 查看全部

10.18 每日早报


新闻:


1.三星电子宣布使用10纳米技术量产芯片,率先实现业界突破


2.工商登记信息显示唯品会全资收购浙江贝付,正式获得第三方支付牌照


3.红点创投成立首支中国基金,完成首期基金募集1.8亿美元,由中国团队独立运营


4.携程战略投资旅游连锁品牌旅游百事通,通过后者的5000多家门店布局二三线城市


5.豆瓣成立子公司飞船影业,发布青年导演短片计划


6.国务院第三次大督查:银行业面临不良贷款持续暴露等困难


7.消费金融平台分期乐宣布升级为乐信集团,平台注册用户突破1200万


资源:


2016Q2中国手机游戏市场季度监测报告
http://www.iimedia.cn/44558.html


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

GoCN每日新闻(2017-05-10)

回复

每日新闻astaxie 发起了问题 • 2 人关注 • 0 个回复 • 899 次浏览 • 2017-05-10 09:31 • 来自相关话题

GoCN每日新闻(2017-05-08)

回复

文章分享shibengen 回复了问题 • 3 人关注 • 2 个回复 • 794 次浏览 • 2017-05-08 10:12 • 来自相关话题

GoCN每日新闻(2017-05-07)

回复

文章分享raindylong 回复了问题 • 3 人关注 • 1 个回复 • 794 次浏览 • 2017-05-07 14:02 • 来自相关话题

GoCN每日新闻(2017-05-04)

回复

文章分享astaxie 发起了问题 • 1 人关注 • 0 个回复 • 855 次浏览 • 2017-05-04 09:58 • 来自相关话题

每日新闻邮件订阅

回复

文章分享mnhkahn 回复了问题 • 3 人关注 • 1 个回复 • 869 次浏览 • 2017-05-03 09:16 • 来自相关话题

GoCN每日新闻(2017-05-02)

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 1252 次浏览 • 2017-05-02 09:32 • 来自相关话题

GoCN每日新闻(2017-05-01)

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 1274 次浏览 • 2017-05-01 09:28 • 来自相关话题

can't assign requested address 错误解决

文章分享astaxie 发表了文章 • 8 个评论 • 2039 次浏览 • 2017-05-04 10:25 • 来自相关话题

最近一直在写新版本的beego2,在做MUX测试的时候遇到了这个问题,

BenchmarkBeegoMuxRequests-8         panic: Post... 			查看全部
					

最近一直在写新版本的beego2,在做MUX测试的时候遇到了这个问题,


BenchmarkBeegoMuxRequests-8         panic: Post http://127.0.0.1:59079/repos/: ... ests: dial tcp 127.0.0.1:59079: connect: can't assign requested address

这个错误看上去是我的测试耗掉了所有的local port,但是local port 不应该是复用的吗?


我的测试里面的代码片段是这样的:


for _, route := range routes {
res, err := Request(route.method, ts.URL+route.path)
if err != nil {
panic(err)
}
res.Body.Close()
}

这个时候我去翻看了一下response里面的body的文档


// The default HTTP client's Transport does not
// attempt to reuse HTTP/1.0 or HTTP/1.1 TCP connections
// ("keep-alive") unless the Body is read to completion and is
// closed.

大家看到里面的话,只有当body读取并关闭,而我上面的代码只是关闭了,Body并没有读取。所以导致了client没有reuse TCP connection。


所以这个完全明白了,我们必须在关闭之前完全的读取Body里面的数据,我把原来的代码改成了下面之后就解决了问题


for _, route := range routes {
res, err := Request(route.method, ts.URL+route.path)
if err != nil {
panic(err)
}
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()
}

10.25 每日早报

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

10.25 每日早报

新闻:

1.Node.js包管理器npm 4.0发布,新增大量重要改进

2.奔驰分时租赁平台Car2Share随心开正式进驻SOHO中国,半小时租费9.9元

3.优步中国开始新... 查看全部

10.25 每日早报


新闻:


1.Node.js包管理器npm 4.0发布,新增大量重要改进


2.奔驰分时租赁平台Car2Share随心开正式进驻SOHO中国,半小时租费9.9元


3.优步中国开始新App首发版内测,上线人工客服、与微信完成对接


4.原Uber中国高级副总裁柳甄加盟今日头条,具体任职暂未透露


5.分时租赁平台嗒嗒用车获得2000万人民币的A轮投资占股10%,旗下均为新能源汽车


6.滴滴快车拼车发布业务数据,日均订单已突破200万单,平均拼成率达70%


7.大疆发布禅思Z30远摄变焦云台相机,支持30倍光变,面向行业无人机应用市场


8.GeekPwn2016黑客嘉年华在上海开幕,神奇小子Geohot携自动驾驶系统Comma One 2参会


资源:


阿里&BCG:人工智能,未来制胜之道
http://www.bcg.com.cn/cn/newsandpublications/publications/reports/report20161013001.html


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

panic/recover工作原理

文章分享themoonstone 发表了文章 • 1 个评论 • 1237 次浏览 • 2016-10-24 15:09 • 来自相关话题

在Golang里面没有大家所熟悉的try-cache异常机制、而是用panic/recover代替 异常throw / catch和panic / recover是有些类似的,比如、recover的作用是捕获并返回panic提交的错误对象、这可以理解为通... 查看全部

在Golang里面没有大家所熟悉的try-cache异常机制、而是用panic/recover代替
异常throw / catch和panic / recover是有些类似的,比如、recover的作用是捕获并返回panic提交的错误对象、这可以理解为通过调用panic抛出一个值、该值可以通过调用recover函数进行捕获。
主要的区别是,即使当前goroutine处于panic状态,或当前goroutine中存在活动紧急情况,恢复调用仍可能无法检索这些活动紧急情况抛出的值。


For example:


package main

import (
"fmt"
)

func main() {
defer func() {
defer func() {
fmt.Println("6:", recover())
}()
}()
defer func() {
func() {
fmt.Println("5:", recover())
}()
}()
func() {
defer func() {
fmt.Println("1:", recover())
}()
}()
func() {
defer fmt.Println("2:", recover())
}()
func() {
fmt.Println("3:", recover())
}()

fmt.Println("4:", recover())
panic(1)
defer func() {
fmt.Println("0:", recover()) // never go here
}()
}

上述程序中的7个恢复调用都没有恢复程序。 程序崩溃并打印出堆栈跟踪:


$ go run example1.go
1:
2:
3:
4:
5:
6:
panic: 1


goroutine 1 [running]:
...
显然,第0个恢复调用是不可达的。 对于其他recover,让我们先检查Go规范:
如果满足以下任一条件,recover的返回值为nil:



  • 1.panic参数是nil

  • 2.当前goroutine没有产生panic

  • 3.recover不是由延迟函数直接调用。


让我们忽略第一个条件。 第二个条件覆盖第一/第二/第三和第四recover调用。 第三个覆盖第5个recover调用。 然而,三个条件中没有一个覆盖第六个recover调用。
怎样才能让recover调用起作用?如下 :


import("fmt")
func main(){
defer func(){
fmt.Println(recover())// 1
}()
panic(1)
}

现在,panic值被recover调用捕获,并且程序不会崩溃。
那么,使recover调用生效的主要规则是什么?
首先,让我们学习一些概念和说明。


概念:延迟函数调用概念:延迟函数调用


当函数被延迟调用时,或者函数的调用使用defer关键字作为前缀,则调用被称为延迟调用。


package main
func main(){
defer func(){// deferred function calling
func(){// not a deferred function calling
defer recover()// deferred function calling
}()
}()
func(){
// not a deferred function calling
defer func(){
/// deferred function calling
}()
}()
}

概念:函数调用级别和Goroutine执行级别


函数调用级别是指函数调用的深度,与主函数或者goroutine的入口函数相关。


package main

funcmain(){
// level 0
go func(){
// level 0
func(){
// level 1
}()
func(){
// level 1
func(){
// level 2
}()
}()
}()
func(){
// level 1
func(){
// level 2
go func(){
// level 0
}()
}()
go func(){
// level 0
}()
}()
}

goroutine当前执行点的调用级别称为goroutine的执行级别。


说明:panic只能向上传播


是的,panic只能向上传播,沿着函数调用堆栈反向。panic从不通过深入到函数调用中传播。


package main

import"fmt"
func main(){// calling level 0
defer func(){// calling level 1
fmt.Println("Now, the panic is still in calling level 0")
func(){// calling level 2
fmt.Println("Now, the panic is still in calling level 0")
func(){// calling level 3
fmt.Println("Now, the panic is still in calling level 0")
}()
}()
}()
defer fmt.Println("Now, the panic is in calling level 0")
func(){
// calling level 1
defer fmt.Println("Now, the panic is in calling level 1")
func(){// calling level 2
defer fmt.Println("Now, the panic is in calling level 2")
func(){// calling level 3
defer fmt.Println("Now, the panic is in calling level 3")
panic(1)
}()
}()
}()
}

The output:
Now, the panic is in calling level 3


Now, the panic is in calling level 2


Now, the panic is in calling level 1


Now, the panic is in calling level 0


Now, the panic is still in calling level 0


Now, the panic is still in calling level 0


Now, the panic is still in calling level 0


panic: 1


goroutine 1 [running]:


...


概念:panic级别


panic级别意味着panic传播到函数调用的哪一层级、因为panic只能向上传递、所以panic等级永远不加增加、只会减小、在goroutine中,当前panic的水平永远不会大于goroutine的执行水平。


说明:在同一层级上、新的panics会压制原有panics


Example:
package main

import"fmt"
func main(){
defer fmt.Println("program will not crash")
defer func(){
fmt.Println(recover())// 3
}()
defer fmt.Println("now, panic 3 suppresses panic 2")
defer panic(3)
defer fmt.Println("now, panic 2 suppresses panic 1")
defer panic(2)
panic(1)
}

Outputs:


now, panic 2 suppresses panic 1


now, panic 3 suppresses panic 2


3


program will not crash


在以上程序中、我们最终只能看到一个panic 3、panic 3被recover捕获、因此程序不会崩溃
在一个goroutine中,在任何时候在相同的调用级别将有至多一个主动panic。 特别是,当执行点运行在goroutine的调用级别0时,在goroutine中最多只有一个活动的panic。


说明:多个主动panic在一个Goroutine中的共存


Example:


package main

import"fmt"
func main(){// callnig level 0
defer fmt.Println("program will crash, for panic 3 is stll active")
defer func(){// calling level 1
defer func(){// calling level 2
fmt.Println(recover())// 6
}()// the level of panic 3 is 0.// the level of panic 6 is 1.
defer fmt.Println("now, there are two active panics: 3 and 6")
defer panic(6)// will suppress panic 5
defer panic(5)// will suppress panic 4
panic(4)// will not suppress panic 3, for they have differrent levels
// the level of panic 3 is 0.// the level of panic 4 is 1.
}()
defer fmt.Println("now, only panic 3 is active")
defer panic(3)// will suppress panic 2
defer panic(2)// will suppress panic 1
panic(1)
}

在该示例中,panic 6、两个处于active状态中的panic之一被recover捕获。 但是其他panic,panic 3,在主调用结束时仍然活动,所以程序将崩溃。
Outputs:


now, only panic 3 is active


now, there are two active


panics: 3 and 6


6


program will crash, for panic
3 is stll active


panic: 1


panic: 2

panic: 3

goroutine 1 [running]:
...


说明:低级的panics将会被首先捕获


Example:


package main

import"fmt"
func main(){
defer func(){
defer func(){
fmt.Println("panic",recover(),"is recovered")// panic 2 is recovered
}()
defer fmt.Println("panic",recover(),"is recovered")// panic 1 is recovered
defer fmt.Println("now, two active panics coexist")
panic(2)
}()
panic(1)
}

Outputs:


now, two active panics coexist


panic 1 is recovered


panic 2 is recovered


那么,什么是使recover调用生效的主要规则是什么?
规则很简单


在一个goroutine中,如果recover调用的调用函数是F并且F调用的级别是L,则为了使recover调用生效,F调用必须是延迟调用,并且必须存在主动panic的水平为L-1。
相对来说、这是一个比go规格更好的描述、 现在你可以回页面检查为什么第一个例子中的第6个recover调用不会生效了


原文链接:http://www.tapirgames.com/blog/golang-panic-recover-mechanism

10.24 每日早报

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

10.24 每日早报

新闻:

1.AT&T以股票加现金的形式收购时代华纳,收购总额854亿美元

2.美国DNS服务提供商Dyn遭受大规模DDoS攻击,导致诸多巨头网站停止服务

3.IBM和日... 查看全部

10.24 每日早报


新闻:


1.AT&T以股票加现金的形式收购时代华纳,收购总额854亿美元


2.美国DNS服务提供商Dyn遭受大规模DDoS攻击,导致诸多巨头网站停止服务


3.IBM和日本证券公司SBI合作开发区块链债券交易系统


4.知识产权电商平台知呱呱宣布获得清华启迪战略投资,知识产权服务平台3.0上线


5.魅族将推出Flyme平板系统和TV 系统,以及线下用户课堂和线上直播培训等业务


6.优步与墨西哥最大网上银行Bankaool合作发行信用卡,以解决不发达地区网上交易问题


7.互联网影视公司奇树有鱼获中南文化1050万元投资占股3%


资源:


2016年中国跨境电商邮件营销市场报告
http://www.webpowerchina.com/knowledge/page.php?id=486


中国互联网汽车电商产业生态图谱2016
http://www.analysys.cn/view/report/detail.html?columnId=8&articleId=1000323


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

10.22 每日早报

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

10.22 每日早报

新闻:

1.EMS与腾讯达成战略合作,用互联网+与社交赋能传统快递业

2.Docker借阿里云落地中国,后者获得Docker Engine商用版及Docker DataCenter运营权查看全部

10.22 每日早报


新闻:


1.EMS与腾讯达成战略合作,用互联网+与社交赋能传统快递业


2.Docker借阿里云落地中国,后者获得Docker Engine商用版及Docker DataCenter运营权


3.暴风正式推出语音聊天功能暴风语音Blizzard Voice,支持旗下所有游戏


4.沃尔玛战略投资新达达5千万美元,共同打造生鲜商超O2O零售模式


5.NBC环球将数字出版商BuzzFeed追加2亿美元投资,后者最新估值17亿美元


6.团贷网宣布获得3.75亿元C轮融资,品牌升级要做小型“陆金所”


7.工商总局公告有不法分子假借办理预付卡或预付消费的名义从事非法集资


资源:


从全球市值BIG5公司看未来科技发展趋势
http://www.aliresearch.com/blog/article/detail/id/21112.html


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

10.21 每日早报

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

10.21 每日早报

新闻:

1.特斯拉发布AutoPilot 2.0,车身8个摄像头提供360度环视功能

2.斗米兼职获4000万美元B轮融资,高瓴资本、腾讯、百度等参投

3.小鸣单车发布第二代智... 查看全部

10.21 每日早报


新闻:


1.特斯拉发布AutoPilot 2.0,车身8个摄像头提供360度环视功能


2.斗米兼职获4000万美元B轮融资,高瓴资本、腾讯、百度等参投


3.小鸣单车发布第二代智能共享单车XM02,与凯路仕自行车达成战略合作


4.途家并购携程、去哪儿的公寓民宿业务,后者民宿业务团队和房源归属途家


5.美国移动运营商AT&T启用无人机辅助信号塔巡检,省时省钱且环保


6.沃尔玛联合京东首次参战双11,山姆会员商店及沃尔玛国际旗舰店上线


7.食品安全法实施条例征求意见,入网食品安全问题或导致平台负责人被约谈


8.天音控股2亿元投资魅族,获0.655%股份


资源:


2016年中国二手车电子商务行业白皮书
http://report.iresearch.cn/report/201610/2663.shtml


中国体育创业全景白皮书:丛林法则与新蓝海
http://tech.qq.com/a/20161020/004573.htm


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

10.19 每日早报

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

10.19 每日早报

新闻:

1.Linux基金会宣布JS Foundation基金会成立,其前身为jQuery团队

2.苏宁阿里拟共同出资10亿元设立重庆猫宁电子商务有限公司,苏宁占股51%

3.... 查看全部

10.19 每日早报


新闻:


1.Linux基金会宣布JS Foundation基金会成立,其前身为jQuery团队


2.苏宁阿里拟共同出资10亿元设立重庆猫宁电子商务有限公司,苏宁占股51%


3.锤子科技发布新机Smartisan M1和M1L


4.辣椒快打完成3000万Pre-A轮融资,用户可以通过手机在电视上打游戏


5.酒类快消B2B电商易酒批再获1亿美金C轮融资,景林资产领投


6.工信部指导的中国区块链技术和产业发展论坛成立大会暨首届开发者大会在北京举行


7.蚂蚁花呗启动双11临时提额,六成用户可获益,最高可提5.5万


资源:


中国互联网婚恋交友行业研究报告(2016年Q3)
http://www.bigdata-research.cn/content/201610/357.html


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

10.18 每日早报

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

10.18 每日早报

新闻:

1.三星电子宣布使用10纳米技术量产芯片,率先实现业界突破

2.工商登记信息显示唯品会全资收购浙江贝付,正式获得第三方支付牌照

3.红点创投成立首支中国基金,完成首期基... 查看全部

10.18 每日早报


新闻:


1.三星电子宣布使用10纳米技术量产芯片,率先实现业界突破


2.工商登记信息显示唯品会全资收购浙江贝付,正式获得第三方支付牌照


3.红点创投成立首支中国基金,完成首期基金募集1.8亿美元,由中国团队独立运营


4.携程战略投资旅游连锁品牌旅游百事通,通过后者的5000多家门店布局二三线城市


5.豆瓣成立子公司飞船影业,发布青年导演短片计划


6.国务院第三次大督查:银行业面临不良贷款持续暴露等困难


7.消费金融平台分期乐宣布升级为乐信集团,平台注册用户突破1200万


资源:


2016Q2中国手机游戏市场季度监测报告
http://www.iimedia.cn/44558.html


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

10.17 每日早报

文章分享astaxie 发表了文章 • 0 个评论 • 459 次浏览 • 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整理

10.15 每日早报

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

10.15 每日早报

新闻:

1.私有云巨头VMware与公有云老大亚马逊合作,推出混合云服务

2.IBM、谷歌、戴尔、AMD等成立开放技术联盟,发布开放性规范,服务器性能或增10倍

3.Googl... 查看全部

10.15 每日早报


新闻:


1.私有云巨头VMware与公有云老大亚马逊合作,推出混合云服务


2.IBM、谷歌、戴尔、AMD等成立开放技术联盟,发布开放性规范,服务器性能或增10倍


3.Google Photos基于云端推出重温记忆、生成动图、自动纠图等功能


4.24小时自助健身房Liking健身完成A轮数千万元人民币融资,同创伟业领投


5.高盛宣布上线个人无抵押网络借款平台Marcus,允许自由选择每月还款日和还款计划


6.Pinterest月度活跃用户突破1.5亿,四分之三新用户来自美国以外


7.网易严选宣布为供应商压款支付利息,颠覆传统的361付款方式


8.空客实现3D打印标准化并将其纳入A350 XWB飞机供应链


资源:


中国手机网民网络安全状况报告
http://www.cnnic.net.cn/hlwfzyj/hlwxzbg/ydhlwbg/201610/t20161012_54551.htm


阿里云开源AliSQL数据库
https://github.com/alibaba/AliSQL


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

10.14 每日早报

文章分享astaxie 发表了文章 • 2 个评论 • 547 次浏览 • 2016-10-14 08:19 • 来自相关话题

~~ 10.14 每日早报~~

新闻:

1.微软正式发布Windows Server 2016,全面开放下载

2.国务院办公厅公布互联网金融风险专项整治工作实施方案

3.英雄联盟(LOL)宣布11月... 查看全部

~~ 10.14 每日早报~~


新闻:


1.微软正式发布Windows Server 2016,全面开放下载


2.国务院办公厅公布互联网金融风险专项整治工作实施方案


3.英雄联盟(LOL)宣布11月起停止支持XP SP2或以下版本


4.索尼举办PS VR中国首发会,公布12款VR游戏、发布PS4主机


5.庞大集团与光大银行合作向叮叮约车提供50亿元,开拓网约车市场


6.继趣分期之后,校园贷平台我来贷正式关闭学生申请贷款通道


7.糖豆广场舞完成B轮1500万美元融资,顺为资本领投


资源:


中国互联网金融P2P行业合规转型策略
http://www.199it.com/archives/525685.html


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

10.13 每日早报

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

10.13 每日早报

新闻:

1.IMAX将于2016年底前在欧洲开设首个虚拟现实体验中心

2.饿了么、阿里旅行和51社保等企业接入阿里钉钉平台

3.网易有道与考神团队成立教育合资公司,将投入5亿元... 查看全部

10.13 每日早报


新闻:


1.IMAX将于2016年底前在欧洲开设首个虚拟现实体验中心


2.饿了么、阿里旅行和51社保等企业接入阿里钉钉平台


3.网易有道与考神团队成立教育合资公司,将投入5亿元孵化教育工作室


4.百度成立百度资本,投资泛互联网领域中后期项目,一期基金200亿


5.英特尔推出自主品牌工业无人机Falcon 8+,聚焦工业场合应用


6.亚马逊计划开设便利店和路边取货点,用户可在路边区域提取商品


7.阿里游戏、金立游戏等多家手游平台提醒开发者提供总局出版批文


8.德国航空航天中心完成高清版3D世界地图,可免费用于科研项目


资源:


2016年中国视频网站付费用户典型案例研究报告
http://report.iresearch.cn/report/201610/2653.shtml


中国的移动互联网Top 2000 APP秋季盘点
http://www.questmobile.com.cn/blog/blog_61.html


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

10/12 每日早报

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

10.12 每日早报

新闻:

1.百度云计算品牌升级,面向企业正式启用“百度云”品牌

2.FreeBSD 11.0正式发布,支持RISC-V指令集和NUMA内存调度

3.三菱汽车正式并入雷诺日产联盟... 查看全部

10.12 每日早报


新闻:


1.百度云计算品牌升级,面向企业正式启用“百度云”品牌


2.FreeBSD 11.0正式发布,支持RISC-V指令集和NUMA内存调度


3.三菱汽车正式并入雷诺日产联盟,所有业务将由后者接管


4.中通快递在美提交招股书,拟最高融资15亿美元


5.伊朗打车软件Snapp完成2000万欧元A轮融资,南非手机企业MTN独家领投


6.空间再造平台共享际获A轮超4亿元融资,主打空间运营+内容运营


7.美国梅西百货计划在2017年在中国上线独立电商网站


资源:


15个开源的顶级人工智能工具
https://news.cnblogs.com/n/554933/


二手车行业用户搜索报告
http://www.goerxon.com/media/report-1.pdf


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

10.11 每日早报

文章分享astaxie 发表了文章 • 0 个评论 • 507 次浏览 • 2016-10-11 09:52 • 来自相关话题

10.11 每日早报

新闻:

1.哔哩哔哩正式上线VIP会员制度“大会员”,单月价格25元

2.Mozilla为Firefox Sync引入设备管理功能,可远程取消设备同步

3.京东发起公益活动,在... 查看全部

10.11 每日早报


新闻:


1.哔哩哔哩正式上线VIP会员制度“大会员”,单月价格25元


2.Mozilla为Firefox Sync引入设备管理功能,可远程取消设备同步


3.京东发起公益活动,在北京和天津推出快递小哥上门收旧衣服活动


4.花椒直播获3亿元A轮融资,360投资6000万元


5.福田汽车牵手百度,聚焦无人驾驶超级卡车和车联网


6.ofo共享单车完成1.3亿美元C轮融资,宣布向非校园的城市用户开放


7.电子合同签署云平台契约锁获得900万元天使轮融资,上海泛微网络领投


资源:


2016上半年度中国快递市场研究报告
http://www.bigdata-research.cn/content/201610/354.html


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