Go语言基础语法 | 青训营笔记

63 阅读2分钟

1、Go语言

  1. Go语言:Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
    在学习今天的课程后,我觉得Go一些语法跟C语言、Java、python都有一些相似点,但它更简洁、高效。

  2. 使用范围:很多大厂(字节、美团、哔哩哔哩、百度、腾讯等)都有在使用Go语言;
    通过前段时间寻找实习的过程中,看到的挺多oj也要求了解Go语言


2、 Go安装

  1. 下载

官网:go.dev/
打不开官网的话,可以尝试使用镜像网:studygolang.com/dl
打开GitHub缓慢,可以配置:goproxy.cn/

2、配置集成开发环境

可以选择安装 VS Code(or Goland ) ,VS Code则需安装 Go 插件


3、基础语法

    • fmt:用于输出, fmt.Println()
    • time:获取时间
    • strconv:字符串和数值的转换
    • math/rand:生成随机数
  • 变量
    • 变量的类型
    • 变量的声明
      1. var 变量名 [= 赋值] (类型会自动根据所赋的值的类型进行匹配,中括号表示可选)
      2. var 变量名 变量类型 [= 赋值](显式声明类型)
  • 常量
    • 常量的声明
      • var换成const即可
      • 没有确定的类型,可根据上下文自动确定
  • if else
    • 写法同C类似,但ifelse if后的条件不用写小括号
  • 循环
    • 只有for一种循环
    • 可以使用continuebreak
    • 同样的,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
    • 声明格式
      1. 名称 := make(map[key类型]value类型)
      2. 名称 := map[key类型]value类型{key:value, key:value}
      3. 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(字符串)
  • 进程信息

综合

  1. 随机数播种:利用时间戳,防止生成的随机数一直是一样的rand.Seed(time.Now().UnixNano())
  2. 读取用户输入:
    1. 设置输入流(这里用到"bufio"、"os"): reader := bufio.NewReader(os.Stdin)
    2. 读取一行输入: input,err := reader.ReadString('\n')
    3. 读取一个字节: b,err := reader.ReadByte()
    4. 去掉换行符: input = strings.TrimSuffx(input,"\n")
    5. 转换成数字: guess, err := strconv.Atoi(input)
    6. 有err的都需要用if err != nil 判断是否有误
  3. SOCKS5代理原理
    代理像买家和卖家交易间的中间商——代理服务器。
    三次握手、四次挥手是服务器之间进行的。

1683899525190.png

小结

今天初步认识了Go语言和一些语法结构,也通过案例的学习对语法有更深的印象,但由于接触Java时间较长,且Go的一些语法格式跟Java还是有较大区别,还是得逐步转换格式思维。此外,最后的两个案例还是听得似懂非懂,还是自己之前没有接触过这种api接口的应用http请求,这块是自己比较薄弱的点!
呜呜呜感觉自己是菜鸡,希望青训营结束后可以变成比较强的菜鸡。