前言
本人是.Net/C#开发小白,在大佬们的建议下,开始学习Go语言,特此记录下自己的学习过程。
由于本文时自己参考书籍以及网络资料写的,如果有错误,请大佬指出,我感谢不尽
Go的Hello World
作为最常用最喜欢的入门第一段程序就是输出Hello Wrold啦,这里直接贴代码给上。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
将上述代码内容复制到go后缀的文件中,如main.go,将终端路径定位到文件上级,输入指令
go run main.go
就可以看到万众期待的Hello World啦
关于Go的安装和配置
Golang的安装十分简单,可以点击此处链接到达下载页面。此处建议下载Go1.13以上版本进行学习和开发。本文使用的Go版本是基于1.17进行编写的。
安装完毕之后,开发者要及时将Go的bin目录添加到环境变量的path中。
Go的环境变量设置
使用Go指令go env,既可以查看当前Go的环境变量设置。
go env
这里给出比较推荐的Go全局环境变量设置
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
第一行是开启自Go1.11版本开始,并且至今也比较流行的Go module 包管理工具。
第二行是切换到七牛云Go下载代理地址,可以加快国内环境的包获取速度。
Go常用指令及其一般功能介绍
1.go help
在终端输入该指令可以获得所有go指令的介绍和使用说明。
2.go env
该指令可以获得当前目录环境下的go环境变量数据,也可以通过该指令来更改全局或者当前局部的环境变量。
3.go mod init XXX
对当前环境的下创建model为XXX的go.mod文件,即使用gomod包管理工具,一般是一个项目的起点。
4. go mod tidy
主动添加需要用到但go.mod中查不到的模块。
5. go run xxx.go
编译并执行xxx.go的main方法。
6. go build xxx.go(该文件下有main方法)
一般用于编辑和打包生产可执行文件,会根据设置的环境变量的OS属性生成不同系统适用的可执行文件。
7. go get XXXXX
用于获取XXX地址的包。
8. go version
用于查看当前go版本
Go的文件格式说明
package main
import "fmt"
const (
PI = 3.14
)
var (
name = "icesfeaters"
)
func init() {
fmt.Println("init")
}
func main() {
fmt.Println("Hello World")
}
package 包
包的特性如下:
- 一个目录下的同级文件归属一个包。
- 包名可以与其目录不同名。
- 包名为 main 的包为应用程序的入口包,编译源码没有 main 包时,将无法编译输出可执行的文件。只有main包下的main函数才是程序的入口。
import 导入包
当前程序需要使用到其他包的方法时,需要在import中声明,并且可以在import中自定义指定方法名来使用,如下方程序所示。该处理方式主要用于解决1.压缩包名;2.解决不同包直接的命名冲突问题。
import (
fmtkk "fmt"
)
func main() {
fmtkk.Println("hello world")
}
匿名包
存在部分包,需要该包的初始化,但实际程序编写并不会使用的情况,比如:数据库驱动方法包。则需要使用匿名包写法来声明,写法如下。
import (
_ "github.com/jinzhu/gorm/dialects/mysql"
)
//此处声明的是mysql驱动包
const 全局常量声明
先说明常量的概念:常量:只能读,不能修改,声明时必须确定值,且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量声明的完整写法如下:const thisNum int = 9
。
其中[type] (int)字段,Go可以根据后面的值来判断并自动识别声明,所以可以省略。
注意点:常量声明中,只能使用=
,不能使用:=
。
var 全局变量声明
全局变量声明必须携带关键字var
,并且只能使用=
,不能使用:=
。
全局变量的声明的完整写法如下:var thisNum int = 10
与常量声明不同之处在于:
- 全局变量声明可以不给予初始值,但相对的必须声明参数类型,如
var thisNum int
- 变量的类型不仅限于基础类型,包括
func()
,interface{}
,struct{}
等。
init 初始化方法
init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。
init 函数通常被用来:
- 对变量进行初始化
- 检查/修复程序的状态
- 注册
- 运行一次计算
初始化顺序规则: (1)引入的包 (2) 当前包中的变量常量 (3) 当前包的init (4)main函数
注意init()函数不能被主动调用!
当出现多个init()函数时,安装声明的先后顺序依次执行,测试程序如下:
package main
import "fmt"
func init() {
fmt.Println("init1")
}
func init() {
fmt.Println("init2")
}
func main() {
fmt.Println("main")
}
输出结果
init1
init2
main
函数声明
此处仅列出函数声明的完整格式,具体方法说明后续内容会说明
func funcName(param1 type,param2 type ...)(res1 type,res2 type ...){}
到时候会将跳转地址在此处列出
额外说明
- Go如何区分公有权限和私有权限
go中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用。
可以简单的理解成,首字母大写是公有的,首字母小写是私有的。
- 关于Go的定义未使用问题
在Go中,禁止出现未被使用的包、未被使用的局部变量,所以在学习使用Go的时候要额外注意这一点。
Go的关键字列举
- 包相关:
import
,package
- 声明相关:
var
,const
,type
,struct
,interface
,func
,chan
,map
,go
- 循环相关:
for
,range
- 条件判断相关:
if
,else
,switch
,select
,case
- 中断或返回:
return
,goto
,fallthrough
,break
,default
,continue
- 延迟执行:
defer
- 预声明常量:
true
,false
,iota
,nil
- 预声明类型:(整型)
int
,int8
,int16
,int32
,int64
;(无符号整型)uint
,uint8
,uint16
,uint32
,uint64
,uintptr
;(浮点型)float32
,float64
,complex64
,complex128
;(其他)bool
,byte
,rune
,string
,error
- 预声明函数:
make
,len
,cap
,new
,append
,copy
,close
,delete
,complex
,real
,imag
,panic
,recover