原文发布在我的个人博客 入坑Go语言(一) | 以太空间
最近看到Github上好多following都在学习Go语言(又称Golang),心里面很痒痒,趁着下午这点空隙,学习一下这个可爱的土拨鼠。
一、安装配置相关
Go语言的安装很是傻瓜式,从它的官网直接下载相应系统的安装包安装即可,就像我们平常安装软件,下一步,下一步……
安装完成之后,我们要配置以下Go的环境变量,在当前用户家目录下的.bash_profile
添加以下几行
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
解释一下GOROOT
与GOPATH
的区别:
-
GOROOT
是Go语言安装目录(可选设置,1.8版本之后有默认值) -
GOPATH
是Go语言的工作空间,我们写的项目代码都是要放到这个里面的(可选设置,可以有多个值,1.8版本之后有默认值)
一个需要商榷的地方就是,如果我有很多用Go语言开发的项目,该怎么组织呢?
有两种组织方式:
- 一个项目作为一个gopath
- 一个项目作为当前gopath的一个包
这两种方式各有利弊,详细请转以下知乎链接:
大家现在go项目如何管理的?
至于IDE,当然是选万能的VS Code了,装个Go插件,看起来很完美。
二、常用命令
-
go build
:编译源码文件、代码包、依赖包 -
go run
:编译并运行Go源码文件 -
go get
:远程获取代码包
三、语法基础
// 程序所属包
package main
// 导入依赖包
import "fmt"
// NAME 常量定义
const NAME string = "I'm chenwengang"
// 全局变量
var mainName = "main mian"
// MyInt 类型声明
type MyInt int
// MyStruct 结构声明
type MyStruct struct {
}
// 接口声明
type iInter interface {
}
// 函数定义
func learn() {
fmt.Println("learn")
}
// main函数, 入口函数
func main() {
fmt.Println("Hello World")
learn()
}
四、基础数据类型
1. 分类
Go语言的基础数据类型有以下几种:
- 整型
- 浮点型
- 复数
- 字符串
- 布尔值
关于这些数据类型的详细我不再赘述,参考这个链接
在上面这个链接中,各位看到光整型就int8
、int16
、int32
等好多种,这是为了充分利用内存,举个例子,当想存放一个1000以内的数时候,int8
是最省内存的,所以就选用int8
,如果在10万左右,就用int16
。
在Go语言中,字符串的统一编码是UTF-8
2. 类型零值
类型零值不是空值,是某个变量被声明后的默认值:数值类型的默认值是0(复数是0=0i ),布尔型默认值是false,string默认值是空字符串
3. 类型别名
type [别名] int32
跟C语言的typedef
作用一样,但是原名别名位置是反过来的。
五、变量
1. 声明
Go语言的变量声明基本和C语言是类似的,不过也有一些不同之处,我们通过代码来看:
// 类型在变量名后面
var x int
// 分组声明
var (
x int = 2,
y float32 = 1.0,
z string = "x"
)
// 声明并赋值
var a int, b float32, c string = 1, 1.0, "x"
var a,b,c int = 1,2,3
a,b := 1,2
全部变量必须使用var关键字,局部变量可以省略但是必须用:=
_
这个特殊变量就是个垃圾桶
2. 类型转换
Go语言必须是显式转换,而且只能发生在两种兼容类型之间。
y := 1.0
var x = int(y)
3. 可见性
- 大写字符开头的变量是可以从其他包访问到的
- 小写字符开头的变量只能在本包内使用
六、常量
1. 声明
const identifier [type] = [value]
常量只支持布尔型、数值型、字符串型
2. iota
- iota在const出现时(每一次)会被重置为0
- const每新增一行将会iota+1
- 只能在const出现的地方使用
const (
a = iota
b = iota
c = iota
)
const d = iota
// 最后a=0,b=1,c=2,d=0
const (
a = iota
b = iota
_
c = iota
)
// 最后a=0,b=1,c=3
3. 一个有趣的现象
看下面这段代码:
const X = 1
const (
a = X * 2
b
c
)
// 最后a=2,b=2,c=2
这是因为分组const常量声明如果没有赋值,它会在本组内自动寻找上面最近的表达式作为自己等号右边的表达式,上面的代码就相当于:
const X = 1
const (
a = X * 2
b = X * 2
c = X * 2
)
沿用表达式必须要求结构相同,也就是说
c, d
只能沿用a, b = X, X *2
这样的
七、运算符
算术运算符、比较运算符、逻辑运算符、按位运算符、赋值运算符与C语言是相同的
但是有一点不同,Go语言中的++
和--
只能放在变量后面,而且只能作为语句,不能作为表达式,看下面这段代码:
// 正确的
a := 1
a++
fmt.Println(a)
// 错误的
a := 1
fmt.Println(a++)
八、流程控制
Go语言流程语句与C语言的区别是,判断条件的地方不用加小括号
1. 条件语句
if x < 1 {
fmt.Println(x)
} else if x < 5 {
fmt.Println(x-5)
} else {
}
2. 选择语句
switch x {
case 1:
...
case 2:
...
}
case
后面跟着的条件必须类型相同
3. 循环语句
// 普通for循环
for a:=2;a<10;a++ {
...
}
// 代替while
for a < 10 {
...
}
// 无限循环
for {
}
4. break
、continue
、goto
和C语言相同