2。第1个go程序
昨天安装了go包和vscode。今天开始我的第1个go程序。创建项目和文件在D盘创建一个go的项目目录,把所有的go项目放里面。目录为:`D:go_project`在项目目录中创建第1个项目文件夹first_project,目录即:`D:go_projectfirst_project`打开vscode,点击`File`菜单,选择`Open Folder...`如图1,再选择我们步骤2中创建的目录`D:go_projectfirst_project`如图2,点`选择文件夹`。vscode编辑器当前打开的就是我们刚才创建的项目`first_project`,我们通过vscode可以往项目中添加文件。
图1
图2
4.新建第1个go文件。鼠标移动到项目名称上,会出现几个按钮,点击`新建文件`按钮,在下面的输入框中输入我的第1个go文件名称:`index.go`(go文件一般命名都以`.go`结尾),然后回车,创建完成(如图3)。创建完成,这个文件会自动在右侧编辑区域打开(如图4)。
图3
图4
5.编写代码输入"hello,world"。
查了一下,go语言有一些可以直接使用的内置函数(如`append`,后面会学到),除此之外可以引入包,使用包里面的函数。输入一段文字需要使用名为`fmt`的包。**包是什么?**
我理解包就是一堆代码的集合,就像女生喜欢的`包`一样,它里面可以放很多乱七八糟的东西,只不过go语言里的包存放的是 `函数`、`结构(类)`,`变量(不知道是否正确,以后再验证)`等。
**有什么作用?**
1.隔离。如果你和我写的文件用了同名的变量或函数,如果没有包就会冲突,编译器可能不知道你用的是哪个,有了包那么使用时就可以使用包名加函数名区分,如包package1和package2下有同名的test函数,使用时package1.test()或package2.test()进行区分。
2.复用。写代码肯定不希望每次都从头写,复用能提高效率。
**go语言中的规定**
1.任何一个go文件必须属于一个包。
2.同一个目录下的同级的所有go文件应该属于一个包。
3.包的名称可以跟目录不同名,不过建议同名。
4.必须有且只有一个`main`函数,它是go语言的入口函数,也就是程序启动第1个要执行的函数。且main函数必须属于main包。也就是说go语言必须有一个main包。
所以必须知道怎么让一个文件属于一个包?语法如下,其中`xxx`为包名:package xxx
例如包名为`main`package main
引入一个包的语法,其中`xxx`为包名:import "xxx"
例如引入"fmt"包import "fmt"
我在`index.go`文件中写入的内容如下:package mainimport "fmt"func main() {fmt.Print("hello world")}
因为上一篇文章<<今天想学习一门编程语言>>中安装了`code runner`插件,所以在编辑的`index.go`内容任意处鼠标右键,选择`Run Code`可运行代码,并可在输出面板`OUTPUT`处看到运行结果:
vscode中运行程序
`OUTPUT`输出结果处也会显示运行的命令`go run`(学习go语言使用的第1个命令),其实跟使用命令行是等同效果(如下图),所以`code runner`真的很方便。
`go run`命令会编译源码,并且直接执行源码的 main() 函数,不会在当前目录留下可执行文件。
有用的插件
在编写index.go的时候vscode总提示几个go扩展的命令不可用(如下图),可以点击Install进行安装,但在安装前我需要弄明白这些插件都有什么作用:
安装go的一些包或插件时总失败,因为包或插件地址在国外,所以需要设置一下go的国内代理。这里可以先用`go env`查看go的所有环境配置。其中需要设置的是`GOPROXY`环境变量。命令为:go env -w GOPROXY=我是国内地址上网随便可搜到,directgo help env 可以查看go env的用法
1. go env -json: 环境变量以json格式输出。
2. go env -w XXX=xxx: 如上面设置代理,设置属性XXX使用自定义的值xxx代替安装时的默认值。
3. go env -u XXX:删除通过`go env -w`设置的值,还原回默认值。
我猜`默认值`和`go env -w`设置的值分两个文件,使用环境变量时,`go env -w`文件的值会覆盖`默认值`文件的值。`go env -u`只会删除`go env -w`文件的值,所以又会恢复默认值。【待验证】
1.goimports是什么?
goimports是Go官方提供的工具,可以自动对代码中的依赖包进行管理,如果有用到,就会自动`import`,对没有用到的包进行自动删除。并且goimports也具有`gofmt`的功能。
`gofmt`可以格式化go的代码。网上说vscode可以设置保存时自动格式化代码。但我在`swith fron gofmt to goimports`之前的操作都没有成功:
如果vscode没有提示安装`goimports`,也可以手动安装。打开命令行,直接输入安装命令:go get -v 我是go官网地名/x/tools/cmd/goimports
因为修改了`GOPROXY`很快就安装成功,重启vscode,之前写的代码再保存一下,自动格式化了。
2.gopls是什么?
gopls可以实现代码自动完成,转到定义,查找所有引用等功能。它是 LSP(全称 Language Server Protocol,即语言服务器协议) 的一个语言端(Server)实现,是针对 Go 语言的 LSP 实现。有兴趣可自行了解。
gopls的安装可以通过提示点击Install进行安装,也可以使用上面安装goimports的方式手动安装(安装命令:`go install -v 我是go官网地名/x/tools/gopls@latest`),这里再学习一种新的vscode安装插件的安装方式。
(1)ctrl+shift+P 打开 执行命令的输入框,输入go:install 就可以看到`Go:Install/Update Tools`(如图),选择它自动跳转后,可以看到go的工具列表。
图5
(2)选择gopls,点击OK进行安装
图6
(3)OUTPUT处会显示安装成功
3.go-outline是什么?
go-outline可以解析结构体tag标签里面的json信息。以后会学习到的,先安装再说。 总结任何一个go文件必须属于一个包。go必须有一个main包。go必须有且只有一个main函数,且它属于main包,是go语言的入口函数。包的名称可以跟目录的名称不同名,建议同名,自己好找到文件。文件包名语法`package xxx`,并且必须在文件除注释外第1行。引入包语法`import "xxx"`,以后还会学到1个Import引入多个的包的语法。go env 查看所有go的环境变量。go env -w 设置环境变量。go env -u 删除通过go env -w设置的环境变量,还原成安装时的默认值。要设置`go env -w GOPROXY`后才能顺利下载go包和工具。goimports可在保存文件时自动格式化,自动`import`,对没有用到的包进行自动删除。gopls实现代码自动完成,转到定义,查找所有引用等功能。go-outline可以解析结构体tag标签里面的json信息。