go语言实用工具编写要这样学
写作目的
本篇章写作有以下目的:
- 介绍go语言的基础知识,这里你会发现go语言学习成本较低,与python语言相似。
- 介绍go语言的常用标准库,这里你会发现go语言的标准库已经非常强大,python语言要达到类似效果需要其他第三方库的参与。
- 介绍go语言的实用工具编写,事实上go语言在工具编写方面,不逊色于python,如文本文件处理等,学习成本和python类似,而在Linux运维领域更有着python无法比拟的优势。
为了介绍go语言的基础知识,博主会穿插leetcode方面的题目,帮助大家去练习。
为啥要和python做比较
近几年,如果你刷新闻或者微信,你肯定会看到python语言学习网课广告;这些网课或告诉你python语言能快速处理EXCEL文档,或告诉你通过python能入门机器学习和数据分析,当然这些网课有点像保健品那样作用有但是有限;另外python语言在某些领域的强大甚至早已加入经济或管理等文科专业的专业课中,注意不是理工科。作为一个博主,我想蹭下python语言的流量,抢点python语言的热度,同时让没有学习过go语言的人有点概念:go语言和python一样能快速入门,并且实用敏捷。
go语言的强大之处
在说明go语言相比于python语言的优点前,我需要先叠个甲,我的求生欲一向比较强的。这里并不要说明go语言比python语言更好更优,作为一个工具,它们有各自的擅长的领域,就像敲钉子需要榔头,拧螺丝需要螺丝刀。同时,在同一个领域内也有能用和好用的比较,如斧头和电锯之于砍树。
绝大多数情况下go语言能够通过静态编译快速构建二进制程序,即程序只需在编译机器上编译,在目标机器上无需依赖运行,这种特性博主称为“即插即用”;而python语言需要在目标机器上安装python环境,另需要使用pip来管理依赖。另外,在需要内外网隔离的公司内,python语言在没法联网的情况下会变得难以使用,而go语言在这种情况下只要能通过某种方法把代码下载到内网就可以编写和使用。此外,go语言在并发方面比python语言更为好用,处理效率更高。当然在本篇章中你暂时还看不到go语言并发的威力,这个知识将在go语言扩展篇中和go-etl项目讲述。
go语言的实用工具编写
从上面的论述中,我们不难发现go语言在编写诸如文本(Excel)处理,文件处理的实用工具会比python语言更为好用,事实上go语言编写程序的便捷性也不输于python。例如读取csv文件的文本
package main
import (
"encoding/csv"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("a.csv")
if err != nil {
fmt.Println("open a.csv fail. err:", err)
return
}
defer f.Close()
r := csv.NewReader(f)
for {
record, err := r.Read()
if err == io.EOF {
return
}
if err != nil {
fmt.Println("read a.csv fail. err:", err)
return
}
fmt.Println(record)
}
}
而在运维领域,特别是Linux运维领域,go语言在这个领域的优势将更为巨大。你可以想象一下这样的场景,编写一个应用到数十台机器上的运维工具,在这种场景下即插即用的二进制程序显然比python脚本更容易部署,这也是Prometheus近几年在运维监控领域异军突起的原因。众所周知,现在主流Linux发行版本(如CentOS, Ubuntu ), 以Linux为基石的信创操作系统(如红旗,麒麟)已经在服务器领域中占绝大多数。
通过下面的例子,你就可以理解go在运维领域的实用性,这个程序博主称之为端口检测工具(telnet有着类似的功能,用于测试网络连通性)。
package main
import (
"fmt"
"net"
"os"
"time"
)
func main() {
if len(os.Args) != 3 {
fmt.Println("telnet ip port")
return
}
addr := os.Args[1] + ":" + os.Args[2]
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
if err != nil {
fmt.Println("connct to", addr, "fail. reason:", err)
return
}
conn.Close()
fmt.Println("connct to", conn.RemoteAddr(), "from", conn.LocalAddr(), "success")
}
通过go build命令将其构建成二进制程序telnet,如测试与百度网站的连通性(http默认端口为80,而https的默认端口为443), 测试与任意网络地址的连通性,注意这不是一个完整的telnet工具。
telnet www.baidu.com 80
connct to 180.101.50.242:80 from 1.1.1.1:56853 success
telnet www.baidu.com 443
connct to 180.101.50.242:443 from 1.1.1.1:56845 success
telnet 192.10.10.10 22
connct to 192.10.10.10:22 fail. reason: dial tcp 192.10.10.10:22: i/o timeout
写作内容
写作内容如下思维导图所示,这个思维导图借鉴了go圣经的学习顺序。

下一篇预告
《go语言环境要这样搭建才“省钱”》
go语言实用工具编写要这样学的更多相关文章
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- [Linux实用工具]munin-node插件配置和插件编写
前面介绍了2篇munin使用的相关文章: [Linux实用工具]Linux监控工具munin的安装和配置 [Linux实用工具]Linux监控工具munin的展示(Nginx) 这次介绍一下mun ...
- 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)
一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...
- 《从零开始学Swift》学习笔记(Day4)——用Playground工具编写Swift
Swift 2.0学习笔记(Day4)——用Playground工具编写Swift 原创文章,欢迎转载.转载请注明:关东升的博客 用Playground编写Swift代码目的是为了学习.测试算法.验证 ...
- 每位iOS开发人员不容错过的10大实用工具
内容简介 1.iOS简介 2.iOS开发十大实用工具之开发环境 3.iOS开发十大实用工具之图标设计 4.iOS开发十大实用工具之原型设计 5.iOS开发十大实用工具之演示工具 6.iOS开发十大实用 ...
- .Net 高效开发之不可错过的实用工具(转)
.Net 高效开发之不可错过的实用工具(转) 本文摘自: http://www.cnblogs.com/powertoolsteam/p/5240908.html#3372237 Visual Stu ...
- .NET 高效开发之不可错过的实用工具(第一的当然是ReSharper插件)
工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节 ...
- ServiceModel 元数据实用工具 (Svcutil.exe)
ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档 一.SvcUtil.exe ServiceModel 元数据实用工具可在 Windows ...
- 值得网页设计师&前端收藏的实用工具列表
原文地址:http://www.uisdc.com/tool-list-web-developers# 无论你是经验丰富的前端,还是刚刚起步的设计师,这些为真正的网页设计师和开发者所准备的实用工具.在 ...
- NET 高效开发之不可错过的实用工具(第一的当然是ReSharper插件)
工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节 ...
随机推荐
- 数据结构哈夫曼树(C语言版)
文章目录 一. 问题 需求分析 代码分析 结构体定义使用 建立哈夫曼树,首先需要找到两个权值最小的两个叶子结点,然后建树 哈夫曼编码(我采用的是从叶子结点-->根节点,所以实际是反过来的) 使用 ...
- 云原生时代崛起的编程语言Go常用标准库实战
@ 目录 基础标准库 简述 字符串-string 底层结构 函数 长度 格式化输出 模版-template text/template html/template 正则表达式-regexp 编码-en ...
- 2022-03-10:限制:0 <= start <= end,0 <= target <= 64。 [start,end]范围上的数字,有多少数字二进制中1的个数等于target。 真实面试题,被问
2022-03-10:限制:0 <= start <= end,0 <= target <= 64. [start,end]范围上的数字,有多少数字二进制中1的个数等于targ ...
- vue 版本查看
如何查看vue版本号? 方法1.全局查看vue版本号 npm info vue方法2.局部(当前项目)查vue版本号 npm list vue version方法3.此外还可以通过 package.j ...
- Luogu1772 [ZJOI2006] 物流运输
传送门 简化题意 给你 \(m\) 个码头,码头之间有双向边连接,\(n\) 天,其中一些码头在某些天会不可用,这 \(n\) 天都要有一条从 \(1\) 到 \(m\) 的路,每一次更换道路会需要 ...
- APP中RN页面热更新流程-ReactNative源码分析
平时使用WebStorm或VSCode对RN工程中的文件修改后,在键盘上按一下快捷cmd+s进行文件保存,此时当前调试的RN页面就会自动进行刷新,这是RN开发相比于原生开发一个很大的优点:热更新. 那 ...
- SpringMVC使用注解开发
1.编写web.xml(模板代码) 2.导入springmvc的context和mvc两个依赖,通过context标签可以自动扫描识别包"com.lian.controller"下 ...
- * daemon not running; starting now at tcp:5037
今日使用weeplus run android时 看错误提示 ,是5037端口的问题 * daemon not running; starting now at tcp:5037 于是找到查看端口的 ...
- 【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令
这个需求为控制智能家居工作,把控制智能家居的操作指令发到队列中,比如:扫地机.洗衣机到指定时间工作 一.什么是延迟队列? 延迟队列存储的对象是对应的延迟消息,所谓"延迟消息" ...
- JDK动态代理和CGLIB代理有什么区别
JDK动态代理和CGLIB代理都是实现Spring框架中AOP的代理方式,它们的实现原理和应用场景有所不同, 具体区别如下: 1. 实现原理: JDK动态代理是基于Java反射机制实现的,它要求目标类 ...