这是我参与第五届青训营伴学笔记创作活动的第 1 天
一.go语法基础
-
每个变量的都有自己的类型,
-
go变量的声明和初始化:
var a ="initial"var b string ="initial"c :="initial" -
for循环,唯一的循环
for i := 0; i < 3; i++ {
println("hahaha")}for{ //死循环
println("xixixixi")
break} -
if else
if 7%2==0{
println("fine")}else{
println("fififi")} -
switch case
a :=2switch a {case 1:
fmt.Println("is 1")case 2:
println("is 2")case 3:
println("is 3")} -
数组类型的定义和使用
var a [5]inta[4]=100;fmt.Println(a[4],len(a)) -
在go中很少用数组,因为数组是固定的,一般是用切片
s :=make([]string, 3) //通过make创建切片
s[0]="a"s[1]="b"s[2]="c"fmt.Println(s[2])fmt.Println(len(s))s =append(s,"d") **//通过append给切片动态扩容,**s =append(s,"e","f")fmt.Println(s)fmt.Println(len(s))``
c :=make([]string,len(s))copy(c,s); //可以通过copy进行切片拷贝fmt.Println(s[2:5]) **//取一定范围内的切片** -
map集合的介绍,在goland中,map是完全无序的,
myMap :=make(map[string]int, 10)myMap["one"]=1myMap["two"]=2fmt.Println(myMap["one"])valOne,ok :=myMap["one"] //可以通过ok判断key是否存在fmt.Println(valOne,ok)delete(myMap,"one") //delete删除对应的key-value -
goland中的遍历-for range
//数组的for rangea :=[]int{1,2,3}for i, aa := range a {
fmt.Println(i,aa)}//切片的for rangemyMap :=make(map[string]int)myMap["one"]=1myMap["two"]=2for k,v := range myMap {
fmt.Println(k,v)} -
指针
- go中的指针和c/c++的指针是比不了的,go中的指针操作很少,主要是用于地址传递修改值。
二.函数
-
go中的函数返回值可以有多个,对你没看错
-
一般第一个是返回真正的值,第二个返回错误信息。
func func1(info string)(v string,e bool){return "ok",true;}
三.结构体
-
go中只有结构体没有类概念
type Cat struct {Age int64 json:"age"Name string json:"name"} -
结构体可以作为参数传递
-
形参可以是指针,这样避免了大结构的拷贝,并且可以修改结构体的值
-
结构体方法,我个人感觉go中的结构体的方法很难看,为什么要这样写啊,一点都看不出来是结构体的方法、类成员函数,不如c++、c、java那样清晰,
func (c Cat) test() {fmt.Println(c.Name)}func (c *Cat) test1() int {fmt.Printf("方法中的cat的地址是:%p\n", c)c.Name = "bob"return 520} -
在go中结构体的私有和公有,没有private、public、protected这些修饰。是靠字段第一个字母是否大小写。那么这就带来了问题,在json序列化的时候,我们规定字段第一个字母是小写,这就不符合。
-
四.错误处理
-
func dealError(info string)(v string,e error){if info=="hello"{
return "hello",nil}return "nil",errors.New("not found")} -
调用函数就用两个值接收,
五.json序列化
-
前面提到了,结构体公有字段首字母要大写,那么我们就要使用tag标签告诉序列化这个字段首字母要小写。
Age int64 json:"age"Name string json:"name"jsonCat, err := json.Marshal(cat)//序列化的到的是数组,if err == nil {
fmt.Println(string(jsonCat))//必须要类型转换,因为序列化的到的不是字符串,}