Go语言
算盘
喜欢徒步,喜欢读书
展开
-
GO类型相同
Go 是强类型的语言,编译器在编译时会进行严格的类型校验。两个命名类型是否相同,参考如下1、两个命名类型相同的条件是两个类型声明的语句完全相同。2、命名类型和未命名类型永远不相同。3、两个未命名类型相同的条件是它们的类型声明宇面量的结构相同,并且内部元素的类型相同。4、通过类型别名语句声明的两个类型相同。...原创 2021-09-23 11:26:22 · 413 阅读 · 0 评论 -
go语言关键字分类
1、引导程序整体结构的8个关键字package 定义包名import 导入包名const 常量声明var 变量声明func 函数定义defer 延迟执行go 并发语法糖return 函数返回2、声明符合数据结构的4个关键字struct 定义结构类型interface 定义接口类型map 声明或创建map类型chan 声明或创建通道类型3、控制程序结构的13个关...原创 2021-09-19 08:33:53 · 397 阅读 · 0 评论 -
未命名类型转换规则
所属类型相同基础类型相同,且其中一个是未命名类型数据类型相同,将双向通道赋值给单向通道,且其中一个位未命名类型将默认值nil赋值给切片、字典、通道、指针、函数或接口原创 2021-09-15 08:49:28 · 197 阅读 · 0 评论 -
Go语言中递归与迭代的区别
递归:重复调用函数自身实现循环称为递归;迭代:利用变量的原值推出新值称为迭代,或者说迭代是函数内某段代码实现循环;原创 2021-09-10 13:07:56 · 188 阅读 · 0 评论 -
Context接口
context.Context是一个接口,该接口定义了四个需要实现的方法。具体签名如下:type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{}}Deadline方法需要返回当前Context被取消的时间,也就是完成工作的截止时间(deadline);...原创 2021-09-05 09:43:34 · 489 阅读 · 0 评论 -
GO文件操作相关API
func Create(name string) (file *File, err Error)根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666func NewFile(fd uintptr, name string) *File根据文件描述符创建相应的文件,返回一个文件对象func Open(name string) (file *File, err Error)只读方式打开一个名称为name的文件func OpenFile(name string, flag int, pe原创 2021-09-01 21:36:19 · 291 阅读 · 0 评论 -
etcd具有以下特点
1、完全复制:集群中的每个节点都可以使用完整的存档2、高可用性:Etcd可用于避免硬件的单点故障或网络问题3、一致性:每次读取都会返回跨多主机的最新写入4、简单:包括一个定义良好、面向用户的API(gRPC)5、安全:实现了带有可选的客户端证书身份验证的自动化TLS6、快速:每秒10000次写入的基准速度7、可靠:使用Raft算法实现了强一致、高可用的服务存储目录...原创 2021-08-28 11:36:31 · 824 阅读 · 0 评论 -
Go语言中的操作系统线程和goroutine的关系
1.一个操作系统线程对应用户态多个goroutine。2.go程序可以同时使用多个操作系统线程。3.goroutine和OS线程是多对多的关系,即m:n。原创 2021-08-14 16:28:54 · 310 阅读 · 0 评论 -
并发的介绍
进程和线程1.进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。2.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。3.一个进程可以创建和撤销多个线程;同一个进程中的多个线程之间可以并发执行。并发和并行1.多线程程序在一个核的cpu上运行,就是并发2.多线程程序在多个核的cpu上运行,就是并行协程和线程协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现原创 2021-08-07 17:53:12 · 287 阅读 · 0 评论 -
webSocket是什么
webSocket是什么1、WebSocket是一种在单个TCP连接上进行全双工通信的协议2、WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据3、在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输4、需要安装第三方包:cmd中:go get -u -v github.com/gorilla/websocket...原创 2021-08-01 15:25:49 · 956 阅读 · 0 评论 -
GO中的稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法是:1、记录数组一共有几行几列,有多少个不同的值2、把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模...原创 2021-07-29 14:40:20 · 106 阅读 · 0 评论 -
为什么会出现粘包
主要原因就是tcp数据传递模式是流模式,在保持长连接的时候可以进行多次的收和发。“粘包”可发生在发送端也可发生在接收端:1.由Nagle算法造成的发送端的粘包:Nagle算法是一种改善网络传输效率的算法。简单来说就是当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。2.接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。当应用层由于某些原因不能及时的把T原创 2021-07-15 08:33:06 · 633 阅读 · 0 评论 -
Go语言实现UDP通信
UDP协议UDP协议(User Datagram Protocol)中文名称是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。...原创 2021-05-16 16:56:28 · 139 阅读 · 0 评论 -
Go语言实现TCP通信
TCP协议TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。TCP服务端一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就原创 2021-04-19 16:25:51 · 167 阅读 · 0 评论 -
接口的定义
接口是一个或多个方法签名的集合。 任何类型的方法集中只要拥有该接口'对应的全部方法'签名。 就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。 这称为Structural Typing。 所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。 当然,该类型还可以有其他方法。 接口只有方法声明,没有实现,没有数据字段。 接口可以匿名嵌入其他接口,或嵌入到结构中。 对象赋值给接口时,会发生拷贝,而接口内部...原创 2021-04-11 21:22:51 · 605 阅读 · 0 评论 -
延迟调用(defer)
defer特性: 1. 关键字 defer 用于注册延迟调用。 2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。 3. 多个defer语句,按先进后出的方式执行。 4. defer语句中的变量,在defer声明时就决定了。 defer用途: 1. 关闭文件句柄 2. 锁资源释放 3. 数据库连接释放defer是先进后出...原创 2021-04-03 20:06:32 · 223 阅读 · 0 评论 -
函数参数
函数定义时指出,函数定义时有参数,该变量可称为函数的形参。形参就像定义在函数体内的局部变量。但当调用函数,传递过来的变量就是函数的实参,函数可以通过两种方式来传递参数:值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。在默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。注意1:无论是值传递,还是引用传递原创 2021-03-30 17:27:33 · 129 阅读 · 0 评论 -
golang函数特点
1、无需声明原型2、支持不定变参3、支持多返回值4、支持命名返回参数5、支持匿名函数和闭包6、函数也是一种类型,一个函数可以赋值给变量7、不支持 嵌套 (nested) 一个包不能有两个名字一样的函数8、不支持 重载 (overload)9、不支持 默认参数 (default parameter)...原创 2021-03-22 16:32:46 · 107 阅读 · 0 评论 -
循环控制Goto、Break、Continue
1.三个语句都可以配合标签(label)使用2.标签名区分大小写,定以后若不使用会造成编译错误3.continue、break配合标签(label)可用于多层循环跳出4.goto是调整执行位置,与continue、break配合标签(label)的结果并不相同...原创 2021-03-12 10:40:47 · 183 阅读 · 0 评论 -
for 和 for range有什么区别?
主要是使用场景不同for可以遍历array和slice遍历key为整型递增的map遍历stringfor range可以完成所有for可以做的事情,却能做到for不能做的,包括遍历key为string类型的map并同时获取key和value遍历channel...原创 2021-03-01 17:01:58 · 371 阅读 · 0 评论 -
结构体的方法和接收者
Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者self。方法的定义格式如下:func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) { 函数体}1.接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为p,Connector类型的接收者变量应该命名为c..原创 2021-02-21 19:21:18 · 226 阅读 · 0 评论 -
Go语言中new与make的区别
1.二者都是用来做内存分配的。2.make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;3.而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。...原创 2021-02-12 13:42:53 · 187 阅读 · 0 评论 -
递归需要遵守的重要原则
1、执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)2、函数的局部变量是独立的,不会相互影响3、递归必须向退出递归的条件逼近,否则就是无限递归4、当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁...原创 2021-02-02 16:11:24 · 695 阅读 · 0 评论 -
切片Slice
1. 切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。2. 切片的长度可以改变,因此,切片是一个可变的数组。3. 切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。4. cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。5. 切片的定义:var 变量名 []类型,比如 var str []string var ar..原创 2021-01-26 16:41:39 · 150 阅读 · 0 评论 -
数组Array
1. 数组:是同一种数据类型的固定长度的序列。2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1 for i := 0; i < len(a); i++ { } for index, v := range a...原创 2021-01-21 21:37:44 · 142 阅读 · 0 评论 -
Init函数和main函数
init函数init函数用于包(package)的初始化,具有下面的特征1、init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等2、每个包可以拥有多个init函数3、包的每个源文件也可以拥有多个init函数4、同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)5、不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序6、init函数不能被其他函数调用,而是在main函数执行之前,自动被调用main函数Go语言程序的默认入口函数(主函数):fu原创 2021-01-20 09:44:33 · 731 阅读 · 0 评论 -
Go语言的内置函数
1、append-用来追加元素到数组、slice中,返回修改后的数组、slice2、close-主要用来关闭channel3、delete-从map中删除key对应的value4、panic-停止常规的goroutine (panic和recover:用来做错误处理)5、recover-允许程序定义goroutine的panic动作6、real-返回complex的实部 (complex、real imag:用于创建和操作复数)7、imag-返回complex的虚部8、make-用来分配..原创 2021-01-18 13:56:45 · 549 阅读 · 0 评论 -
channel使用的注意事项
1、channel中只能存放指定的数据类型2、channel的数据放满后,就不能在放入了3、如果从channel中取出数据后,可以继续放入4、在没有使用协程的情况下,如果channel数据取完了,再取数据,就会报dead lock...原创 2021-01-16 16:45:41 · 121758 阅读 · 0 评论 -
Go语言声明-四种主要声明方式
1、var-声明变量2、const-声明常量3、type-声明类型4、func-声明函数原创 2021-01-14 17:04:24 · 596 阅读 · 0 评论 -
channel(管道)-基本介绍
1、channel本质就是一个数据结构-队列2、数据是先进先出3、线程安全,多goroutine访问时,不需要加锁,就是 说channel本身就是线程安全的4、channel是有类型的,一个string的channel只能存放string类型数据...原创 2021-01-13 21:54:33 · 34523 阅读 · 2 评论 -
Go协程的特点
1、有独立的栈空间2、共享程序堆空间3、调用由用户控制4、协程是轻量级的线程原创 2021-01-12 08:56:56 · 230 阅读 · 0 评论