这是我参与「第五届青训营 」伴学笔记创作活动的第 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,并在该选项上打勾--->重启--->之后运行在终端输出