为什么我不会舍弃的近义词Python投奔Go语言

[广告]投资优惠入口:
对文章打分
Russ Cox:为什么我不会舍弃Python投奔Go语言
(window.slotbydup=window.slotbydup || []).push({
id: '945055',
container: s,
size: '300,250',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '649316',
container: s,
size: '300,250',
display: 'inlay-fix'
阅读 (201784) 评论 (70)
阅读 (122665) 评论 (313)
阅读 (77067) 评论 (139)
阅读 (292984) 评论 (186)
阅读 (202741) 评论 (94)
阅读 (201805) 评论 (70)
Advertisment ad adsense googlesGo语言io.Reader,我犯的一个超愚蠢的错误,妹滴!
我之前从网上查查,写了个go版本的代理程序,但是运行的很奇怪,时好时坏的,而且优酷等等视频网站也不行。
我是修改来修改去,重新构建request啊,cookie保存位置啊,各种挠头,就是不行……
直到今天,突然有点灵光,把io.Reader(go接口,包含一个Read方法,传入一个切片,返回读取字节数),用Read读取数据后,不再直接把切片拿去Write,而是取切片的切片去Write,如下:
n,_:=resp1.Body.Read(data)
// resp2.Body.Write(data)
resp2.Body.Write(data[:n]) 结果居然能用了,而且也能正常代理视频了(A站B站要TLS,没办法)
结果Go语言的io.Reader接口的Read方法,不是每个满足的类型该方法都能保证每次读取都填满切片长度的;更坑爹的是,它写入切片的时候,也不改变切片的长度……
回头看看,go语言并没有提供slice什么方法,可以直接修改切片的长度,它只是保证了不超出cap时不重新划分底层地址而已,所以Read方法,既然传入的不是指针,那么原切片的长度和容量实际上改变不了的……
尼玛我挠头那么久到底是在搞啥……
你被Google 这个 Gay 给Rape了
有python 你不用
偏要舔 Google的pussy
--- 共有 1 条评论 ---
python 不是 Google 的jiba么?
只不过现在google把jiba割了....
引用来自“宏哥”的答案 你被Google 这个 Gay 给Rape了
有python 你不用
偏要舔 Google的pussy
怪谁? 因为go的语法我喜欢,更重要的是,我不了解http编程,python封装的太好了,太方便以致于我接触不到底层(python的库文档好大,吓坏我了),go的标准库很小(相对python),我可以边学go,顺便就把http给学了
引用来自“刘地”的答案引用来自“宏哥”的答案 你被Google 这个 Gay 给Rape了
有python 你不用
偏要舔 Google的pussy
怪谁? 因为go的语法我喜欢,更重要的是,我不了解http编程,python封装的太好了,太方便以致于我接触不到底层(python的库文档好大,吓坏我了),go的标准库很小(相对python),我可以边学go,顺便就把http给学了你这理由挺搞笑的,python的文档大,是因为库多,可是很多库不是必须的,你用到哪,你就看到哪,你想一口气全部看完,既找虐,也没意义,至于你说的python封装的太好,那我就更要吐槽了,python是给你多样的选择,你可以用高层的库,也可以深入底层,你可以直接用python的socket呀,这难道还不够底层,你用C进行网络编程,还不就是鼓捣socket,python为你想的如此周到,可是你却抱怨python太周到了,这真是和曾老师是同路中人,:)
引用来自“Yu_Yang”的答案引用来自“刘地”的答案引用来自“宏哥”的答案 你被Google 这个 Gay 给Rape了
有python 你不用
偏要舔 Google的pussy
怪谁? 因为go的语法我喜欢,更重要的是,我不了解http编程,python封装的太好了,太方便以致于我接触不到底层(python的库文档好大,吓坏我了),go的标准库很小(相对python),我可以边学go,顺便就把http给学了你这理由挺搞笑的,python的文档大,是因为库多,可是很多库不是必须的,你用到哪,你就看到哪,你想一口气全部看完,既找虐,也没意义,至于你说的python封装的太好,那我就更要吐槽了,python是给你多样的选择,你可以用高层的库,也可以深入底层,你可以直接用python的socket呀,这难道还不够底层,你用C进行网络编程,还不就是鼓捣socket,python为你想的如此周到,可是你却抱怨python太周到了,这真是和曾老师是同路中人,:) 我也没说我不用python啊,事实上我大多数时候都是用的python,我的意思是,python库很多,封装也很多,不知道学哪个好;库文档很完备是不假,可英文的太痛苦了(所以我宁愿短一点,能让我下决心去看)
python和ms都太”庞大“了,让我有种无所适从的感觉,拿来应用我是很满意,可是要我用他们学习原理,老实说,我害怕,也不知道怎么下手……
这是黑Golang的帖子?用法问题,slice作为语言原语,不提供特定简便操作是有原因的,如果你想深究的话。
引用来自“lixin3811”的答案这是黑Golang的帖子?用法问题,slice作为语言原语,不提供特定简便操作是有原因的,如果你想深究的话。黑个毛,是我被黑,妹滴上来就爆粗话,这人太木有素质咧
同情且赞同博主,哪条路上还没有狂吠的狗呢,忽略它就是。
引用来自“宏哥”的答案 你被Google 这个 Gay 给Rape了
有python 你不用
偏要舔 Google的pussy
Google跟你是有多大的仇恨啊?Python这种解释性的动态脚本语言,跟编译性的语言还是有很多差别的,有些地方适合,有些地方不适合!
slice是一个指针,底层是一个数组,它有容量大小
你每次读的时候,会把slice填满,最后一次读的时候才是填不满的,但已填的数据不会擦除,还有,至少需要循环(我相信你那么做了)
比如网页有50个字节,你slice定义容量为20,第一次read,拿到1到20,第二次read,拿到21到40,重点来了,第三次read的时候,只拿到41到50,所以slice里前10个空间被改写,而slice后10个空间还是31到40的内容
所以你write的时候前几次循环都对,最后一次会把一些垃圾也一起write,导致页面错误
返回值n会告诉你成功写入了多少字到slice,应该是20,20,10,而被你忽略的err会告诉你有什么错误和是否到文件结尾了
有人觉得go麻烦,不如别的语言方便,只是因为你用了更底层的工具,我完全可以写一个方法来封装它,一句命令搞定所有事,初学者只要用而不用关心底层实现,这是windows哲学
别的语言因为发展早,已经封装了很多功能进去,所以觉得特别好用,暂不评论
引用来自“waynehu”的答案 slice是一个指针,底层是一个数组,它有容量大小
你每次读的时候,会把slice填满,最后一次读的时候才是填不满的,但已填的数据不会擦除,还有,至少需要循环(我相信你那么做了)
比如网页有50个字节,你slice定义容量为20,第一次read,拿到1到20,第二次read,拿到21到40,重点来了,第三次read的时候,只拿到41到50,所以slice里前10个空间被改写,而slice后10个空间还是31到40的内容
所以你write的时候前几次循环都对,最后一次会把一些垃圾也一起write,导致页面错误
返回值n会告诉你成功写入了多少字到slice,应该是20,20,10,而被你忽略的err会告诉你有什么错误和是否到文件结尾了
有人觉得go麻烦,不如别的语言方便,只是因为你用了更底层的工具,我完全可以写一个方法来封装它,一句命令搞定所有事,初学者只要用而不用关心底层实现,这是windows哲学
别的语言因为发展早,已经封装了很多功能进去,所以觉得特别好用,暂不评论
我最后一次是用了[:n]的,只是前面的没有用,实际上go没有明确规定必须填满容量,我记得有的是不满就会返回错误,但是这个还真不会返回错误。
因为和本地文件不同,这个还要看网络情况的。为什么我们要使用Go语言以及如何使用它的
我们SoundCloud是一个使用多种编程语言的公司,虽然我们的技术架构最外层一直使用的是Ruby on Rails,但是在后端,各种各样的编程语言都有涉及。在这里我想多讲一下为什么要使用和如何使用Go语言这样一种开源的、刚刚发布其1.0版本的编程语言的。
在我们的公司里,所有的技术人员都是全能选手,而不是专才,这是根植于公司基因文化里的特征。我们希望每个人都能对公司的基础架构中每一部分都至少有相当的了解。更进一步,我们鼓励技术人员在个开发团队间调换,甚至组成新的团队,使成员跟各团队的冲突和摩擦尽量减少。在这样一种代码共产共有的环境中,非常需要一种表达性强,效率高的语言来降低实施的困难,Go语言证明了它是一种非常适合的语言。
我们已经有好几个程序员都把描述为是一种所见即所得(WYSIWYG)的编程语言。这是说,代码要做的事和它在字面上表达的意思是完全一致的。这种特征对于使软件无歧义和可维护有着巨大的帮助。Go语言明确的拒绝“helper”习惯用法以及诸如、操作符重载、缺省参数、甚至异常等特征,基本上,这些特征相较于能产生更丰富的表达,它们的歧义性会带来更大的问题。不否认,这样的策略会带来更多的键盘敲击——尤其是,正如大多数参与Go语言项目的新手程序员痛斥的,在异常处理时最麻烦——但是,换来的报答是,还是这些新手程序员,他们能轻易的、迅速的将应用在脑海里形成一个完整的模型。我可以很有信心的告诉大家,从项目开始到提交代码,Go是我们使用过的效率最高的语言。
Go语言严格的结构原则和它的“一种事情有且只有一种方法完成”的思想意味着我们无需在风格问题上纠缠不休。在针对Go语言程序的代码审查上,审查会变得更针对问题,而不是针对语言上的错综复杂,这是每个人都愿意看到的。
更值得一提的是,一旦一个程序员对有了一个基本掌握,你会发现他们的关注点能非常自然的从“应用目前应该怎样运行”过度到“应用在理想状况下应该如何的运行”。是否是后台的响应缓慢致使整个请求失败?是否应该只重试一次,不成功就只提供部分的结果?浏览器表现异常,我们是否要设置一个250毫秒的超时限制?系统中任何一个外层的行为场景都能用一种直接的、理想化的实现来表示,不需要类库或框架的支持。去掉抽象层降低了复杂性;直白陈述式、简单的代码是更好的代码。
Go语言还有其它一些非常好的特征,让我们受益不少。静态类型和快速编译使我们能够在开发过程中做几乎实时的静态检查和单元测试。这也意味我们开发的基于Go语言的系统中的编译,测试和发布几乎是一起完成的。
事实上,快速的编译,快速的测试,快速的相互审查和快速的部署意味着你的一些想法能在一个小时内从白板上的设计变成产品中可运行的程序。例如,Next软件中的搜索基本功能是由驱动的,但是它接受SoundCloud的管理和交换几乎全部是Go服务来完成。在验证过程中,我们认识的,我们需要一种能在某个特殊环境中把索引标志为只读状态的方法,需要索引系统能知道并顺从这种状态。在代码中加入抽象层,开发一个新的入口点正确的检测这种状态,修改跟索引相关的行为,为它们写测试代码,这一切只用了半个下午的时间。晚上时,这些修改已经部署并运行了好几个小时了。这样的速度,尤其是对一种静态类型的,本地编译的语言,简直没得说了。
我说到了我们的编译和部署系统。它叫Bazooka,它被设计成一个平台,用来管理内部服务的部署。(我们很快就会把它开源;关注我们,不要走开!)我们曾通过一个情况复杂的网络环境升级,你可以把它当成一个巨大的、复杂的状态机,随时都有可能造成数据污染和相互竞争的状态。对于这种工作,Go语言是最自然的选择。Go语言很独特,它有天生的并行安全特征。Bazooka系统的开发人员能够分析出问题的复杂性而不需要使用那些复杂的辅助工具。Bazooka利用来协调它的共享状态,是世界上唯一一个开源实现软件(就我们所知)——它也是用Go语言开发的。
总之,我们在SoundCloud公司维护着都是用Go语言写成的十几种服务和十几种知识库。当有新的后台项目时,我慢慢的都会选择使用Go语言来完成。
你对使用Go语言解决真正问题和开发真正产品感兴趣吗?我们很乐意听到你的声音!
分享这篇文章:
扫一扫二维码分享:
你也许会喜欢这些文章:
[英文原文: ]
对于这篇文章,你的反应是:
You had mail.
Paul read it, so ask him what it said.
本作品采用进行许可。
备案信息:京ICP备号 &&京公网安备00号
感谢你的参与互动。主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
傻丫头和高科技产物小心翼翼的初恋
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:

我要回帖

更多关于 学会舍弃阅读答案 的文章

 

随机推荐