go语言入门指导

半年前的秋招,我拿到了一家公司的offer,当时加了mentor的微信,他告诉我公司开发用的是go,当时我还完全不会go,于是想着趁正式实习之前,先自己学学。

自己学的时候,没有人指导,也没有制定什么计划,就是借了几本书看,敲了敲书上的代码,当时觉得只是换了一种语法,没什么难的。

一个月以后,三方签好了,就进公司实习了,刚开始看代码感觉没什么问题,但是到了实际开发的时候问题就来了,怎么让项目代码跑起来,程序需要一大堆包怎么办,怎么调试,怎么保证代码不崩溃?

我想说的是,如果在开始学习的时候,如果就能够关注一些细节,比如包引用是怎么回事儿,go的运行环境是怎么样的,后面就可以避免很多问题。

所以在这篇文章中,我想给出我的一些建议,希望能帮助大家能在开始学习的阶段,搞明白一些事,少踩一些坑。

学习的话其实可以分为两部分,一部分是看书学语法,另一部分是实际操作,所以我先推荐一些书。

推荐书目

1.The Go Programming Language

这个应该算是公认的最经典的go语言教材了,有中文版,教材本身是开源的,所以网上也是有正规获取途径的(go语言圣经),当然如果你喜欢看纸质书,也是有的,就是下面这本。

2.go in practice(go语言实战)

这个是我最开始看过的一本书,后来在网上也看到有很多人推荐,在我学习协程和管道的时候,看了这本书上的几个例子,觉得很有帮助,所以推荐大家和上面那本一起看,当你看The Go Programming Language的某些内容觉得过于枯燥的时候,可以看看这本书上对应知识点给的例子。

3.effective go

很多人看过effective C++或者effective java,effective go这本我个人感觉不太一样,这本书很短只有60几页,而且更像是知识点的总结或者一些提示。我建议是在有一定的基础之后再看这个。effective go也是开源的,可以在网上直接看(effective go)。

实际操作

实际操作,我打算从go的安装,ide的使用开始说起。相关的安装教程网上有很多,但是基本上是一步一步教你怎么安装,并没有讲解一些配置的实际含义,而这些含义,我认为在最开始就弄明白是很重要的。

1.go的安装

学生在学习的时候,大多用的是windows系统,而到了公司一般会用mac,如果实际部署go的服务,又会用linux,所以这三种我都说一说。

windows

在windows上安装是通过安装包的方式,具体步骤可以参考win10安装go环境,我想说的其中几个具体的配置:

  • 安装过程中选择安装目录时,选择的路径不要带中文名,我推荐就是直接装正在非系统盘下,例如D:\Go这样,安装之后,所有的go基础包都会在这个文件夹里,go命令本身也在这个文件夹里,总之就是一切关于go的东西都在这里。
  • 配置环境变量时,GOROOT就是你的go安装目录,这里就是告诉系统你的go放在了哪里
  • path里新增的%GOROOT%\bin,就是go命令的路径,go命令这个描述我感觉不太专业,举几个例子帮助理解一下,如果你想运行一个go文件,就是执行go run example.go,如果你想将go文件编译成一个二进制文件,就是go build -o example example.go,恩,这就是go命令。。。如果不配置path,这些命令你只能cd到%GOROOT%\bin下才能执行,否则会告诉你“go不是内部或外部命令,也不是可运行的程序”,配置了path之后,你就可以在任意路径下使用go命令了。
  • 最后,GOPATH,这是个重要的东西,首先,这个跟GOROOT是区分开的,也就是说跟你的go放在哪了没关系,其次,这个路径里也不要带中文,最后,建议将其设为你常用的放程序的文件夹,例如你平时的程序放在E盘这里,那你就在E盘下新建一个叫go的文件夹,然后将GOPATH配置为E:\go,再说一遍,这个配置很重要,如果你只是写一写简单的程序,比如hello world,那GOPATH怎么配都没关系,但如果你要运行一个大项目,或者引用一些第三方的包,这个GOPATH就有用了,具体的,我后面会再细讲。

安装之后,在cmd输入go env测试一下,看看你的环境变量是不是都配置成功了。

macos&linux

在max和linux上,都不需要安装过程,直接下载go包,然后配置环境变量就好了。我之前写过一篇ubuntu1604安装go1.13,对于mac也适用,里面也解释了一遍GOROOT和GOPATH,所以在本文就不单独再写一遍了。

2.ide的使用

ide的话,公司有些人用xcode,我没有用过,我从开始学go,到进公司,用的都是goland。goland是jetbrains公司出的,idea和pycharm这些很常用的ide也都是他家的,所以,理论上应该是不错的,我自己用着也确实觉得不错,另外goland自带markdown、js、shell这些语言的插件,用着很方便,所以推荐大家用goland。如果是学生的话,直接申请个学生账号登录就可以免费使用,公司的话一般会买证书服务器,所以也不用为正版的问题发愁~

配置GOPATH和GOROOT

goland的安装正常装就好了。goland第一次使用,需要配置一下,也就是告诉goland,GOROOT和GOPATH。

点击file->settings。

设置GOROOT,选择你的go安装目录即可。

设置GOPATH,把下面那个use GOPATH that's defined in system environment勾上,Global GOPATH那里就自动会添加你在环境变量里设置的GOPATH。Project GOPATH建议不要添加,用不好会搞乱。

新建项目

打开goland之后不能凭空开始写程序,要么你打开一个项目,要么就自己新建一个,作为初学者,刚装上goland,肯定是新建一个项目了。

新建项目也是有讲究的,我的建议是,在GOPATH下,新建一个src文件夹,然后所有的项目都建在这个文件夹里。

首先,我们建一个study项目,在Location那里输入E:\Go\src\study就可以了,goland会为你新建这个叫study的文件夹,并将一些项目文件放在里面。下面的Index entire GOPATH要勾上,这样新建项目以后,GOPATH里的东西我们就都能看到了。为什么要看GOPATH里的东西?因为第三方的包都是在放在GOPATH里。

点击create之后,项目是这样的。

注意左侧的Project栏,里面有一个叫study的文件夹,那个就是我们的项目,文件夹,现在还是空的。study文件夹下面是External Libraries ,也就是外部包,包括Go SDK里面的go自己的包,和GOPATH里面第三方的包,每个包的源码我们都是直接可以在goland里直接打开的,这一点还是很方便的。

hello world

项目创建好以后,就可以写程序了,按照国际惯例,我们先写一个hello world。

首先右键study文件夹,创建一个go文件,文件名随意,我想强调的是,不是一定叫main.go

 我新建了一个叫hello.go的文件。

注意新建这个hello.go之后,第一行自动出来一个package study,这里简单解释一下:所有的go程序都要写在包(package)里,所以每个go文件的第一行一定是package XXX,通常你的项目叫什么,这个项目里的go文件所在的包就是什么,换句话说就是,我们新建了一个叫study的项目,实际就是写了一个study包,当然,项目名和包名之间并无关系,只是因为每个go文件一定要有package这行,所以goland默认给你的文件加了这行,名字就用了你的项目名字,这个是完全可以改的,事实上一个项目里可以有很多个包,并不是一定要把所有程序写进一个包里,可以根据功能分成多个包。

如果你这个项目写出来,只是作为一个包,让其他项目去用的,那么你这个项目可以不需要main包,包名想怎么起怎么起,但如果你这个项目要独立运行,那一定要有一个main包

我们写这个例子肯定是想让它能够独立运行的,所有要把包名改成main。下面直接给出hello world程序。

package main

import "fmt"

func main()  {
	fmt.Println("hello world!")
}

go的函数定义方式和其他语言是略有不同的,初学者可能需要适应一下,但相同的是,程序是从main函数开始执行的。

程序里我们使用的是fmt.Println()这个函数实现的打印,这个就类似C里的printf,程序前面有一行import "fmt",这是引入了一个叫fmt的包,这个包是GO SDK里的,这个就类似C我们要用printf,需要#include<stdio>。其他具体原理的先不讲,先说怎么让这个程序跑起来。

两种方法,第一种,直接go命令。

在goland下方,我们可以打开terminal。

terminal默认是CMD.exe,就是说这个时候你在terminal里面输入,跟你在CMD里是一样的。对于程序员来说,CMD这个东西是非常之难用的,所以强烈建议,把terminal换成git bash,切换方式也很简单,打开file->settings,然后在这里把原本的CMD.exe改成git bash就行了。

什么,你的电脑上还没有git?那劝你赶快装一个,这年头哪个程序员不用git啊。。。如果你实在不想装,那我劝你,直接跳过terminal这段吧。。。

言归正传,改成git bash之后,你的terminal就变成了这样。

下面就开始用go命令运行这个hello.go,命令很简单,go run hello.go,效果如下:

执行go run实际是先完成编译,然后再运行的。我们也可以先编译出一个二进制文件,然后直接运行这个二进制文件。编译命令也很简单,go build -o hello hello.go,效果如下:

编译生成的二进制文件就在你的当前路径下,也就是说,你的study文件夹里现在有一个叫hello的文件。

直接使用命令就先说到这里,既然我们用了goland这个功能强大的ide,自然是不希望靠命令去让程序跑起来,所以下面就说一说,如何通过简单的配置,一键就让程序跑起来。

首先,在goland的右上角,有一个Add Configuration,右边还有我们熟悉的运行按钮和调试按钮,可惜还是灰的,用不了。。。别着急,配置一加,就能用了。点击Add Configuration。

然后,选择Go Build。go build,这不是我们刚才编译用的命令吗?是没错,我们要加的配置,实现的就是先go build编译出一个二进制文件,然后再运行它。

点了Go Build之后,右边会出现一大坨配置项,莫慌,很好配,我先直接给一个配好以后的截图。

你会发现,实际上只需要改红框圈起来那两个地方,第一个地方,是选择你编译的源文件,也就是hello.go,第二个地方,就是编译之后得到的二进制文件放在哪,我们就把它放在当前文件夹就好了。其他地方为什么不配?因为我们就一个文件,用不着。。。实际的项目编译需要加各种选项,还需要配置环境变量,那时候就会用到其他的配置项了。

欧克,配完图里面那两项之后,点击OK,这个时候,你就发现右上角的执行按钮和调试按钮都变绿了,也就是可以用了~

我们点击一下运行按钮,看看效果。

恩,自然是不会有问题了。

至于调试功能,就是那个虫子按钮,实际过程还是很常用的,我专门写过一篇goland本地调试,如果你学习过程中遇到了问题想调试一番,可以看一看。

欧克,到这里,你已经知道如何在本地的goland上运行自己的程序了,接下来你就可以看我推荐的那些书,学一学包括数据类型啊,流程控制啊,还有协程管道这些东西,学习的过程中你可能会用一些GO SDK中的包,那些都是没有问题的,你再次遇到问题,应该就是使用第三方包的时候了,所以下面说一下第三方包的使用。

使用第三方包

实际开发过程中,第三方包是非常常用的,一方面,公司里会自己写一些基础包,给所有的项目用,另一方面,github有一些非常好的开源包,比如mysql的包这种,也是我们会用到的,所以,会用第三方包非常重要。

我们学习的时候通常还没进公司,所以更早接触到的应该是github上的包,所以先从使用github上的包说起。

github上的东西一般是这样的:

github.com/用户名或公司名/项目名

为了简单,我用我自己写的一个包为例,献丑了。。。

首先,这是我自己写的一个日志包,url是github.com/djq8888/goLog

怎么使用这个包呢?首先,在你的GOPATH/src下新建github.com文件夹,然后,在github.com文件夹里面新建djq8888文件夹,然后进入这个文件夹。这个用户名太沙雕了,是我还不懂事的时候起的。。。

言归正传,进入djq8888文件夹之后,把这个仓库clone下来。

git clone https://github.com/djq8888/goLog.git

等下载完就可以了。

然后回到goland里,导入这个包,打印个日志,这里就接着用上面的hello.go了。

package main

import "fmt"
import "github.com/djq8888/goLog"

func main()  {
	fmt.Println("hello world!")
	goLog.Init(0,true,0)
	goLog.LogInfo("test using package from github.")
	goLog.Wait()
}

注意那行包的导入import "github.com/djq8888/goLog",而个包的绝对路径是GOPATH/src/github.com/djq8888/goLog,思考一下,是不是发现了什么?是没错!go除了会去GOROOT/src路径下找GO SDK里的包,还会去GOPATH/src路径下找其他的包,因此,第三方的包,你就放在GOPATH/src路径下,import的时候加上对GOPATH/src的相对路径就可以了~

欧克,下面我们运行一下程序。你会发现,study下面新建了一个log文件夹,log文件夹里面新建了一个日志文件,里面还写入了我们打印的日志,而且,时间,时间戳,调用文件,调用函数,调用行数,一应俱全!恩,这段和新手入门指导无关,单纯的自夸一下,哈哈。

error处理

最后,我想简单提一下这个,不是为了教大家如何进行error处理,而是想提醒大家,一定要做好错误处理

刚进公司写的程序,给mentor review的时候,他轻松指出了我程序中n个可能panic的点,令我颜面扫地。。。

go的很多函数,包括类型转换,实际上都是有返回值的,而返回值是包含error信息的,新手最大的问题就是,想当然的认为所有函数、所有类型转换都会成功,因此不去处理返回的error,这样写出来的程序,放到生产环境,那将是致命的,当然了,在公司会有人review你的代码,所以并不会出现什么问题,只会让你颜面扫地而已。。。

所以,还是希望初学者,从开始学习,就养成良好的习惯,严格要求自己,写高质量的代码!

发布了39 篇原创文章 · 获赞 25 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/u013536232/article/details/104840735