第一节课做的笔记

83 阅读4分钟

Go语言的优点

  • 高性能,高并发
  • 语法简单,学习曲线平缓
    • 就是好学呗
  • 丰富的标准库
    • 很多东西不用引用第三方库就可以实现
    • 又全又好用(心动~)
  • 完整的工具链
  • 静态链接
  • 快速编译
    • 能让C++程序员羡慕到哭
  • 跨平台
    • 能在LInux,Widows,MacOS上运行
    • 还能在自己电脑上编译好一个可执行文件放到路由器上执行
  • 垃圾回收

变量的定义方式

  • var name=value
  • name:=value
    • 感觉可以理解为,把var这个单词,简化成冒号了
  • var name type
    • 之后赋值的时候再
    • name =value

常量的定义方式

  • const name type = value

for关键字的使用

  • 和C语言的区别之处
    • for后面不用加小括号
  • 用法
    • 去掉括号后的经典C语言for循环三个条件
    • 也可以看情况去掉后面紧跟的三个条件
    • 也可以就 单独一个for,后面就是大括号,这个就是一个死循环了
    • continue和break和C语言用法相同

强大的switch

  • 和C语言不同的是,不需要break,到了每个case运行对应的代码段之后就退出了
  • 也可以switch后面不加变量,每个case后面接上判断条件
  • 甚至还可以用他取代if else语句

数组和切片

  • 数组定义方式:var name [number]type
  • 不过在实际开发中,数组并不如切片更常用,因为数组长度是固定的
  • 切片方式:可以任意地更改切片的长度
  • 切片的定义方式: name :=make([]type, lenth)
    • 其实就是相比数组的定义方法,方括号里面不指定长度,就是一个切片了
  • 切片加入元素的方式: name = append(name , value)
    • 这就把value这个值加入到name这个切片中去了
    • 小tips:如果知道某个切片的大致最终长度,可以在定义的时候就指定长度,不够了再append,如果一开始定义一个空的切片,之后一次一次地将其变长,速度是要慢一些的
  • 切片一个很好用的功能: newname := name[a:b]
    • 就会将name切片,从下标a到下标b-1 裁剪出来,赋值给newname

map

  • 特别好用的数据结构

  • 在其他语言中名字为哈希或者字典

  • 创建方式: name:= make(map[keytype]type)

    • 其中keytype是key值的类型,type是数据的类型
    • 使用的时候可以根据key的值找到其对应的数据
  • 想要知道某个key对应的值存在与否。 可以使用以下方式

    • r, ok := name[keyvalue]
      
    • 如果ok返回的是true,则说明存在,如果返回false,则说明不存在

  • 且map的一个特点,一个map中所有的键值对是完全无序的

range

  • 用于遍历
  • 需要了解的地方:其返回的第一个值是索引,第二个值才是遍历到的值
    • 如果不需要索引,可以用下划线 "_"放在索引的位置,同理,其他如果有不想要的返回值,就可以用下划线放在对应的位置上

函数

  • golang的函数是原生支持返回多个值的。通常第一个值是返回的结果,第二个值是报错的信息

指针

  • 相比C的指针,golang的指针作用非常有限。主要用于修改值(指针受苦者福音)
  • 用法和C语言差不多

结构体

  • 基本用法和C类似
  • 在golang中可以为结构体定义方法,比较像其他语言的类的成员函数

错误处理

  • 在某个函数的返回值列表里面加一个error
  • 常用的判断错误方法:
    • 调用一个函数的时候,接收返回值,除了要用的那些数据,还接收error返回值,紧接着就判断error是否带有报错信息,有的话,就进行对应的处理

字符串格式化

  • 对于printf,你可以用
    • %v来打印任意类型的变量
    • %+v打印字段的名字以及值
    • %#v打印出结构体整个构造的类型名称,字段和值

Json操作

  • 对于go语言的结构体,只需要保证结构体每个字段,第一个字母是大写(表示公开性),然后调用json.Marshal就可以将其转换成“字符串类型”
  • 同理Unmarshal的功能就是反过来

时间处理

  • 最常用的操作就是time.Now() ,可以快速获取当前时间
  • time.Date构造一个带时区的时间
  • time.Sub获得一个时间段当前时间与传入的时间,相差多少分钟多少秒

进程信息

  • os.Args()获取进程在执行的时候的一些命令行参数
  • os.Getenv()获取环境变量
  • os.Setenv()写入环境变量
  • exec.Command()创建子进程,并且获得其输入输出