ch1
go run hello_world.go
应用程序入口
-
必须是main包: package main (可以不是main的目录)
-
必须是main方法: func main()
-
文件名不一定是main.go
退出返回值
-
GO中main函数不支持任何返回值
-
通过os.Exit来返回状态
获取命令行参数
-
main函数不支持传入参数
-
程序中直接通过os.Args获取命令行参数
ch2
编写测试程序
-
源码文件以_test结尾: xxx_test.go
-
测试方法名以Test开头: func TestXXX(t *testing.T){}
变量赋值
-
赋值可以自动类型判断
-
一个赋值语句可以对多个变量同时赋值
常量定义
const (
//iota是一个预先声明的标识符,
//表示当前const规范的序号(通常用括号括起来)。
// 常量声明。它是0。
// 未类型化的int。
Monday = iota + 1
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
)
const (
// 位运算
// 第1位,比特位为1,代表Open
Open = 1 << iota // 0001
// 第2位,比特位为1,代表Close
Close // 0010
// 第3位,比特位为1,代表Pending
Pending // 0100
)
const (
// 位常量的定义方式
// 连续位的常量,用不同的二进制位来表示
Readable = 1 << iota
Writable
Executable
)
ch3
类型转换
-
Go 语言不允许隐式类型转换
-
别名和原有类型也不能进行隐式类型转换
(主流语言潜在规则:小类型可以往大类型转换)
func TestImplicit(t *testing.T) {
var a int = 1
var b int64
// invalid operation: b == a (mismatched types int64 and int)
b = int64(a)
var c MyInt
c = MyInt(b)
t.Log(a, b, c)
}
指针类型
-
不支持指针运算
-
string是值类型,其默认的初始化值为空字符串,而不是nil
func TestPoint(t *testing.T) {
a := 1
aPtr := &a
//invalid operation: aPtr + 1 (mismatched types *int and int)
//aPtr = aPtr + 1
t.Log(a, aPtr) // 1 0xc00000a338
t.Logf("%T %T", a, aPtr)
}
func TestString(t *testing.T) {
var s string
t.Log("*" + s + "*") // **
t.Log(len(s)) // 0
}
ch4
算数运算符
- Go语言没有前置的++,–
用==比较数组
- 相同维数且包含相同个数元素的数组才可以比较
- 每个元素都相同才相等
位运算符
与其他主要编程语言的差异 对于左右操作数
只要右边操作数的位上的为1,无论左边操作数的位上是0还是1,结果都是0 把左边的对应二进制位清零
只要右边操作数的位上的为0,则左边对应二进制位原来是什么结果就是什么
&^ 按位置零
1 &^ 0 -- 1
1 &^ 1 -- 0
0 &^ 1 -- 0
0 &^ 0 -- 0
ch5
循环
Go仅支持循环关键字for
if 条件
支持变量赋值
if var declaration; condition(
// code to be executed if condition is ture
)
func TestIfMultiSec(t *testing.T) {
if v, err := someFun(); err == nil {
t.Log(v)
} else {
t.Log("error", err)
}
}
switch 条件
case条件不限制常量或整数
case条件可以多个表达式
每个case有默认break
switch {
case 0 <= Num && Num <=3
fmt.PrintF("0~3")
case 4 <= Num && Num <=6
fmt.PrintF("4~6")
default:
fmt.PrintF("other")
}