应用程序入口
- 必须是main包,
package main - 必须是main函数,
func main() - 文件名可以不是main.go
- 文件目录名也可以不为main,不过一般包名和目录名相同
main函数
- main函数没有返回值也没有参数
- 可以通过
os.Exit函数来返回退出状态码 - 可以通过
os.Args来获取命令行参数,array,第一个元素为程序名(包含路径),后面的才是参数 ```go package main
import (
“os”
)
func main(){ fmt.Println(os.Args) os.Exit(0) // 正常退出 // os.Exit(1) // 非正常退出 }
<a name="DCOiI"></a># 变量定义- Go语言中推荐使用驼峰式命名- 除全局变量外,变量声明必须使用,否则编译将报错 `xxx declared and not used`<a name="gsJHi"></a>## 定义变量```go// var 变量名 类型var num int // 定义后为该类型的零值 0var s string // "" 空字符串var flag1, flag2 bool // 同时定义多个变量// 定义多个变量时 简略写法var (a = 10 // 直接定义赋值b int // 定义变量 0c string // "")
定义变量并赋值
// 定义变量并赋值var a string = "abc"var b,c int = 15var d = 14 // 类型可以省略,编译器自动推导var x,y,o,s = 1, 2, true, "Go" // 可赋值不同类型的值
简短变量声明
只能在函数内使用 := 进行定义变量和初始化, 函数外部只能用 var 定义变量
func foo(){num := 12 // 等价于 var num = 12a, b, s := 1, 2, "Go"}
匿名变量
使用多重赋值时,如果想忽略某个值,可以使用匿名变量。匿名变量使用一个下划线 _ 表示。
func foo() (bool, string){return true, "Hello Go"}func main() {isOk, _ := foo() // 只接收bool值,丢弃string}
常量
定义常量
使用 const 定义常量, 常量定义后值不能修改
常量名和其他语言不通
const a = 10const (b = 20s = "Go")
批量声明常量时如果某一行没有赋值,则默认和上行相同
const (a = 100 // 100b // 100c // 100)
iota
iotaGo语言的常量计数器,只能在常量的表达式中使用iota在const声明时将重置为0const中每新增一行常量声明将使iota计数加一(iota可理解为const语句块中的行索引)const (zone = iota // 0one = iota // 1tow // 2_ // 忽略four // 4five // 5)
const (B = 1<<10 * iota // 1 << 10 * 0 = 1KB // 1 << 10 * 1 = 1 << 10 = 1024MB // ...GBTB)
基本数据类型
整数
(u为无符号)
- (u)int 在 32 位系统中为 int32,在 64 位系统中为 int64
- (u)int8
- (u)int16
- (u)int32
- (u)int64
- uintptr 指针
浮点型
- float32
- float64
- complex64
- complex128
bool
- 值只有:true 和 false
- 不允许将整数转换为布尔值
string
- 字符串必须使用双引号
- 单引号为字符
- 多行字符串 使用 ``` 反引号
- 字符串常用操作
len(str): 求长度,字节(byte)数+或fmt.Sprintf(): 拼接字符串strings.Split(): 分割strings.contains(): 判断是否包含strings.HasPrefixstrings.HasSuffix: 前缀、后缀判断strings.Indexstrings.LastIndex: 子串出现的位置strings.Join(): 将切片拼接成字符串
byte 和 rune
- byte 字符类型 8位, uint8
- rune 字符型 32 位, int32 存放utf8 字符
类型转换
- Go 中类型不能进行隐式转换,必须强制转换
- 别名和原有类型也不能进行隐式类型转换
- bool 类型不能转换为int ```go var a, b, c int
c = int(math.Sqrt(float64(a a + b b)))
<a name="8ztV9"></a># 流程控制<a name="RBBHH"></a>## if else```goif a >= 90 {fmt.Println("优")}else if a >= 70 {fmt.Println("良")}else if a >= 60 {fmt.Println("及格")}else{fmt.Println("不及格")}
if 的条件里可以赋值,作用域仅在该 if 语句内
if contents, err := ioutil.RadFile("1.txt"); err{fmt.Println(string(contents))}else {fmt.Println(err)}
switch
switch 会自动 break,除非使用 fallthrough
switch op {case "+":result = a + bcase "-":result = a - bdefault:panic("该运算符不支持")}
switch num {case 1, 2:fmt.Println("A")case 3,4:fmt.Println("B")default:fmt.Println("C")}
switch {case a > 10:fmt.Println("A > 10")case a == 10:fmt.Println("A == 10")default:fmt.Println("A < 10")}
fallthrough
fallthrough 可以执行满足条件的case的下一个case
循环 for
// 1. 基本使用for i:=0; i<10; i++ {fmt.Println(i)}// 2. 省略初始语句var i = 1for ;i<10; i++ {fmt.Println(i)}// 3. 相当于其他语言中 while循环var i = 5for i < 10{fmt.Println(i)}// 4. 死循环for {}
for range
s := "hello GO语言"for i, c := range s {fmt.Println(s)}
break continue
break跳出循环continue跳过本次循环
运算符
算术运算符
+ 加 |
- 减 |
* 乘 |
/ 除 |
% 求余 |
|---|---|---|---|---|
++ 和 -- 是单独的语句,不能放在等号右边
关系运算符
== 等于 |
!= 不等于 |
> 大于 |
>= 大于等于 |
< 小于 |
<= 小于等于 |
|---|---|---|---|---|---|
逻辑运算符
&& 与 |
` | ` 或 | ! 非 |
||||
|---|---|---|---|---|---|---|---|
位运算符
& 按位与 |
` | ` 按位或 | ^ 异或 |
<< 左移 |
>> 右移 |
&^ 按位清零 |
|---|---|---|---|---|---|---|
// 按位清零1 &^ 0 == 11 &^ 1 == 00 &^ 1 == 00 &^ 0 == 0
赋值运算符
= |
+= |
-= |
*= |
/= |
%= |
|---|---|---|---|---|---|
<<= |
>>= |
&= |
|= |
^= |
