go语言实用工具编写要这样学

发布时间 2023-08-04 12:21:21作者: 我是水货

写作目的

本篇章写作有以下目的:

  1. 介绍go语言的基础知识,这里你会发现go语言学习成本较低,与python语言相似。
  2. 介绍go语言的常用标准库,这里你会发现go语言的标准库已经非常强大,python语言要达到类似效果需要其他第三方库的参与。
  3. 介绍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语言环境要这样搭建才“省钱”》