GO语言基础
1. GO简介
-
软件开发的新挑战
* 多核硬件架构
* 超大规模的分布式计算机集群
* 前所未有的web模式的开发规模和更新速度 -
Go语言的特点(云计算语言)
- 追求极致的简单(只有25个关键字)
- 高效(可以使用指针进行内存访问并且有GC)
- 生产力(只使用复合进行扩展)
2. 安装GO语言
-
在mac上安装homebrew后直接输入下面的命令就可以安装go的环境
brew install go
3. 编写一个Helloword
源码如下
package main
import "fmt" //注意导入包
func main() {
fmt.Println("Hello world")
}
注意事项:
- 在Go的1.8版本之后就不需要添加环境变量了。使用
go version
命令就可以查看Go语言的版本 - 主程序的包名一定要是main,也就是在主程序所在go文件里package也一定要是go(但是文件夹名字可以和package名字不一样)
- 使用
go run 文件名
可以运行一个go程序的主程序,使用go build 文件名
可以直接编译成二进制文件直接运行 - 返回值:main函数是不支持返回值,使用
os.Exit(0)
语句来定义返回值 - 命令行参数:main函数不支持传递参数,使用
os.Args
语句来获得命令行参数数组
4. 变量和常量
-
使用单元测试
- 单元测试的文件必须以
_test
结尾,例如application_test.go
- 单元测试的方法名必须以
Test
开头,以t *testing.T
作为参数,例如func TestVar(t *testing.T)
- 单元测试的文件必须以
-
变量赋值
在go里定义一个变量和给一个变量赋值有下面几种方法
//直接声明斌赋值 var a int = 1 var b int = 1 //使用var代码块包裹需要赋值的变量 var ( c int = 1 d int = 1 ) //使用Go的类型推断,不给出类型,直接赋值 e := 1 //先声明,再赋值 var f int f = 1 //一次性多个赋值 a,b = 2,3
-
常量
//定义一个常量 const A int = 1 //定义多个常量 const ( B int = 1 C int = ! ) //快速定义连续常量,这样One,Two,Three都搞定了相同的值 const ( One = 1 + iota Two Three )
5. 数据类型
-
Go语言支持的基本数据类型有以下几种,后面的字数代表位数
- 布尔类型:bool
- 字符串:string
- 整形:int8 int16 int32 int64
- 无符号整型: uint8. int16 uint32 uint64
- 字节:byte(相当于无符号8位整型)
- rune类型:是Unicode的编码值,与字符串相关
- 浮点型:float32 float64
- 复数类型:complex64. complex128
需要注意的是,Go 语言里不支持隐式的类型转换,包括在64位机上的
int
转换成int64
,和一模一样的别名(总之所有的类型转换都需要显式的做)类型转换的写法如下var a int32 = 1 var a64 int64 a64 = int64(a)
补充,起别名的写法如下
type MyInt int64
-
类型的预定义值
var uintMax uint64 = math.MaxUint64 var intMax int64 = math.MaxInt64 var floatMax float64 = math.MaxFloat64 t.Log(intMax) t.Log(floatMax) t.Log(uintMax)
-
指针类型
Go的指针和C,C++的指针相比,有些区别:
- 不支持指针运算
- 2.string是值类型,初始化string时会直接初始化为空串
指针的使用如下,和C语言很像
a := 1 aPtr := &a t.Log(a,aPtr) t.Logf("%T %T",a,aPtr)
- 不支持指针运算
6. 运算符
-
算数运算符
运算符 描述 实例(A=10 B=20) + 加 A + B = 30 - 减 A - B = -10 * 乘 A * B = 200 / 除 B / A = 2 % 取余 b % A = 0 ++ 自增 A++ = 11 -- 自建 A— = 9 注意,为了避免歧义、GO语言里没有前置的++和--
-
逻辑运算符
运算符 描述 == 比较是否相等 != 比较是否不等 > 是否大于 < 是否小于 >= 是否大于等于 <= 是否小于等于 注意:
- 只有两个数组的元素个数相等,两个数组是可以比较的。相等的条件是所有相同下标的元素都相同
-
位运算符
-
按位清零运算符:
&^ 如果符号右边的数是0,则结果得0,若是1,结果则是左边的数
-
按位清零运算符:
7. 条件和循环
-
循环
由于Go语言要求简洁,因此Go语言只支持for循环
//while的写法 i := 0 for i < 5{ t.Log(i) i++ } //for的写法 for n:=0; n<5;n++ { t.Log(n) } //死循环的写法 for true { t.Log("hello") }
-
条件语句
在Go语言的if条件判断里可以有两段,第一段用来赋值,第二段来进行条件判断(用于函数的多返回值而导致的)
//普通的if表达式 if 1 == i { t.Log(true) } else if false { t.Log(false) } else { t.log("1233321") } //带有赋值语句的if,由于go的函数可以多返回值,所以下面的语句举例了一个场景 if value,err = somefunc(param) ; err == null{ t.Log("这里执行没有错误的逻辑") } else { t.log("这里执行有错误的逻辑") }
-
switch
在Go语言里,switch里可以进行字符串的匹配,并且在命中一个case后系统会自动break这个语句,程序员哭不用显式的添加break。
case里还可以写多个元素,进行多个条件的命中
x := "1" switch x { case "1": t.Log(1) case "2" , "3": t.Log(2) default: t.Log("unknow") }
switch语句后面也可以不写变量,这样可以把switch就会匹配bool值,为true的时候算命中。这样就可以把switch语句当作连续的if/else使用
n := 3 switch { case n%2==0: t.Log("偶数") case n%2==1: t.Log("奇数") default: t.Log("未知") }