Go 语言基础
这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
变量声明
// 声明变量一般形式为使用关键字 var
var identifier type;
//多个变量
var identifier1, identifier2 type;
// 1,指定变量类型
var a int // 没有初始化,变量默认为 0 ;
var b bool // bool 没有初始化,变量默认为 false;
var c float32 = 3,2 //声明变量并初始化,为显示构造
// 2,根据值自行判断变量类型
var c = "hello";//声明一个变量并初始化
//3,使用 := 声明变量
d := "world"
// d := "world" 相当于
var d string
d = "world"
/*
var a int
a := 1
编译错误, a已经声明,不需要重新声明
*/
//多变量声明
//类型相同多个变量, 非全局变量
var a, b, c float32
a, b, c = v1, v2, v3
var a, b, c = v1, v2, v3 // 不需要显示声明类型,自动推断,并初始化
a, b, c := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
//空白标识符 _
_, a = 6, 7//6的值会被抛弃
常量
//显式类型定义
const a int = 1
//隐式类型定义
const b = 1 // 自己判断类型
条件语句
//if — else
var a = 10;
if a < 20 {
fmt.Printf("a 小于 20 大于15\n" )
}else if a < 15 {
fmt.Printf("a 小于 15\n" )
}else {
fmt.Printf("a 大于 20\n" )
}
//switch
a := 10
switch {
case a > 0 : {
fmt.Println("a > 0")
}
case a >5 : {
fmt.Println("a > 5")
}
default : {
fmt.Println("default")
}
}
//switch 支持多条件匹配
switch{
case 1,2,3,4:
default:
}
if 后应当紧跟一个括号,此括号可加可不加,if 表达式后面的大括号是必要的,不可省略。
循环语句
//1 类似for 循环
sum := 0
for i := 0; i <= 10; i++ {
sum += i
}
//2类似while语句
sum := 1
for ; sum <= 10; {
sum += sum
}
//3,无限循环
for {
sum++ // 无限循环下去
}
//Go 中的 break 与 continue 作用相同
数组
//声明数组
var nums [10] int
//数组初始化
var nums = [5]int{1,2,3,4,5}
nums := [5]int{1,2,3,4,5}
//通过[]来访问数组元素
nums[0] ...
切片
//make() 函数来创建切片
var s []string = make ([]string, 10)//10为切片长度
s := make ([]string, 10)//与上面同理
make([]T, length, capacity)//capacity 为切片的容量
s := arr[startIndex:endIndex]//将 arr 中从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
//默认 endIndex 时将表示一直到arr的最后一个元素。
s := arr[startIndex:]
//默认 startIndex 时将表示从 arr 的第一个元素开始。
s := arr[:endIndex]
numbers := []int{0,1,2,3,4,5,6,7,8}
fmt.Println("numbers[1:4] ==", numbers[1:4])//numbers[1:4] == [1 2 3]
//切片是可索引的,并且可以由 len() 方法获取长度。
//切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
var numbers = make([]int,4,6)//表示长度为4,容量为6
fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)//len=4 cap=6 slice=[0 0 0 0]
//copy将内容进行拷贝
//append添加一个元素
var numbers = make([]int,4,6)
numbers = append(numbers, 1)//向切片添加一个元素
fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)//len=5 cap=6 slice=[0 0 0 0 1]
var numbers1 []int
copy(numbers1,numbers)//拷贝 numbers 的内容到 numbers1
fmt.Printf("len=%d cap=%d slice=%v\n",len(numbers),cap(numbers),numbers)//len=5 cap=6 slice=[0 0 0 0 1]
范围
//关键字为 range, 可进行范围遍历
nums := [9]int{0,1,2,3,4,5,6,7,8}
for i, v := range nums {
fmt.Printf("%d %d\n", i, v)//i为idx ,v为值
}
指针
var a int = 100
var b int= 200
swap(&a, &b);
fmt.Printf("交换后 a 的值 : %d\n", a )//进行了值的交换
fmt.Printf("交换后 b 的值 : %d\n", b )
swap1(a, b);
fmt.Printf("交换后 a 的值 : %d\n", a )//值没有进行交换
fmt.Printf("交换后 b 的值 : %d\n", b )
func swap(x *int, y *int){
*x, *y = *y, *x
}
func swap1(x int, y int){
x, y = y, x
}
//函数传参均为值传递,而不是引用引用传递
函数
//函数的定义
func function_name( [parameter list] ) [return_types] {
函数体
}
func max(a, b int) int {
var result int
if (num1 > num2) {
result = num1
} else {
result = num2
}
return result
}
//go可返回多个值
func swap(x, y int) (int, int){
x := 1
y := 2
return x, y;
}
结构体
//定义一个结构体
type struct_variable_type struct {
member definition
member definition
...
member definition
}
//声明一个结构体:
type user struct {
name string
password string
}
//初始化一个结构体:
a := user{name: "wang", password: "1024"}
fmt.Printf("%+v\n", a) // {name:wang password:1024}
//未对一个结构体进行初始化,则结构体成员将采用默认值:
var b user
fmt.Printf("%+v\n", b) // {name: password:}
//如果要访问结构体成员,需要使用点号 . 操作符
fmt.Println(a.name) // wang
fmt.Println(a.password) // 1024
结构体方法
//检测密码是否匹配
func (u user) checkPassword(password string) bool {
return u.password == password
}
//可以修改密码的方法
func (u *user) resetPassword(password string) {
u.password = password
}
//此处为指针,进行修改
map
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
var mp map[string]string
mp = make(map[string]string)
//可以通过range来遍历
for k, v := mp {
fmt.Printf("%s -> %s\n", k, v)
}
错误处理
//常用
if err != nil {
fmt.Println(err)
}