初学go语言

语法

变量

1
2
3
4
5
6
7
8
var x,y,z int
var (
a int
b float
)
func main(){
n,s := 0x1234, 'hello'
}

编译器会将未使用的局部变量当作错误,可以使用_ = i规避编译错误

常量

1
2
3
4
5
6
7
8
9
10
11
const x, y int = 1, 2
const (
s = 'abc'
x // x= 'abc'
)
//常量值可以是编译期可确定结果的函数的返回值
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(b)
)

枚举

1
2
3
4
5
6
7
8
9
10
11
//itoa为关键字 定义常量组中从0开始计数的自增枚举
const (
Sunday = itoa //0
Monday //1
Tuesday //2
...
)
const (
A, B = iota, iota << 10 // 0, 0 << 10
C, D // 1, 1 << 10
)

基本类型

bool byte rune int int8 int16 int32 int64 float32 float64 array struct string slice map channel interface function

1
a, b, c, d := 071, 0x1F, 1e9, math.MinInt16

字符串

1
2
3
4
5
s := `a
b\r\n\x00
c`


println(s)
1
2
s := "Hello, " +
"World!"
1
2
3
4
5
s := "Hello, World!"

s1 := s[:5] // Hello
s2 := s[7:] // World!
s3 := s[1:5] // ello
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//循环字符串
func main() {
s := "abc汉字"

//逐字节byte
for i := 0; i < len(s); i++ {
fmt.Printf("%c,", s[i])
}

fmt.Println()
//rune
for _, r := range s {
fmt.Printf("%c,", r)
}
}

指针类型

同c语言,&取地址,*透过指针访问目标对象

保留字

保留字倒是和别的语言很类似
break default func interface select case defer go map struct
chan else goto package switch const fallthrough if tange type
contiuue for import return var

运算符

下列运算符不知道其含义及使用
&= ^XOR <- [ ] <<标志位操作符 >> := ... &^清除标志位 &^=

初始化复合对象

1
2
3
4
5
6
var a = struct{ x int }{100}
var b = []int{1, 2, 3}
a := []int{
1,
2,
}

流程控制

if for 都支持初始化语句

1
2
3
4
5
6
7
for {
//相当于while(true)
}

for n > 0 {
//相当于while(n > 0)
}

range使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
s := "abc"

for i := range s { // 忽略 2nd value,支持 string/array/slice/map。
println(s[i])
}

for _, c := range s { // 忽略 index。
println(c)
}

for range s { // 忽略全部返回值,仅迭代。
...
}

m := map[string]int{"a": 1, "b": 2}

for k, v := range m { // 返回 (key, value)。
println(k, v)
}

switch使用示例,也可以携带初始化语句

1
2
3
4
5
6
7
8
9
10
11
x := []int{1, 2, 3}
i := 2

switch i {
case x[1]:
println("a")
case 1, 3:
println("b")
default:
println("c")
}

break 可用于 for、switch、select,而 continue 仅能用于 for 循环