1、Go语言
-
Go语言:Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
在学习今天的课程后,我觉得Go一些语法跟C语言、Java、python都有一些相似点,但它更简洁、高效。 -
使用范围:很多大厂(字节、美团、哔哩哔哩、百度、腾讯等)都有在使用Go语言;
通过前段时间寻找实习的过程中,看到的挺多oj也要求了解Go语言
2、 Go安装
- 下载
官网:go.dev/
打不开官网的话,可以尝试使用镜像网:studygolang.com/dl
打开GitHub缓慢,可以配置:goproxy.cn/
2、配置集成开发环境
可以选择安装 VS Code(or Goland ) ,VS Code则需安装 Go 插件
3、基础语法
- 包
- fmt:用于输出,
fmt.Println() - time:获取时间
- strconv:字符串和数值的转换
- math/rand:生成随机数
- fmt:用于输出,
- 变量
- 变量的类型
- 变量的声明
- var 变量名 [= 赋值] (类型会自动根据所赋的值的类型进行匹配,中括号表示可选)
- var 变量名 变量类型 [= 赋值](显式声明类型)
- 常量
- 常量的声明
- 将
var换成const即可 - 没有确定的类型,可根据上下文自动确定
- 将
- 常量的声明
- if else
- 写法同C类似,但
if、else if后的条件不用写小括号
- 写法同C类似,但
- 循环
- 只有
for一种循环 - 可以使用
continue、break - 同样的,
for后也不用加小括号,可以之间for i :=7; i<9; i++{...}
- 只有
- switch
- 同样的,
switch后也不用加小括号 switch后面可以不加条件,类似简化if else- 与C最大的不同点在于:若只想在对于case里执行,也不需要加break,即Go默认执行完对于case后就跳出
- 同样的,
- 数组
- var 数组名 [个数]类型
- 因为数组的长度是固定的,∴常用的是切片
- 切片
- 声明格式为: 名称 := make(类型,长度)
- 添加可以采用
append,注意要赋给切片 - 跟python切片应用的类型:s[0] 或 s[:2]
- map
- 声明格式
- 名称 := make(map[key类型]value类型)
- 名称 := map[key类型]value类型{key:value, key:value}
- var 名称 = map[key类型]value类型{key:value, key:value}
r, ok=m["key"]r为key对应的value,ok为0则map中不存在该key
- 声明格式
- range
- 常与
for搭配使用 - 返回两个值,第一个为索引index,第二个为对应值。若不需要索引,可使用_忽略
- 若遍历的是map,则第一个值是key,第二个值是value。example:
for k,v := range m{...}
- 常与
- 函数
- 函数的声明类似python,不同的是括号里变量类型的声明是后置的,example:func add(a int) int {...}
- 指针
- 用途:对常用的参数进行修改
- *:函数定义时使用 func add(n *int){*n += 2};一般的func ass(n int){...} 仅是对n进行拷贝,数值不会发生改变
- &:指向对应的地址,调用时使用。add(&n)
- 结构体
- 有点像Java里定义一个class
- 引用结构体的变量用
结构体名称.变量 - 结构体内可以定义变量和方法,类似于Java类里定义成员变量和成员方法
- 类成员函数和普通函数也有区别
- 普通函数的参数都在func 名称(参数1, 参数2...) {...}
- 类成员函数的结构体构造放在func (u user) 名称(参数...) {...}
- 错误处理
- 若该函数可能会发生错误,可以在定义函数的参数里(参数...,err error)
- 有error定义的方法的返回return有两个,一个是正常返回,
return 参数,nil; 一个是错误返回return nil, errors.New("not found") - 结合if else使用
- 字符串
- 方法
- 格式化
- 不用跟C一样区分%d、%s等等,直接使用%v
- "p=%v"、"p=%+v"、"p=%#v",输出越来越详细
- 保留位置%.2f
- JSON处理
- 结构体的变量首字母要大写
- 序列化:json.Marshal(..)
- 反序列化:json.Unmarshal(..)
- 时间处理
- time.Now()/time.Date()/time.Unix()等方法
- 数字解析
- steconv,ParseFloat(字符串,进制,整数精确值)
- strconv.Atoi(字符串)
- 进程信息
综合
- 随机数播种:利用时间戳,防止生成的随机数一直是一样的
rand.Seed(time.Now().UnixNano()) - 读取用户输入:
- 设置输入流(这里用到"bufio"、"os"):
reader := bufio.NewReader(os.Stdin) - 读取一行输入:
input,err := reader.ReadString('\n') - 读取一个字节:
b,err := reader.ReadByte() - 去掉换行符:
input = strings.TrimSuffx(input,"\n") - 转换成数字:
guess, err := strconv.Atoi(input) - 有err的都需要用
if err != nil判断是否有误
- 设置输入流(这里用到"bufio"、"os"):
- SOCKS5代理原理
代理像买家和卖家交易间的中间商——代理服务器。
三次握手、四次挥手是服务器之间进行的。
小结
今天初步认识了Go语言和一些语法结构,也通过案例的学习对语法有更深的印象,但由于接触Java时间较长,且Go的一些语法格式跟Java还是有较大区别,还是得逐步转换格式思维。此外,最后的两个案例还是听得似懂非懂,还是自己之前没有接触过这种api接口的应用、http请求,这块是自己比较薄弱的点!
呜呜呜感觉自己是菜鸡,希望青训营结束后可以变成比较强的菜鸡。