go基础知识 | 青训营笔记

118 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天。 首先是对于课程的学习,主要是包含课程的知识学习。

package main --程序的入口包

import {'fmt'}---导入标准库中的fmt包,这是输出格式化字符串

fmt.Println("hello world") 打印输出

go的数据类型:整数、字符串、浮点数、布尔类型

变量申明:

(1)var a=“initial”,自动判断变量的数据类型 / var b,c int =1,2 指明数据类型

(2)var e float64; f :=float32(e)

常量申明:

const s string="initial" -----根据上下文,自动判断/ const s="initial"

if...else(与一般的不同点):

(1)if 7%2==0{...}---if后面没有括号(如果加上括号,编译器编译时,也会自动去掉括号)

(2)if后面必须是大括号,不能像C/C++可以直接写在一行

for循环(golang中没有while/do...while循环):

for{...}--不写条件,是一个死循环

for j :=7;j<9;j++--循环条件

continue继续循环,break跳出循环

switch...case分支结构:

不需要加break(C/C++中不加break,则会继续向下,进入下一个分支)

switch{

case t<12: //条件在case中写

fmt.Println("hahhh")

}

数组:

var a [5]int --定义数组

切片:

s :=make([]string,3) //make创建一个切片

s= append(s,"d") //需要append结果赋值回原数组

slice的原理:存储了一个长度和一个容量以及一个数组的指针,在进行append时,如果容量不够,则会扩容返回新的slice

另一种赋值:

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

copy(c,s) //copy拷贝sclice中的数据

s[2:5] //取出下标从2到5(不包括5)位置的元素

map(哈希、字典)--无序,遍历时随机输出

m :=make(map[string]int) //创建一个map类型(包括key和value),key为字符串类型,value为int类型

m["one"]=1 --赋值

delete(m,"one")--删除

r,ok :=m["unknow"] //ok用来获取map中是否存在该键

range

遍历数组:

nums :=int{2,3,4}

for i,num :=range nums{fmt.Println("index:",i,"num:",num)} 遍历数组回返回两个值,一个是索引,一个是数组索引对应值

如果不需要索引,可以用下划线来忽略

遍历map:

m :=map[String]string{"a":"A","b":"B"}

for k,v :=range m{fmt.Println(k,v)}

函数:

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

func exist(m map[String]string,k string)(v string,ok bool){v,ok=m[k],return v,ok} //可以返回多个值,第一个值是结果,第二个是错误信息

指针:---对参数进行修改
结构体:---带类型的字段的集合

type user:struct{

name string

password string

}

(1)a :=user{name:"mm",password:"111"}

(2)b :=user{"mm","111"}

(3)c :=user{name:"mm"}

c.password="111"

(4)var d user

d.name="mm"

d.password="111"

普通函数:func fun1(u *user,password string) bool{} //带上指针,能对结构体进行修改

类成员函数:func (u *user)fun2(password string){}

字符串操作:

Contains---判断一个字符串中是否含有另外一个字符串

Count--计算字符串个数

HasPrefix--判断字符串的前缀

HasSuffix--判断字符串的后缀

Index--查找某个字符串的位置

Join--连接字符串

Repeat--重复

Replace--替换

Split--切分

ToLower--变成小写

ToUpper--变成大写

打印输出:

fmt.Println(s)

fmt.Printf("s=%v\n",s)-----%v输出任意类型的值(字段的值)+v(字段的名字和值),#v输出更详细的信息(结构体整个构造的类型名称和字段名字和值)

fmt.Printf("0.2f\n",f) //输出保留两位小数的值

JSON:

结构体定义中,字段首字母大写,该结构体可以用json.Marshal实现序列化,序列化之后会变成一个数组,需要使用string进行强制转化,打印输出,否则可能输出16进制编码

序列化后字符串使用json.unMarshal进行反序列化

默认序列化出来的字符串,是以大写字母开头,而不是下划线,可以在后面使用json tag等语法来修改输出JSON结果里面的字段名。

如:Age int 'json:"age"'-----输出的age变成小写

时间处理

time.Now()---获取当前时间

time.Date()---构造时间

t=time.Date(2022,3,27,1,25,36,0)

通过t.Year(),t.Month(),t.Day(),t.Hour(),t.Minute() 获取具体信息

t.Format("2006-01-02 15:04:05")---格式化(用一个具体的时间来表示,而不是YY-MM-DD,并且必须是"2006-01-02 15:04:05"这个时间,否则格式化后的时间不正确)

t1 :=t2.Sub(t)---时间减法

now.Unix()----获取时间戳 (时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数)

t3=time.Parse("2006-01-04 14:22:11","2022-06-14 13:10:44")---解析时间

==---用于判断时间是否相等

字符串和数字之间的转换(使用strconv包)

strconv.ParseInt / strconv.ParseFloat----解析字符串

strconv.ParseInt(s,base,bitSize)

f :=strconv.ParseInt("1.234",64,10)---第一个(s)表示要转换的字符串,第二个(base)表示进位制,第三个(bitSize)指定整数类型;如果base为0,则根据字符串的前缀判断进位制(0x:16,0:8,其他:10),如果s是合法的格式,s转换后超出了bitSize的范围,则转换后的结果为2的bitSize幂次方。

对于strconv.Float(s,base,bitSize)--如果s是合法的格式,而且接近一个浮点值,则返回浮点数的四舍五入值(根据IEEE754的四舍五入标准),如果s不是合法格式,则返回“语法错误”,如果转换结果超出bitSize范围,则返回“超出范围”

strconv.Atoi--将一个十进制字符串快速转化为一个数字

n=strconv.Atoi("123")---123

如果输入不合法,则会返回错误(invalid syntax):strconv.Atoi("AAA")

进程信息

os.Args---获取进程执行时的一些命令行参数

os.Getenv("PATH")----获取环境变量

os.Setenv("AA")----写入环境变量

exec.Command---快速启动子进程,并获取一些输入输出

if...else---else必须要紧挨着if反括号之后,否则会报错

if 7%2==0{

fmt.Println("7 is even")

}else{

fmt.Println("7 is odd")

}

猜字谜游戏

随机数使用:导入--math/rand

n=rand.Intn(100)---这样直接使用会导致每次输出的结果一样(未设计随机数种子)

在程序启动的时候使用启动的时间戳初始化随机数种子---rand.Seed(time.now().UnixNano())

同时在实现这个猜字谜游戏时,出现问题:vscode控制台不能输入

解决方法:首选项-->设置-->搜索runinterminal,并在该选项上打勾--->重启--->之后运行在终端输出