变量声明
var v1 int
var v2 string
var v3 [10]int
var v4 []int
var v5 struct {
f int
}
var v6 *int
var v7 map[string] int
var v8 func(a int) int
基本变量类型分为:int、string、数组、切片数据(动态长度数组)、结构体、指针、Map、函数等。
var 简化写法,例子:
var (
v1 int
v2 string
)
变量初始化
var v1 int = 10
var v2 = 10
v3 := 10
v1 为正常方式。v2 & v3 可以自动推导类型。v3的方式不能作用于全局变量。
警告::= 左侧的变量不可以提前声明,比如 var v1 = 10; v1 := 10;该写法会导致编译器报错。
匿名变量
package helloworld
func getName() (string, string, string, string) {
firstName := "firstName"
lastName := "lastName"
nickName := "nickName"
middleName := "middleName"
return firstName, lastName, nickName, middleName
}
package main
import (
"fmt"
)
func main(){
_, _, _, middle := getName()
fmt.Println(middle)
}
// print -> "middleName"
常量
package main
import (
"fmt"
)
func main(){
const NAME = "name"
fmt.Println(NAME)
}
常量是指编译期间就已知且不可改变的值。常量可以是数值类型(包括整型、浮点型和复数类型)、布尔类型、字符串类型等。
预定义常量
true
false
iota // 常量计数器
枚举
const (
Sunday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
numberOfDays // 这个常量没有导出
)
Go 语言中,以大写字母开头的常量在包外可见。numberOfDays 该常量只能在包内可用。
数据类型
基础数据类型
布尔类型:bool
整型:int8、byte、int16、int、uint、uintptr等
浮点类型:float32、float64
复数类型:complex64、complex128
字符串:string
字符类型:rune
错误类型:error
int8:取值范围为 -128~127
复合数据类型
指针(pointer)
数组(array)
切片(slice)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
数值运算
+
-
*
/
%
比较运算符
>
>=
<
<=
==
!=
位运算
x << y 左移 124 << 2 // 结果为496
x >> y 右移 124 >> 2 // 结果为31
x ^ y 异或 124 ^ 2 // 结果为126
x & y 与 124 & 2 // 结果为0
x | y 或 124 | 2 // 结果为126
^x 取反 ^2 // 结果为-3
遍历字符串
package main
import (
"fmt"
)
func main() {
str := "hello 世界!"
for _, s := range str {
fmt.Println(string(s))
}
}
数组及数组切片
arr1 := [5]int{1,2,3,4,5}
arr2 := []int{}
数组长度在定义之后,不能更改。数组切片可以。
流程控制
条件语句:if-else & else-if
选择语句:switch & case & select
循环语句:for & range
跳转语句:goto
其他关键字:break & continue & fallthrough
条件语句 if-else
package main
import (
"fmt"
)
func main() {
a := 1
if a > 3 {
fmt.Println("a > 3")
} else {
fmt.Println("a > 3 is fail")
}
}
警告:有返回值的函数中,if-else控制语句中不允许直接return
选择语句 switch
package main
import (
"fmt"
)
func main() {
i := 0
switch i {
case 0:
fmt.Println("0")
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
}
}
// print -> "0"
循环语句 for
package main
import (
"fmt"
)
func main() {
for i := 0; i < 10; i++ {
fmt.Println(i)
}
}
// print -> 1 ~ 9
函数
func (参数列表)(返回值列表) {
函数体 & 返回语句
}
不定参数
package main
import (
"fmt"
)
func myFunc(args ...int) {
for _, i := range args {
fmt.Println(i)
}
}
func main() {
myFunc(1, 2, 3, 4)
}
// print -> 1 2 3 4
警告:…type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数
匿名函数
func(a, b int) int{}
// 执行匿名函数
func(a,b int) int{}(1, 2)
// 赋值
f := func(a ,b int) int{}
闭包
package main
import (
"fmt"
)
func main() {
i := 5
f := func() func() {
j := 10
return func() {
fmt.Println(i, j)
}
}()
f()
i = 10
f()
}
// print -> 5 10
// print -> 10 10
错误处理
package main
import (
"errors"
"fmt"
)
func main() {
err := errors.New("this is a bug")
fmt.Println(err)
}
// print -> "this is a bug"