Go基础入门|青训营笔记

71 阅读3分钟

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

基础语法

1.变量的声明方式

①var 变量名=变量值;
隐式表达:var a="initial";(自动推导变量类型)
显式表达:var b int=2;
②变量名 := 变量值
f :=float32(e)

2.常量的表达方式

与变量的声明方式类似,将var改为const

3.if-else

①if后的判断条件无括号(),若加了括号,编译器会忽略括号内的内容
②if后的执行语句必须加中括号{}

if 7%2==0 {
    fmt.Println("7 is even")
}

4.循环

只有唯一的一种 for 循环
同if-else,判断条件无括号,执行语句必须加中括号

for {  
    fmt.Pringln("loop")
    break;//死循环
}

for j:=7;j<5;j++{//三段中任意一段均可省略
    fmt.Pringln(j)
}

5.switch

①switch后的判断变量无需括号,支持各种类型的变量;
②switch中的case语句无需加break语句截断

switch a {
    case 1:
        fmt.Println("1")
    case 2:
        fmt.Println("2")
    default:
        fmt.Println("default")
}

③switch后可不跟判断变量,在case中撰写条件,实现if-else的功能;

switch {
    case a<12:
        fmt.Println("<12")
    default:
        fmt.Println(">=12")
}

6.数组

固定长度

var a[5] int//声明
a[4]=100//赋值
fmt.Println(a[4],len(a))//打印第四个值

b:=[5]int{1,2,3,4,5}//声明与赋值
fmt.Println(b)//打印

7.切片slice

①长度可变,可在任意时刻修改长度;
②声明:s:=make([]string,3) (3定义的值为切片长度)
赋值:s[0]="a"
复制:

c:=make([]string,len(s))
copy(c,s)

打印:

fmt.Println("get",s[2])//打印s[2]
fmt.Pringln("len",len(s))//打印切片长度

fmt.Println(s[2:5])//取出s中第2、3、4个元素
fmt.Println(s[2:])//取出s中第2个元素及其后面所有元素
fmt.Println(s[:5])//取出s中第5个元素及其前面所有元素

增加元素:s=append(s,"d","e")
!注意:append后的结果必须赋值给原数组才能完成增加元素的操作。因为在 Golang中,切片是一个储存了长度、容量和指向数组的指针的抽象数据结构,在 append时,如果容量不够,则将进行扩容操作,返回一个新的 slice,故而需要将结果赋值给原 slice

8.map

在其他语言中,类似地有哈希、字典,是一种常用的数据结构
①声明:m:=make(map[string] int)
map的声明需要两种数据类型,用方括号括起的为 key的数据类型,后者为 value的数据类型,key和 value一一对应,构成 k-v对
②赋值:m["one"]=1
③打印:fmt.Println(m) fmt.Println(m["one"])
④删除:delete(m."one")
⑤用ok来判断map中是否存在k-v对

r,ok:=m["unknown"]
fmt.Println(r,ok)//打印结果:0 false

⑤k-v对在map中的顺序是无序的,在遍历时不会按照字母顺序或插入顺序进行,而是随机地进行遍历

9.range

一种遍历slice和map的方法 image.png

10.函数

func 函数名(参数名 参数类型,...) 返回类型{}
①返回类型后置
②返回类型可有两个
func exists()(v string,ok bool)

11.指针

传入类型为指针类才可同步修改传入的变量,在调用传入时也应加上&符号匹配类型

func add2ptr(n *int){
    *n +=2
}

//main函数中调用
n:=5
add2ptr(&n)//类型匹配

12.结构体

一个含有多字段的集合
①定义

type user struct{
    name string
    password string
}

②初始化
显示初始化时可以只赋值一部分字段,剩余字段将默认初始化为空;隐式初始化则必须赋值所有字段,按顺序赋值

a:=user{name:"wang",password:"1234"}
b:=user{name:"wang"}
c:=user{"wang","1234"}

③赋值
c.name="liu"
④定义方法
结构体的方法类似于其他语言中的类成员函数,在func后写上(变量名 结构体类型)即可将其声明为结构体的方法
不带指针:

func (u user)checkPassword(password string) bool{
    return u.password==password;
}

带指针 可修改结构体

func (u *user)resetPassword(password string){
    u.password=password
}

13.错误处理

使用前需import"errors"
无错误 return nil
有错误 return nil,errors.New("错误原因")
!若有错误处理,需用判断语句确保在无错误的情况下对其他变量进行操作
image.png

14.字符串操作

使用前需import"strings"
image.png

15.字符串格式化

image.png

16.json处理

image.png

17.时间处理

image.png

18.数字解析

三个参数分别代表(须解析的字符串,字符串进制(0则自动识别),解析结果的精度) image.png

19.进程信息

image.png