基本知识
golang的文件格式以go结尾。
运行方式 go run main.go
用于开发调试使用
编译成二进制文件 go build main.go
会生成一个可执行的二进制文件
变量
变量定义的形式
Golang的变量定义有多种,首先,我们看下最繁琐的定义:var X [类型] = XX
实例:
package main
import "fmt"
func main() {
var a int = 1
fmt.Println(a)
}
这里的变量类型我们可以把它省略,因为编译器会自动去判断变量的类型。格式变成var X = XX
。
实例:
package main
import "fmt"
func main() {
var a = 1
fmt.Println(a)
}
还有一种变量的表示形式,这种方式最简洁X := XX
实例:
package main
import "fmt"
func main() {
a := 1
fmt.Println(a)
}
如果一个变量很重要使用第一种方式定义,比如全局变量。如果一个变量不那么重要就可以使用第三种方法定义,比如:
for i := 0; i<10; i++ {
doSomething()
}
注意: var 关键字无法直接写进循环体中的初始化语句中,而且必须提前声明变量:
var i = 0;
for ; i<10; i++ {
doSomething()
}
局部变量和全局变量
局部变量: 定义在函数内部,函数调用结束它就消亡。
全局变量: 首字母大写,就是公开的全局变量;如果是小写的首字母,就是内部变量。内部全局变量只能当前包内访问,外部代码是看不见的。
变量与常量
Gonlang中用const关键字定义常量。常量是全局常量也可以是局部常量。常量必须初始化,且不能二次修改。全局的常量规则与大小写一致。
指针
指针符号 *
、取地址符 &
,功能上和 C语言几乎一模一样。指针还支持二级三级等指针。
package main
import "fmt"
func main() {
var value int = 42;
var pointer *int = &value
fmt.Println(pointer, &pointer)
}
基本类型
符号整型: int8\int16\int32\int64 1~4字节
无符号整型: uint8\uint16\uint32\uint64
说明: int 类型在32系统占用64字节,在64位系统占用8个字节
布尔类型: bool
字节类型: byte
字符串类型: string
浮点类型: float
复数类型: complex64\complex128
unicode字符类型: rune
指针类型: uintptr
采用第一种变量的定义方式,编译器会自动赋初值,整型赋值 0, 字符串赋值 空串,布尔赋值 flase 等。
判断语句
判断的格式如下:
if [条件] {
...
} else if [条件] {
...
} else {
...
}
注意: Golang不支持三元运算符。
switch语法
第一种格式:
switch [条件] {
case [值], [值..]:
...
case [值]:
...
...
default:
...
}
第二种格式:
switch {
case [条件]:
...
...
default:
...
}
循环
golang的循环语句通过 for 来实现, golang 没有提供 while 和 do while 的循环形式。
- 死循环
for {
...
}
for true {
...
}
- for 只带一个条件语句相当于 while 语句。带三个语句就是普通的 for 循环。
- golang可以通过 continue (跳出本次循环) 和 break (跳出循环) 控制循环体。
- golang支持 goto 语句, 不过建议不要使用,会使程序变得难以阅读。
数组
数组定义
示例:
var X = [3]int {1, 2, 3}
var X [3]int =[3]int{1, 2, 3}
X := [3]int{1, 2, 3}
数组访问
package main
import "fmt"
func main() {
var squares [9]int
for i := 0; i < len(squares); i++ {
squares[i] = (i+1)*(i+1)
}
}
golang会对数值下标越界进行检查。
数组的赋值本质是一种浅拷贝,即赋值的两个数组变量的值不会共享。
package main
import "fmt"
func main() {
var a = [9]int{1, 2, 3, 4}
var b [9] int
b = a
a[0] = 123
fmt.Println(a) //[123 2 3 4]
fmt.Println(b) //[1 2 3 4]
}
不同长度的数组之间赋值时禁止的。
数组遍历
var a = [5]int{1, 2, 3, 4, 5}
for index := range a {
fmt.Println(index, a[index)
}
for index, value := range a {
fmt.Println(index, value)
}
本文总结自公众号 码洞,微信号:codehole。