设为首页 收藏本站
查看: 1260|回复: 0

[经验分享] golang 项目中坑

[复制链接]

尚未签到

发表于 2018-9-20 06:10:23 | 显示全部楼层 |阅读模式
  今天试着按照上一篇博客的设计自己实现自己的crawler,  踩了一路坑。有些找到了答案,有些没有。我先将这些坑记录下来,然后divide and conquer。
  code snippet
  

1 package util  

2  
3 import (
  
4     "math"
  
5     "sync"
  
6 )
  
7

  
8 type>  
9     NextId() (uint64, error)
  
10 }
  
11
  
12 type myIdGenerator struct {
  
13     rwmutex sync.RWMutex
  
14     seed    uint64
  
15 }
  
16
  
17 func NewIdGenerator() (*IdGenerator, error) {
  
18     return new(myIdGenerator), nil
  
19 }
  
20
  
21 //???RWMutex - two steps:  write after read.
  
22 func (this *myIdGenerator) NextId() (uint64, error) {
  
23     this.rwmutex.Lock()
  
24     defer this.rwmutex.Unlock()
  
25
  
26     //read
  
27     if this.seed == math.MaxUint64 {

  
28         return 0, error.New("util.id.NextId():>  
29     }
  
30
  
31     orig := seed
  
32
  
33     //write
  
34     seed++
  
35     return orig, nil
  
36 }
  

  坑一:struct -> interface
  crawler\util\id.go:18: cannot use new(myIdGenerator) (type *myIdGenerator) as type *IdGenerator in return argument:
  *IdGenerator is pointer to interface, not interface
  solution: http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go
  坑二:RWMutex read lock and write lock
  本来计划,用读锁保护 seed 的读取,之后用写锁保护seed 的修改。但是这个读取和写应该在一个transaction中,也就是说在自己读取到seed 和写seed之间,seed 不能被其他实体修改。
  如果在读锁Lock时候,写锁重入(假定支持锁升级重入),那么就会出现一种经典的死锁现象。A, B 都申请到了读锁,现在A准备升级到写锁,A等待B释放读锁,B也要升级而等待A释放读锁。
  本例中,资源锁定的范围并不大,一致用写锁对性能影响并不十分严重。但是如果读写临界区都比较大,那么怎么解决呢?
  坑三:interface 到底是 struct 还是 pointer? 这个应该与第一个坑属于同一个问题的不同表象。
  

1 package base  
2
  
3 import (
  
4     "net/http"
  
5 )
  
6
  
7 type Response struct {
  
8     resp  *http.Response
  
9     depth uint
  
10 }
  
11
  
12 ...
  
13
  
14 func (this *Response) Valid() bool {
  
15     if this.resp != nil && this.resp.Body != nil {
  
16         return true
  
17     }
  
18
  
19     return false
  
20 }
  

  注意这行代码,
  

this.resp != nil && this.resp.Body  

  从定义中我们知道this.resp的类型是一个指针,所以其零值是一个指针。但是我们怎么知道 this.resp.Body表示什么,它是一个接口,其定义如下:
  

1 // Body represents the response body.  

2     //  
3     // The http Client and Transport guarantee that Body is always
  
4     // non-nil, even on responses without a body or responses with
  
5     // a zero-lengthed body.
  
6     //
  
7     // The Body is automatically dechunked if the server replied
  
8     // with a "chunked" Transfer-Encoding.
  
9     Body io.ReadCloser
  

  是不是接口的实际类型都是指针,其零值都是nil?
  如果接口可以表示struct, 那么编译器如何判断 obj == nil 类型是否匹配?难道编译器知道interface 对应的真实类型, 用它的真实类型来判断的吗?
  坑四   const in golang
  golang 中的 const 比 c/c++中的 const 限定更加严格。
  golang:   const a =  expr;     十分苦恼



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-596636-1-1.html 上篇帖子: golang路上的小学生系列 下篇帖子: golang微信公众平台之人脸识别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表