最近参加字节跳动后端青训营,技术栈是go。go跟Java还是有些区别的,所以自己做点笔记来总结总结go的基础语法
数据类型
go的数据类型有以下几类:
- 数值类型:整形分为(u)int8、(u)int16、(u)int32、byte、rune、uintptr…,浮点型分为float32、float64、complex32、complex64(复数类型,复数分为实数和虚数,高中知识…)
- 布尔类型
- 字符串类型
- 派生类型:切片、指针、数组、结构(struct)、Channel类型、函数类型、接口类型
字符串类型说明:
- 字符:go无char,想要表示单个字符时,进包含acill码时用byte,其余用rune(类似int32)。tips:直接输出为数字,向输出字符用%c(不同于Java)
var c rune = 'a'
fmt.Println(c)
fmt.Printf("%c\n", c)
以上输出为
- 字符串:
字符串是基本数据类型
双引号转义输出,点号原生输出:
str3 := "我要换行\n换好啦:)\n"str4 := `我想换行\n换不了:(\n`
派生类型
- 切片:为可变长的数组,当空间不足时,底层自动复制扩容,类似于List
var slice []intslice1 := make([]int,5)fmt.Println("slice slice1:",slice,slice1)
- 指针
go里的指针与c语言类似
var ip *int
var name *string
&获取地址,*取地址里的内容
var name = "fdsa"
var namestr *string
namestr = &name
fmt.Println(namestr)//输出地址
fmt.Println(*namestr)//输出fdsa
3.map,创建并声明一个map:
package mainimport ("fmt"
)func main() {myMap := map[string]int{"apple": 1,"banana": 2,"cherry": 3,}// 遍历 map 的键值对for key, value := range myMap {fmt.Printf("Key: %s, Value: %d\n", key, value)}
}
用range来遍历一个map,第一个位置是key,第二个位置是value,如果不需要key只遍历value的话,第一个位置用_代替
for _,value := range myMap {fmt.Println("Value:", value)
}
- 数组
var arr []int = []int{1, 2, 3, 4, 5}
for i, v := range arr {fmt.Printf("Index: %d, Value: %d\n", i, v)
}
变量声明
- go中声明过的变量不使用会报编译错误
- 声明变量一般使用var关键字,可以指定变量类型也可以由编译器自动推断:
var url string="fa"//手动指定
fmt.Println(url)
var name ="fdsa"//自动推断
fmt.Println(name)
- 可用:=一步完成变量的声明和初始化
pass := "fds"
fmt.Println(pass)
- go的变量类型是后置的,一定是先写变量名,再写变量类型!
控制语句
if else
go里的if、else if的条件没有():
a := 10
if a < 10 {fmt.Println("小于")
} else if a > 10 {fmt.Println("大于")
} else {fmt.Println("等于")
}
循环
go里面没有while、dowhile,只有for,最简单的for循环就是一个for后面什么都不写,就是死循环:
for {fmt.Println("11")
}
经典三段式for:
for i := 0; i < 10; i++ {fmt.Println(i)
}
和其他语言一样,每一段都可以省略,也可用continue、break跳出循环
swich
和其他语言大差不差
函数
go里面函数使用func声明,并且原生支持返回多个值,实际业务中,通常第一个是返回的真正结果,第二个是错误信息。注意go的变量类型是后置的
//实现两数相加
func add(a int, b int) (result int, e string) {result = a + breturn result, "ok"
}