1. 学Java的时候遇到的问题
上大二的时候,我们开了面向对象的课程,用了Java语言。第一节课下来,老师让我们自己写一个类似Hello World的代码。当时我们用的是这样的一种方式:
- 首先编写一个Hello.java;
- 用javac命令编译成class文件;
- 用java命令运行class文件,观察输出。
当时所有的书上都有参考,看起来这也很简单,但是实际操作的时候却发现总是提示classpath的问题。
在当时jdk1.2的情况下,classpath算是初学者的一个拦路虎了。
刚学Go语言的时候很多书上也是讲了要首先写一个go文件,然后用go run命令把这个文件跑起来观察输出。
当然也可以首先build生成可执行文件然后执行可执行文件,这一切都很像Java,而且Go还有个参数,GOPATH,也是无比的像Java,让我又回忆起了很多年前的大学时光,回忆起了classpath这个拦路虎。
2. GOPATH
当时解决classpath问题无非也就是查询搜索引擎,但是我发现用eclipse能规避这个问题。其实eclipse这种IDE帮我们做了很多事情,然后让我们少学了不少应该学到的知识。
当我准备学Go的时候,选择了Goland作为IDE,新建工程的时候,发现工程被默认的放在了“/User/myname/go”下面,用go env命令观察,这个目录就是所谓的GOPATH。
也就是说,GOPATH是我们的工作区,所有的代码都可以在这里编写,Goland默认建立的awesomeProject就在这里。
现在来看看这段代码结构:
代码结构再来看看代码,首先看Hello.go:
package main
import "awesomeProject/day1"
func main() {
day1.SayHello()
}
再来看看hello_lib.go:
package day1
import "fmt"
func SayHello() {
fmt.Println("Hello, World!")
}
先说hello_lib.go,这个文件声明了一个包,这个包叫做day1,这里只有一个方法叫做SayHello,只会有一段简单的输出。
实际上这种文件叫做库源码文件,有点类似于Java的类,能够实现功能。说起Java了,就想起了Java的包,也可以通过import的方法引入到自己的代码中,然后利用引入类,实现需要的功能。
Go也不例外。而且Go引入包,其实很像Java。现在可以来看看Hello.go的引入了。但是注意,这里的import没有写绝对路径,而是写了一个相对路径。实际上,只要写上这个包在GOPATH中的路径就可以了,GOPATH不需要写。
现在我的系统里GOPATH是“/User/myname/go”,这个目录下面,会有三个约定好的目录:
- src:源码都放在这里,这里面不同的工程分成不同的目录就可以了;
- pkg:库源码文件,进行了install之后,就会放在这里,这里都是归档文件;
- bin:工程build之后,会生成可执行文件,就在这个目录里。
以我刚才写的hello_lib为例,执行这个命令:
go install awesomeProject/day1
观察pkg目录:
lib目录注意这里多了一个darwin_amd64,这是平台相关的,install之后生成的是归档文件,后缀名为.a。
如果执行这个命令:
go install awesomeProject
这时会生成可执行文件,会放在bin目录下面,这是可执行文件,可以直接执行。
3. 别人家的例子
Java可以用maven的pom文件自行下载jar包,很方便。我还是很想用Go来操作MySQL的,要操作数据库就要有驱动。Go的MySQL驱动是这样的安装的:
go get -u github.com/go-sql-driver/mysql
github的访问非常缓慢,因此我首先把这个代码放在了码云上:
go get gitee.com/zhiyoucai/mysql
很快就好了,此时观察一下pkg目录:
驱动此时,这个驱动就被安装到了pkg目录下。此时因为是放在了GOPATH下,因此是可以直接引用这个包的。
4. 小结
上面的例子中算是讲明白了什么叫做GOPATH,其实就是工作区,所有的Go相关的工作都要在这个工作区内进行。
虽然内容基本,但是很重要,毕竟我们学一门语言是面向写工程代码的,而不是写一个工具出来玩玩。
网友评论