go语言重写所有java go语言const

GO语言中看到这样一串代码,换成java的话怎么写??case QImage::Format_RGB32:
case QImage::Format_ARGB32:
case QImage::Format_ARGB32_Premultiplied:
for(int i = 0; iheight; i)
{
const QRgb *pSrc = https://www.04ip.com/post/(QRgb *)image.constScanLine(i);
uchar *pDest = (uchar *)ret.scanLine(i);
for( int j = 0; jwidth; j)
{
pDest[j] = qGray(pSrc[j]);
}
}
break;
}
return ret;
}
Python开发者在转到Go语言之前需要了解什么?转载请参见文章末尾处的要求 。【感谢张佳伟(@ghosert)的热心翻译 。如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线 。】这是一篇(长)博文,介绍了我们在 Repustate 迁移大量 Python/Cython 代码到 Go 语言的经验 。如果你想了解整个故事,背景和所有的事情,请继续往下读 。如果你只是想了解 Python 开发者在一头扎进 Go 语言前需要了解什么,请点击一下链接:从Python迁移到Go的建议(TipsTricks) 背景在Repustate,我们完成过的最棒的技术成就之一是实现了阿拉伯语的情感分析 。阿拉伯语是一块难啃的硬骨头,因为它的词形变化相当复杂 。比起譬如英语,阿拉伯语的分词(将一个句子切分呈几个独立的单词)也更困难,因为阿拉伯语的单词本身还可能会包含空白字符(例如:“阿列夫”在一个单词里的位置) 。这也谈不上是泄密,Repustate 使用支持向量机(SVM)来获取一个句子背后最有可能的含义,并在其中加上情感元素 。总体上来说,我们使用了 22 种模型(22 个 SVM) 并且在一篇文档中,每一个单词我们都会加以分析 。因此如果你有一篇 500 字的文档,那么基于 SVM,会进行十万次的比较 。PythonRepustate 几乎完全就是一个 Python 商店 。我们使用 Django 来实现 API 和网站 。因此(目前)为了保持代码一致 , 同时使用 Python 来实现阿拉伯语情感引擎是合情合理的 。只是做原型和实现的话 , Python 是很好的选择 。它的表达能力很强悍,第三方类库等等也很好 。如果你就是为了Web服务,Python 很完美 。但是当你进行低级别的计算,大量依赖于哈希表(Python 里的字典类型)做比较的时候,一切都变慢了 。我们每秒能处理大约两到三个阿拉伯文档,但是这太慢了 。比较下来,我们的英语情感引擎每秒能处理大约五百份文档 。瓶颈因此我们开启了 Python 分析器,开始调查是什么地方用了那么长时间 。还记得我前面说过我们有 22 个 SVM 并且每个单词都需要经过处理吗?好吧,这些都是线性处理的,非并行处理 。所以我们的第一反应是把线性处理改成 map/reduce 那样的操作 。简单来说:Python 不太适合用作 map/reduce 。当你需要并发的时候,Python 算上好用 。在 2013 Python 大会上(译者:PyCon 2013),Guido 谈到了 Tulip,他的这个新项目正在弥补 Python 这方面的不足,不过得过段一段时间才能推出,但是如果已经有了更好用的东西,我们为什么还要等呢? 选Go 语言,还是回家算了?我在Mozilla的朋友告诉我,Mozilla 内部正在将他们大量的基础日志架构切换到 Go 语言上,部分原因是因为强大的 [goroutines] 。Go 语言是 Google 的人设计的,并且在设计之初就把支持并发作为第一要务,而不是像 Python 的各种解决方案那样是事后才加上去的 。因此我们开始着手把 Python 换成 Go 语言 。虽然Go 代码还不算正式上线的产品,但是结果非常令人鼓舞 。我们现在能做到每秒处理一千份文档 , 使用更少的内存 , 还不用调试你在 Python 里遇到:丑陋的多进程/gevent/“为什么 Control-C 杀不了进程”这些问题 。为什么我们喜欢 Go 语言任何人,对编程语言是如何工作(解释型 vs 编译型 , 动态语言 vs 静态语言)有一点理解的话 , 会说,“切,当然 Go 语言会更快” 。是的,我们也可以用 Java 把所有的东西重写一遍,也能看到类似更快的改善,但那不是 Go 语言胜出的原因 。你用 Go 写的代码好像就是对的 。我搞不清楚到底是怎么回事,但是一旦代码被编译了(编译速度很快),你就会觉得这代码能工作(不只是跑起来不会错,而且甚至逻辑上也是对的) 。我知道,这听上去不太靠谱,但是确实如此 。这和 Python 在冗余(或非冗余)方面非常类似,它把函数作为第一目标,因此函数编程会很容易想明白 。而且当然,go 线程和通道让你的生活更容易,你可以得到静态类型带来的性能大提升,还能更精细的控制内存分配,而你却不必为此在语言表达力上付出太多的代价 。希望能早点知道的事情(TipsTricks)除去所有这些赞美之词以后,有时你真的需要在处理 Go 代码的时候,相对于 Python,改变一下思维方式 。因此这是我在迁移代码时记录的笔记清单 —— 只是在我把 Python 代码转换到 Go 时从我脑子里随机冒出来的点子:没有内建的集合类型(必须使用map,并检查是否存在)因为没有集合,必须自己写交集,并集之类的方法没有tuples 类型,必须写你自己的结构,或者使用 slices (即数组)没有类似 \__getattr__() 的方法,你必须总是检查存在性,而不是设置默认值,例如,在 Python 里,你可以这样写 value = https://www.04ip.com/post/dict.get(“a_key”, “default_value”)必须总是检查错误(或者显式的忽略错误)不能有变量/包没被使用,因此简单的测试也需要有时注掉一些代码在[] byte 和 string 之间转换 。regexp 使用 [] byte (不可变) 。这是对的,但是老把一些变量转换来转换去很烦人Python 更宽松 。你可以使用超出范围的索引在字符串里取一个片段,而且不会出错 。你还可以用负数取出片段,但是 Go 不行你不能混合数据结构类型 。也许这样也不太干净,但是有时在 Python 里,我会使用值是混合了字符串和列表的字典 。但是 Go 不行 , 你不得不清理干净你的数据结构或者使用自定义的结构不能解包一个 tuple 或者 list 到几个不同的变量(例如:x, y, z = [1, 2, 3])驼峰式命名风格(如果你没有首字大写方法名/结构名 , 他们不会被暴露给其它的包) 。我更喜欢 Python 的小写字母加下划线命名风格 。必须显式检查是否有错误 != nil, 不像在 Python 里 , 许多类型可以像 bool 那样检查 (0, “”, None 都可以被解释成 “非” 集合)文档在一些模块上太散乱了,例如(crypto/md5),但是 IRC 上的 go-nuts 很好用 , 提供了巨大的帮助 。从数字到字符串的转换(int64 - string) 和 []byte - string (只要使用 string([]byte))不太一样 。需要使用 strconv 。阅读Go 代码比起 Python 那样写起来如伪代码的语言更像一门编程语言,Go 有更多的非字母数字字符 , 并且使用 || 和 , 而不是 “or”和“and”写一个文件的话,有 File.Write([]byte) 和 File.WriteString(string),这点和 Python 开发者的 Python 之道:“解决问题就一种方法 ”相违背 。修改字符串很困难,必须经常重排 fmt.Sprintf没有构造函数,因此惯用法是创建 NewType() 方法来返回你要的结构Else (或者 else if)必须正确格式化 , else 得和 if 配对的大括号在同一行 。奇怪 。赋值运算符取决于在函数内还是函数外,例如,= 和 :=如果我只想要“键”或者只想要 “值”,譬如: dict.keys() 或者 dict.values(),或者一个 tuples 的列表,例如:dict.items(),在 Go 语言里没有等价的东西,你只能自己枚举 map 来构造你的列表类型我有时使用一种习惯用法:构造一个值是函数的字典类型 , 我想通过给定的键值调用这些函数 , 你在 Go 里可以做到,但是所有的函数必须接受,返回相同的东西,例如:相同的方法签名如果你使用 JSON 并且 你的 JSON 是一个复合类型,恭喜你 。你必须构造自定义的结构匹配 JSON 块里的格式,然后把原始 JSON 解析到你自定义结构的实例中去 。比起 Python 世界里 object = json.loads(json_blob) 要做更多的工作 是不是值得?值得 , 一百万倍的值得 。速度的提升太多了,以致很难舍弃 。同时,我认为,Go 是目前趋势所在,因此在招新员工的时候,我认为把 Go 当作 Repustate 技术积累的重要一环会很有帮助 。]
如何看待哔哩哔哩用go语言重写所有的java后台工程抛开个人主观意见,让我们从法律的角度探讨下 。著作权法中,有个“著作权的合理使用”,也就是这些使用情况下,可以不受“专有权利”的限制,不构成侵权 。其中和这里探讨情况好像有点关系的是:1、个人使用 。为个人学习、研究或者欣赏 , 使用他人已经发表的作品;2、教学使用 。为学校课堂教学或者科学研究 , 翻译或少量复制已经发表的作品,供教学或科研人员使用,但不得出版发行 。
因此 , b站行为是否合法,需要从法律角度,看看是否符合以上两点 。由于翻译并上传确实是供大家学习使用 , 从主管故意上看,和以上第2条很接近 , 但如果要严格套用条文 , 又不是“学校课堂教学”,所以这个行为是否符合“著作权的合理使用”范畴,还需要专业法学人士一起来探讨 。
GO语言商业案例(十八):stream切换到新语言始终是一大步go语言重写所有java,尤其是当您的团队成员只有一个时有该语言的先前经验 。现在go语言重写所有java,Stream 的主要编程语言从 Python 切换到了 Go 。这篇文章将解释stream决定放弃 Python 并转向 Go 的一些原因 。
Go 非常快 。性能类似于 Java 或 C。对于用例go语言重写所有java,Go 通常比 Python 快 40 倍 。
对于许多应用程序来说,编程语言只是应用程序和数据库之间的粘合剂 。语言本身的性能通常并不重要 。然而,Stream 是一个API 提供商,为 700 家公司和超过 5 亿最终用户提供提要和聊天平台 。多年来 , 我们一直在优化 Cassandra、PostgreSQL、Redis 等,但最终,您会达到所使用语言的极限 。Python 是一门很棒的语言 , 但对于序列化/反序列化、排名和聚合等用例,它的性能相当缓慢 。我们经常遇到性能问题,Cassandra 需要 1 毫秒来检索数据,而 Python 会花费接下来的 10 毫秒将其转换为对象 。
看看我如何开始 Go 教程中的一小段 Go 代码 。(这是一个很棒的教程 , 也是学习 Go 的一个很好的起点 。)
如果您是 Go 新手,那么在阅读那个小代码片段时不会有太多让您感到惊讶的事情 。它展示了多个赋值、数据结构、指针、格式和一个内置的 HTTP 库 。当我第一次开始编程时,我一直喜欢使用 Python 更高级的功能 。Python 允许您在编写代码时获得相当的创意 。例如,您可以go语言重写所有java:
这些功能玩起来很有趣,但是,正如大多数程序员会同意的那样 , 在阅读别人的作品时,它们通常会使代码更难理解 。Go 迫使你坚持基础 。这使得阅读任何人的代码并立即了解发生了什么变得非常容易 。注意:当然,它实际上有多“容易”取决于您的用例 。如果你想创建一个基本的 CRUD API,我仍然推荐 DjangoDRF或 Rails 。
作为一门语言 , Go 试图让事情变得简单 。它没有引入许多新概念 。重点是创建一种非常快速且易于使用的简单语言 。它唯一具有创新性的领域是 goroutine 和通道 。(100% 正确CSP的概念始于 1977 年,所以这项创新更多是对旧思想的一种新方法 。)Goroutines 是 Go 的轻量级线程方法 , 通道是 goroutines 之间通信的首选方式 。Goroutines 的创建非常便宜,并且只需要几 KB 的额外内存 。因为 Goroutine 非常轻量 , 所以有可能同时运行数百甚至数千个 。您可以使用通道在 goroutine 之间进行通信 。Go 运行时处理所有复杂性 。goroutines 和基于通道的并发方法使得使用所有可用的 CPU 内核和处理并发 IO 变得非常容易——所有这些都不会使开发复杂化 。与 Python/Java 相比,在 goroutine 上运行函数需要最少的样板代码 。您只需在函数调用前加上关键字“go”:
Go 的并发方法很容易使用 。与 Node 相比,这是一种有趣的方法,开发人员必须密切关注异步代码的处理方式 。Go 中并发的另一个重要方面是竞争检测器 。这样可以很容易地确定异步代码中是否存在任何竞争条件 。
我们目前用 Go 编写的最大的微服务编译需要 4 秒 。与以编译速度慢而闻名的 Java 和 C等语言相比,Go 的快速编译时间是一项重大的生产力胜利 。我喜欢在程序编译的时候摸鱼,但在我还记得代码应该做什么的同时完成事情会更好 。
首先,让我们从显而易见的开始:与 C和 Java 等旧语言相比,Go 开发人员的数量并不多 。根据StackOverflow的数据,38%的开发人员知道 Java,19.3%的人知道 C,只有4.6%的人知道 Go 。GitHub 数据显示了类似的趋势:Go 比 Erlang、Scala 和 Elixir 等语言使用更广泛,但不如 Java 和 C流行 。幸运的是 , Go 是一种非常简单易学的语言 。它提供了您需要的基本功能 , 仅此而已 。它引入的新概念是“延迟”声明和内置的并发管理与“goroutines”和通道 。(对于纯粹主义者来说:Go 并不是第一种实现这些概念的语言,只是第一种使它们流行起来的语言 。)任何加入团队的 Python、Elixir、C、Scala 或 Java 开发人员都可以在一个月内在 Go 上发挥作用,因为它的简单性 。与许多其go语言重写所有java他语言相比 , 我们发现组建 Go 开发人员团队更容易 。如果您在博尔德和阿姆斯特丹等竞争激烈的生态系统中招聘人员 , 这是一项重要的优势 。
对于我们这样规模的团队(约 20 人)来说,生态系统很重要 。如果您必须重新发明每一个小功能,您根本无法为您的客户创造价值 。Go 对我们使用的工具有很好的支持 。实体库已经可用于 Redis、RabbitMQ、PostgreSQL、模板解析、任务调度、表达式解析和 RocksDB 。与 Rust 或 Elixir 等其他较新的语言相比 , Go 的生态系统是一个重大胜利 。它当然不如 Java、Python 或 Node 之类的语言好,但它很可靠,而且对于许多基本需求 , 你会发现已经有高质量的包可用 。
Gofmt 是一个很棒的命令行实用程序,内置在 Go 编译器中,用于格式化代码 。就功能而言,它与 Python 的 autopep8 非常相似 。我们大多数人并不真正喜欢争论制表符与空格 。格式的一致性很重要 , 但实际的格式标准并不那么重要 。Gofmt 通过使用一种正式的方式来格式化您的代码来避免所有这些讨论 。
Go 对协议缓冲区和 gRPC 具有一流的支持 。这两个工具非常适合构建需要通过 RPC 通信的微服务 。您只需要编写一个清单,在其中定义可以进行的 RPC 调用以及它们采用的参数 。然后从这个清单中自动生成服务器和客户端代码 。生成的代码既快速又具有非常小的网络占用空间并且易于使用 。从同一个清单中,您甚至可以为许多不同的语言生成客户端代码,例如 C、Java、Python 和 Ruby 。因此,内部流量不再有模棱两可的 REST 端点 , 您每次都必须编写几乎相同的客户端和服务器代码 。.
Go 没有像 Rails 用于 Ruby、Django 用于 Python 或 Laravel 用于 PHP 那样的单一主导框架 。这是 Go 社区内激烈争论的话题,因为许多人主张你不应该一开始就使用框架 。我完全同意这对于某些用例是正确的 。但是,如果有人想构建一个简单的 CRUD API,他们将更容易使用 Django/DJRF、Rails Laravel 或Phoenix 。对于 Stream 的用例,我们更喜欢不使用框架 。然而,对于许多希望提供简单 CRUD API 的新项目来说,缺乏主导框架将是一个严重的劣势 。
Go 通过简单地从函数返回错误并期望调用代码来处理错误(或将其返回到调用堆栈)来处理错误 。虽然这种方法有效,但很容易失去问题的范围,以确保您可以向用户提供有意义的错误 。错误包通过允许您向错误添加上下文和堆栈跟踪来解决此问题 。另一个问题是很容易忘记处理错误 。像 errcheck 和 megacheck 这样的静态分析工具可以方便地避免犯这些错误 。虽然这些变通办法效果很好,但感觉不太对劲 。您希望该语言支持正确的错误处理 。
Go 的包管理绝不是完美的 。默认情况下 , 它无法指定特定版本的依赖项,也无法创建可重现的构建 。Python、Node 和 Ruby 都有更好的包管理系统 。但是,使用正确的工具 , Go 的包管理工作得很好 。您可以使用Dep来管理您的依赖项,以允许指定和固定版本 。除此之外,我们还贡献了一个名为的开源工具VirtualGo,它可以更轻松地处理用 Go 编写的多个项目 。
我们进行的一个有趣的实验是在 Python 中使用我们的排名提要功能并在 Go 中重写它 。看看这个排名方法的例子:
Python 和 Go 代码都需要执行以下操作来支持这种排名方法:
开发 Python 版本的排名代码大约花了 3 天时间 。这包括编写代码、单元测试和文档 。接下来,我们花了大约 2 周的时间优化代码 。其中一项优化是将分数表达式 (simple_gauss(time)*popularity) 转换为抽象语法树. 我们还实现了缓存逻辑,可以在未来的特定时间预先计算分数 。相比之下,开发此代码的 Go 版本大约需要 4 天时间 。性能不需要任何进一步的优化 。因此,虽然 Python 的最初开发速度更快 , 但基于 Go 的版本最终需要我们团队的工作量大大减少 。另外一个好处是,Go 代码的执行速度比我们高度优化的 Python 代码快大约 40 倍 。现在,这只是我们通过切换到 Go 体验到的性能提升的一个示例 。
与 Python 相比,我们系统的其他一些组件在 Go 中构建所需的时间要多得多 。作为一个总体趋势,我们看到开发Go 代码需要更多的努力 。但是,我们花更少的时间优化代码以提高性能 。
我们评估的另一种语言是Elixir. 。Elixir 建立在 Erlang 虚拟机之上 。这是一种迷人的语言,我们之所以考虑它,是因为我们的一名团队成员在 Erlang 方面拥有丰富的经验 。对于我们的用例 , 我们注意到 Go 的原始性能要好得多 。Go 和 Elixir 都可以很好地服务数千个并发请求 。但是 , 如果您查看单个请求的性能 , Go 对于我们的用例来说要快得多 。我们选择 Go 而不是 Elixir 的另一个原因是生态系统 。对于我们需要的组件,Go 有更成熟的库,而在许多情况下,Elixir 库还没有准备好用于生产环境 。培训/寻找开发人员使用 Elixir 也更加困难 。这些原因使天平向 Go 倾斜 。Elixir 的 Phoenix 框架看起来很棒,绝对值得一看 。
Go 是一种非常高性能的语言 , 对并发有很好的支持 。它几乎与 C和 Java 等语言一样快 。虽然与 Python 或 Ruby 相比,使用 Go 构建东西确实需要更多时间,但您将节省大量用于优化代码的时间 。我们在Stream有一个小型开发团队,为超过 5 亿最终用户提供动力和聊天 。Go 结合了强大的生态系统、新开发人员的轻松入门、快速的性能、对并发的可靠支持和高效的编程环境,使其成为一个不错的选择 。Stream 仍然在我们的仪表板、站点和机器学习中利用 Python 来提供个性化的订阅源. 我们不会很快与 Python 说再见,但今后所有性能密集型代码都将使用 Go 编写 。我们新的聊天 API也完全用 Go 编写 。
为什么许多原本的 Java 项目都试图用 go 进行重写开源?项目推倒重构是项目开发大忌,一方面我们要尽量避免做项目推倒重构,尽量在前期就规划好,另一方面,我们又希望项目能常做小重构,这对项目可持续性开发是很有帮助的 。而语言的重构,把Java项目用Go语言重写一遍,无疑是一次重大的推倒重来 。
一、Go语言的优势在哪里
Go语言领先于Java的最大优势,就在于快 。Go语言会被编译成机器代码,直接执行;Java语言则使用JVM运行其代码,这比Go语言要慢了很多 。另外,Java语言的内存管理,相比于Go语言,也复杂得多 , 而内存管理,不管对于程序运行,还是对程序员的开发 , 都极为重要 。最后,Go语言没有引用只有指针,这比Java语言处处引用,又领先了一个身位 。
二、Go语言为什么更适合开源
开源 , 也就是开放源代码 , 最大的好处在于,可以利用全世界的程序员资源,来帮助你完善你的产品,开发新需求,或者修复产品BUG 。这对产品的可持续发展,是非常有帮助的,很多企业纷纷将自己的产品开源,其实就是这个道理 。而Go语言更易学,更易避错 , 更易阅读等特点,就决定了它更适合用来做开源项目 。
三、Java语言的优势
Java语言是目前软件开发中使用率最广泛,也是最重要的程序之一,它的地位,绝对不是目前Go语言可以比拟的 。Java在WEB应用的开发中,有着很重要的地位 。但是,Java语言相对复杂的并发设计,相当庞大的项目体系,使其在开发、测试阶段都略为复杂,在某些方面已经逐步落后于其他语言 。
【go语言重写所有java go语言const】go语言重写所有java的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于go语言const、go语言重写所有java的信息别忘了在本站进行查找喔 。

    推荐阅读