后端go语言基础|青训营笔记

42 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

本节课的重要知识点

1.切片

//定义
s:=make([]string,3)//第一种
a:=[]string{"n","i","c","e"}//第二种

中括号后面的为切片的数据类型
切片比数组使用的范围更广,因为切片可以在任意时候改变大小。
下面介绍切片append的用法

a:=[]string{"n","i","c","e"}
a=append(a,"d")
a=append(a,"e")

当使用append时,务必要写成此种形式,因为append返回的是一个新的切片不是直接改变原来的切片,因此使用append之后还要重新赋值回去。
另外还有一个重要的点就是,go里面的切片是不支持负数索引的。

2.map

map是使用频繁的数据结构,下面看看它的代码

m :=make(map[string]int)
m["one"]=1
m["two"]=2

m1 :=map[string]int{"one":1, "two":2};
var m2=map[string]int{"one":1, "two":2};

以上都是map的定义及赋值形式
map还有一个特殊的用法

i := m["route"]//如果route这个键存在就返回那个值
//如果不存在根据value的类型如果是string返回“”,如果是int就返回0。
i,ok:=m["ttt"];
//一般用此句来检测map中的ttt键是否删除成功,i返回0,ok返回false

这里可以参考go语言圣经里的一段解释

map还有一个重要的特点是元素的排列是无序的,完全随机。

package main

import (
	"fmt"
)

func main() {
	m1 := map[string]int{"one": 1, "two": 2}
	var m2 = map[string]int{"one": 1, "two": 2}
	for k, v := range m1 {
		fmt.Println(k, v)
	}
	for k, v := range m2 {
		fmt.Println(k, v)
	}
}

image.png

从以上的代码运行结果和代码来看确实如此。

3.range遍历

数组遍历第一个位置i(index)是索引,第二个位置num是该位置的值;map遍历第一个位置k(key)是键,第二个位置v(value)是值

另外数组遍历时若不想遍历索引可以使用下划线代替i位置

package main

import "fmt"

func main() {
	a := [3]int{1, 2, 3}
	for _, num := range a {
		fmt.Println(num)
	}
}

4.函数

go里面的函数是支持多个返回值的,在真正的业务代码逻辑中第一个值返回的是真正的值,第二个返回值是错误信息。 下面是一个有两个返回值的函数

package main

import "fmt"

func add(a int, b int) (int, int) {
	return a, b
}

func main() {
	a, b := add(1, 2)
	fmt.Println(a, b)//1 2
}

5.JSON处理

结构体里面的字段首字母必须要大写才可以用jsno调用marshal函数,打印时需要用强制字符串类型转换,否则会打印出一些16进制的编码。

序列化之后也可以反序列化到一个空的变量里面

一般输出都是按照字段名输出,如有特殊要求可以加一个tag标签控制json的输出。

package main

import (
	"encoding/json"
	"fmt"
)

type human struct {
	Name string
	Age  int `json:"age"`
	sex  string
}

func main() {
	a := human{"wang", 18, "男"}
	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf)
	fmt.Println(string(buf))
}

image.png

总结

总体来说今天只是go语言的基础部分,难点不多,只是需要记一些语法上的规范,有一些代码的规范和我之前学的c++比起来有很大的不同,因此需要适应一段时间。今天的笔记就分享到这里,明天继续加油。