Tag: Golang

Golang:将推送通知发送到iOS设备

假设: 您的计算机中已安装Go语言 支持APNs的iOS示例应用程序用于测试 步骤1:生成证书PEM文件。 本文将帮助您生成PEM https://www.raywenderlich.com/123862/push-notifications-tutorial 步骤2:为APN安装Go库 去获取github.com/anachronistic/apns 步骤3:在main.go中编写以下函数。 将证书PEM文件放置在config文件夹中。 您可以根据需要更改推送URL。 func SendPushToClient(pushText string,pushToken string){ fmt.Println(“ SendPushToClient”) 有效负载:= apns.NewPayload() 有效负载。警报= pushText pn:= apns.NewPushNotification() pn.DeviceToken = pushToken pn.AddPayload(有效载荷) 客户端:= apns.NewClient(“ gateway.sandbox.push.apple.com:2195”,“ ./config/pushcert.pem”,“ ./config/pushcert.pem”) 响应:= client.Send(pn) 警报,_:= pn.PayloadString() fmt.Println(“ Alert:”,alert) fmt.Println(“ Success:”,分别为成功) fmt.Println(“错误:”,分别为错误) } 步骤4:从主函数调用“ SendPushToClient”函数。 在以下代码中替换客户端令牌 func main(){ SendPushToClient(“您好,来自APN”,“ ”) } 步骤5:编译并运行 去跑主 完整源代码main.go 包主 导入( […]

您了解Swift中的延期吗?

几周前,我开始研究Golang,因为在Axiom Zen中我们已经使用了很多,而且我意识到它还使用了与Swift中基本相同的defer语句。 有趣的是,当我学习堆叠延迟时,我不得不停下来问自己。 Swift中的输出是什么? func some() { for i in 0..<10 { defer { print(i) } } } 由于Golang的延迟使用了堆栈,因此Go中的输出为9,8,7 9, 8, 7, …, 0 。 斯威夫特呢? 好吧,斯威夫特打印0, 1, 2, …, 9 。 因此,Swift使用队列,对吗? 错误! Swift中的defer也使用堆栈,但是defer语句的工作方式是指当前作用域 ,即,它仅在示例中的for范围内进行延迟。 每次通过for循环时,都会弹出defer堆栈 ,这就是为什么它以升序打印数字的原因。 如果是: func someOther() { defer { print(“a”) } defer { print(“b”) } } 正如我所期望b, a那样b, a这将堆叠延迟并仅打印b, a […]

在C,Go和Swift中构建小型跨平台CLI工具

这就是我写一个简单工具的方式。3次,用不同的语言。 本实验 我的目标是编写一个非常简单的命令行工具,该工具可以生成与Google Authenticator兼容的一次性密码。 Google身份验证器使用基于时间的一次性密码算法(TOTP)生成代码。 我不想使用自己的实现,而是想使用现有的TOTP库,因为已经有很多不错的库。 本质上,我要我的工具要做的就是接受一个秘密作为单个输入,然后调用现有的TOTP库生成代码,并将生成的访问代码打印到标准输出中。 我问自己的问题是:假设我想在多个平台(Mac,Windows,Ubuntu)上使用该工具,并且希望 在少数人(不一定是技术人员)(例如同事)中分配工具,哪种编程语言将是最实用/可行/有趣的选择? 当然,您可以从多个角度看待这个问题。 让我们专注于构建和分发工具。 然后,这些是我的“应有”要求: 应该有可能将工具分发为“开箱即用”的单个可执行文件,这意味着用户不必安装运行时,框架,库等依赖项。 使用相同的代码库(但可能使用不同的工具链),应该可以为多个平台生成构建。 语言选择 我想为这个特定的实验创建一个二进制文件,这就是为什么我没有为此特定工具考虑诸如Node.js,Ruby和Python之类的解释语言的原因。 当然,尽管总的来说,这些语言都能为编写跨平台命令行工具提供完全可行的选择。 这些语言还有一个缺点,那就是最终用户需要安装运行时(例如Node.js)。 尽管许多平台都预先安装了常见的运行时,但是用户可能需要安装其他版本。 对于非技术用户而言,这并不总是一件琐碎的任务。 (我知道有一些工具可以将解释后的语言编译为独立的可执行文件,但这有点像在作弊) 。 最后,我的选择是尝试使用C , Go和Swift 。 我决定留在“编程语言舒适区”,因为学习一种新语言不是我实验的一部分。 因此,我没有尝试过(很有用)非常有趣的其他语言,例如Rust ,我将在以后尝试 (随时对您的Rust经验发表评论)。 也许还需要注意:在本实验中,我考虑了C ++的过大杀伤力(或者实际上,我的C ++ 只是缺乏知识)。 我学到的是 C 通常,使用C构建的可执行文件是动态链接的。 这意味着最终用户需要安装依赖项(链接的库)才能运行该工具。 那绝对不是理想的。 有很多解决方法,但是所有这些都有一些缺点: – 静态链接:创建单个二进制文件,其中将包含所有必需的二进制代码。 但是,这要求您使用的所有库(例如TOTP库)都支持静态链接。 绝对不是总是这样。 此外,Apple在Mac OS X上不支持静态链接的二进制文件。 – 将链接的动态库与您的应用程序一起分发 。 这意味着对于每个目标操作系统,您都必须预先构建所有链接的库,请确保可执行文件可以找到这些库(例如,在macOS上更改rpath),并将其与应用程序捆绑在一起。 换句话说,您需要将.dll (Windows) .dylib (macOS)或.so […]

anagram-go-java:Go和Java并排使用-​​旧的编码器回头看Java

昨天,我摸索了一个简单的面试问题。 这是我第一次使用coderpad.io(聪明的主意),也许是我第一次有人在编码时看着我的肩膀,而没有允许一两个StackOverflow。 面试官真的希望我用Java做到这一点,这让我感到不安,我已经使用Go编码了一段时间,并尝试使用Go进行编码。 我用注释将其伪编码出来,然后迅速间隔一下如何在Go中从字符串中获取该死的字符。 叹。 所以,我决定写这篇文章作为减轻自己对自己的失望的pen悔。 我现在正在为多种项目使用3种不同的语言:Go,Python和Swift(很好,Swift 3)。 老实说,我只是不保持这三个语法的全部一致性,我在编码时会进行很多模式匹配/复制/粘贴,并且很少再逐个关键字地将其键入。 我想,我上一次这样做是在1988-1992年的时间范围内使用Objective-C。 现在,当我使用这些微模式时,我的编码要好得多,并且在整个代码库中一切看起来都一样。 面试结束不到5分钟,我就可以使用Go版本了。 然后,今天早上,我以为,经过了这么多年,我又回过头去做同样的事情,被翻译成Java。 我猜想花了太长时间,但这让我想起了过去十年来我忘记了Java的东西,而我却忽略了它。 它也显示了一个有趣的案例,其中可以比较Go和Java,而Go表现得很好(IMHO)。 以及“ map:hashtable”一词; 它是“ Go:Java”,因此Go中的地图几乎是Java中的Hashtable。 恩比恩? 杰,好的。 测试数据: anagram(aab,aba)= true anagram(aab,cab)=否 anagram(aab,abdcefghijklmnopqrstuvwxyz)=否 //而且我知道,我知道(您是行家)符文**, //但他说,不,只是一个简单的字符串。 首先,我决定将字谜决定放到一个函子中。 // 走 func anagram(x,y string)bool { // Java public boolean anagram(String x,String y){ //’x’是第一个字符串 //’y’是第二个字符串 //如果它们是彼此的字母,则返回true //否则返回false。 我在两个特殊情况下进行了几次快速检查,以使例程短路:1)如果X等于Y(因此字符串相同),则返回true。 (在字谜的某些定义中,这可能并非严格正确 )。 2)如果两个字符串的长度不同,那么它们不是字谜,则返回false。 现在,在Go世界中,有两种方法可以声明map:hashtable ,其中键是字符串,值是整数。 但是基本思想是键/值存储库之一,将其作为键的值,然后当您通过键要求时将其取回。 (我记得Dictionary是Java的东西,不是吗?还是它一直是抽象类型?但是现在我知道Dictionary已过时了,请改用Map接口。) // […]