Go 其一 基础内容
艺多不压身,学习一下最近蛮火的Go语言,整理一下笔记。相关Code和笔记也放到了Git上,传送门。
1.从Hello world开始
- GOPATH 1.8版本默认在%USERPROFILE%/go
- 命令build命令 go build xxx.go, 运行命令go run xxx.go
- Go默认情况下会使用静态链接, 编译好的文件可以直接运行
- 应用程序入口必须是main包, package main 必须是main方法:func main() 文件名不一定是main.go
- Go中main函数不支持任何返回值,通过os.Exit来返回状态
- main函数不支持传入参数,在程序中直接通过os.Args获取命令行参数
2.测试程序,变量,常量
- 源码文件必须以_test结尾: xxx_test.go
- 测试方法名以Test开头: func TestXXX(t *testing.T) {...}
- 运行命令 go test -v .\first_test.go
- Go支持多种复制关系以及一定的类型推断,但在2.0版本后将会不推荐甚至禁用一部分写法,目的是code的风格统一
- 同一个文件夹下不同go文件的package要相同,否则会报错 can't load package: package...
- 在一个赋值语句中可以对多个变量进行同时赋值 例如: a,b=b,a
常量定义方面
// 1.快速设置连续值 const ( Monday = iota + 1 Tuseday Wednesday ... Sunday ) // 2. 表状态的bite位也可以这么玩 Const ( Open = 1 << iota Close Pending )
3.基本数据类型
bool
string
int int8 int16 int32 int64
uint unit8 unit16 unit32 unit64 uintptr
byte // alias for unit8
rune // alias for int32, represents a Unicode code point !!!这个类型以后会详详细介绍,暂且放一放
float32 float64
complex64 complex128
- 默认类型根据运行的机器的位数决定使用多少位。
- Go语言不允许任何隐式类型转换
- 别名和原有类型也不能进行隐式类型转换
类型的预定义值
例如:
math.MaxInt64
math.MaxFloat64
math.MaxUnit32
指针类型 于其他主要变成语言的差异
1. 不支持指针运算
2. string是值类型,其默认的初始化值为空字符串,而不是nil
4.运算符
算术运算符
- 常用运算符如 + - * / % ++(后置) --(后置)与别的语言没什么差异
- Go语言中没有前置的 ++ -- (先自增,再引用)
比较运算符
常用运算符与别的语言没什么差异,但什么对象可以比较稍有差异,日后补充
例:用==比较数组
相同维数且含有相同个数元素的数组才可比较
每个元素都相等才相等
逻辑运算符
与别的语言没由什么差异
位运算符
& | ^ << >>没什么差异
与其他语言的差异 &^ 按位置零 (按位清零) 运算符
1 &^ 0 -- 1
1 &^ 1 -- 0
0 &^ 1 -- 0
0 &^ 0 -- 0
该运算符这样计算, 只要操作符右边的运算数上的位置为1,无论左边对应位置上的运算数是多少都清零。
右边操作符上的操作数为0时则左边原来是什么就显示什么。
注意,使用Go语言就要使用Go的特点,写出真正的Go程序而不是将其他语言翻译成Go.
5.条件和循环
循环
Go语言仅支持循环关键字for
例 for j:= 7; j <= 9; j++ (不需要括号括起来)
while条件循环 while (n < 5) Go版本 n := 0 for n < 5 { n++ fmt.Println(n) } 无限循环 while(true) Go版本 n := 0 for { ... }
if条件
例: if condition { ... } else { ... } if condition - 1 { ... } else if condition - 2 { ... } else { ... }
区别:
- condition表达式结果必须为布尔值(没有隐式转换,int是不可以的)
- 支持变量赋值:
if vardeclaration; condition { // code to be executed if condition is true }
switch条件与其他语言的差异
- 条件表达式不限制为常量或者整数
- 单个case中,可以出现多个结果选项,使用逗号分隔
- 与C语言等规则相反,Go语言中不需要使用break来明确退出一个case
- 可以不设定switch之后的条件表达式,在此种情况下,整个switch结构与多个if...else...的逻辑作用等同
写法举例: 1. switch os := runtime.GOOS; os { case "darwin": fmt.Println("OS X.") //break case "linux": fmt.Println("Linux.") default: // freebsd, openbsd, // plan9, windows... fmt.Printf("%s.", os) } 2. switch { case 0 <= Num && Num <= 3: fmt.Prinft("0-3") case 4 <= Num && Num <= 6: fmt.Prinft("4-6") case 7 <= Num && Num <= 9: fmt.Prinft("7-9") }