青训营笔记1:Go 语言入门指南| 青训营

74 阅读3分钟

主要记录的是与其他语言比较不一样的知识点

最简单的go程序

package main
import "fmt"func main(){
    fmt.Println("Hello World!")
}

首先要注意第一行一定是包名,在其它包的地方通过包名.xx的方式调用其中的结构体或者方法。

其次import包的地方,有一些比较方便的操作,但是在goland等编译器中会自动将其补充完整,实在是很方便,不需要自己一个一个地导入。在要使用包的时候通过go get方法获取,或者写好了import后再go mod tidy下载包。

最后是fmt包的使用,最常用的是Println 和 Printf("%#v"),%#v可以打印出结构的内部数据。

变量和常量

标准声明 var 变量名 变量类型

更多的时候是类型推断直接声明 变量名 := 100

常量 const A = 100 (比较特殊的地方有iota)

流程控制

有if for switch

其中for循环能够有充当while的方法,即在for循环的初始条件里什么都不写。

for index,item := range List 可以循环数组或切片

花括号必须紧跟控制开始的地方

数组和切片、map

定义数组即长度固定: var a [3]int 或 a := [3]int{1,2,3}

切片的长度,容量都是不定的: var a []int 或 a := make([]int,size,cap)

切片加入元素 a = append(a,item)

字典: map1 := make(map[keyType]valueType,[cap]) 最好是初始化字典的容量,因为如果不断加入新的key,将需要大量扩容操作。

字典判断键是否存在: value,ok := map[key]

遍历字典:for k,v := range map

删除某个键值对:delete(map,key)

函数

函数的完整定义:

func (接口方法的接口名 接口变量名) 函数名(输入变量名 输入类型) (输出变量名 输出类型)

匿名函数

add := func(...)...

defer

先正向进行所有的函数,当运行到defer的时候,会将defer的函数的所有参数都确定并传入到一个类似于栈的原理中,最后在要return之前倒序执行所有的defer语句。其用处是用来断开连接、释放资源等。

指针

取地址& 取值* 同c但是安全指针

指针类型变量 *int

new函数返回值是一个类型的指针,适用于struct等。make只适用于slice,map,channel,返回的是类型本身。

结构体

定义

type 类型名 struct{
    字段名 类型 标签
    ...
}

json数据化

json.Marshal/json.Unmarshal

标签

json:"id" 序列化时的key

Error

通常error是最后一个返回值,默认0值为nil(无错),fmt.Perror打印错误。

创建错误 errors.New("invalid parameters")

反射

通过relect包获知变量信息。

并发

通过goroutine创建一个类似线程。go func

阻塞等待:

var wg sync.WaitGroup 有新goroutine时 wg.Add() 需要等待的地方 wg.Wait() goroutine结束时 wg.Done()

goroutine之间数据的传输: channel

网络编程和文件操作

Socket是BSD UNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。

UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。