这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。
这是一篇纯粹的记录golang基本使用的一些方式,仅仅记录了使用的一些常见的语法,各位看官可以结合自己擅长的编程语言进行理解,希望对你有用~
基础语法
1.1 变量定义
- 方式一:只声明一个变量:
var variable_name variable_type- 如:
var note string
- 如:
- 方式二:声明一个变量并赋初始值:
var variable_name [variable_type] = variable_value- 如:
var note = "这是一个笔记" - 或者:
var note string = "这是第一篇笔记"
- 如:
- 方式三:
variable_name := variable_value- 如:
note := "这真的只是一个笔记" - 这种方式不需要自己写变量类型,变量类型会自动推断
- 如:
- 常量声明:只要将var改成
const即可- 如:const MaxNum = 100
数组的声明定义也是一样的,使用
var variable_name []type或者variable_name := []type{}即可。
- 如:const MaxNum = 100
数组的声明定义也是一样的,使用
1.2 条件与循环
go没有while循环,或者说是for循环整合了while, 条件判断if与c/c++/java基本一样,先不赘述,if的嵌套和for的嵌套与c/c++/java/python一样。
- for循环
- 死循环:for { code... }
- 同其他语言的while循环:for condition { code... }
- 同其他语言的for循环:for var ; condition ; step { code...}
- switch case 在使用switch case中,形式也cpp类似,但是在执行完每一个case之后,不需要指定break,不会向下继续执行。
num := 100
switch num {
case 1:
println(num / 100)
case 10:
println(num / 10)
case 100:
println(num / 100)
default:
println("error")
}
1.3 数组与切片
通过var variable_name []type 或者 variable_name := []type{} 可以定义一个数组,数组的使用也是与c/cpp/java/python一样,直接使用[]就可以取对应下标的值。对于数组的遍历,可以有多种形式。
arr := []int {7, 2, 8, -9, 4, 0}
// 形式一
for i := 0; i<len(arr); i++ { println(arr[i])}
// 形式二
for index, val := range arr {
println("index = ", index, "value is ", val)
}
// 如果不需要使用下标,直接用一个下划线替代即可
for _, val := range arr {
println("val is ", val)
}
切片是为了更加灵活地去操作数组,数组在创建之后长度就是确定的,我们可以通过创建切片的形式,去动态扩容。我们可以通过make()去创建一个切片,通过append()方法去动态追加数据,可以通过[begin : end]去截取下标区间在[begin, end)的数据,但是不支持负数索引;arr[:-1]是会报错的
- make(type, length [, capacity])
arr := make([]int, 10), 创建一个长度为10的切片, 可以通过append()动态增加长度,不能越界访问;arr := make([]int, 6, 10), 创建一个长度为6,容量为10的切片,简单来说就是开辟了一个容量为10的区间,目前可以直接使用的只有6,当使用append()方法时,会先在已开辟的区间增加数据,当超过了这个容量,才进行双倍扩容。- 可以通过
len()函数去查看一个切片的长度,通过cap()去查看一个切片的容量
1.4 map
map是一种使用key和value的形式存储数据的数据结构,默认情况下无序;通过指定的key去获取相应的value;使用map的时候,记得用make()创建之后再使用,否则会报空指针异常。
- map的创建
// 方式一 先声明,再创建 var m map[string]string // 如果只有声明没有创建,会报空指针异常 m = make(map[string]string) m["k1"] = "v1" println(m["k1"]) // 方式二 memo := make(map[string]string) // 方式三 hashMap := map[string]string {"k1":"v1", "k2":"v2"} - map的遍历
for key, val := range hashMap { println(key, val) }
上面是map遍历的基本形式,如果在遍历过程中,只想拿到key或者value,可以将另外一个不需要使用的变量用_替代即可
1.5 struct与json
struct
一个结构体struct里可以定义多个变量;一个不大恰当的理解就是一个结构体就类似一个类的所有属性变量,需要调用结构体中属性的值,使用.的方式调用,如果需要给结构体创建方法,在声明函数的时候,在func后,函数名前加上(var_name variable_type) 即可。
- 定义结构体
type student struct {
name string // 直接换行,没有逗号,也没有分号
age int
id string
}
- 结构体方法
func (stu student) info(str string) {
println("going to print ", str)
stu.name = "zhang san"
println(stu.name)
stu.age = 18
println(stu.age)
stu.id = "1101100"
println(stu.id)
}
- json 定义一个json和定义一个struct基本一样,只要将struct中属性变量名的首字母大写,然后使用json.Marshal即可得到一个byte数组,需要使用string(variable)把它变成一个字符串。将json转成字符串之后,默认打印的变量名是大写的形式的,如果需要将某个变量边成小写,在该变量声明后面加上 `json: var_name`即可。
type userInfo struct {
Name string
Age int `json:"age"` // 这不是单引号,是键盘上排数字1左边的键 `
Hobby []string `json:"hobby"`
Phone []int
}
func jsonTest() {
user := userInfo{Name: "zs", Age: 18, Hobby: []string{"a", "b", "c"}}
println(user.Name)
println(user.Age)
usr, err := json.Marshal(user)
if err == nil {
str := string(usr)
fmt.Printf("%#v", str)
}
for ind, val := range usr {
println(ind, val)
}
}
1.6 异常
go中的异常,是以返回值的形式进行抛出的,需要在接收返回值的时候同时接收异常。如果需要抛出异常,使用 errors.New(message string)将异常信息返回。如果不想接收抛出的异常,可以使用_去接收。
就就就先写到这吧~ 文中有什么不足/错误的地方,欢迎大家在评论区指正啦~