主要记录的是与其他语言比较不一样的知识点
最简单的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协议的实时性比较好,通常用于视频直播相关领域。