go是什么编程语言?主要应用于哪些方面?Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言,Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言” 。
Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛 。BAT大厂正在把Go作为新项目开发的首选语言 。
Go语言能干什么?
1、服务端开发:以前你使用C或者C做的那些事情,用Go来做很合适,例如日志处理、文件系统、监控系统等;
2、DevOps:运维生态中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go语言开发;
3、网络编程:大量优秀的Web框架如Echo、Gin、Iris、beego等,而且Go内置的 net/http包十分的优秀;
4、Paas云平台领域:Kubernetes和Docker Swarm等;
5、分布式存储领域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、区块链领域:区块链里面有两个明星项目以太坊和fabric都使用Go语言;
7、容器虚拟化:大名鼎鼎的Docker就是使用Go语言实现的;
8、爬虫及大数据:Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理 。
Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)三次握手go语言猜拳:
1. 主动发起连接请求端(客户端)go语言猜拳,发送 SYN 标志位,携带数据包、包号
2. 被动接收连接请求端(服务器) , 接收 SYN,回复 ACK , 携带应答序列号 。同时,发送SYN标志位,携带数据包、包号
3. 主动发起连接请求端(客户端) , 接收SYN 标志位 , 回复 ACK 。
被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )
四次挥手:
1. 主动请求断开连接端(客户端),发送 FIN标志,携带数据包
2. 被动接受断开连接端(服务器),发送 ACK标志,携带应答序列号 。—— 半关闭完成 。
3. 被动接受断开连接端(服务器) , 发送 FIN标志 , 携带数据包
4. 主动请求断开连接端(客户端),发送 最后一个 ACK标志,携带应答序列号 。—— 发送完成,客户端不会直接退出,等 2MSL时长 。
等 2MSL待目的:确保服务器 收到最后一个ACK
滑动窗口:
通知对端本地存储数据的 缓冲区容量 。—— write 函数在对端 缓冲区满时 , 有可能阻塞 。
TCP状态转换:
1. 主动发起连接请求端:
CLOSED —— 发送SYN —— SYN_SENT(go语言猜拳了解) —— 接收ACK、SYN,回发 ACK —— ESTABLISHED (数据通信)
2. 主动关闭连接请求端:
ESTABLISHED —— 发送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半关闭、主动端)
—— 接收FIN、回复ACK —— TIME_WAIT (主动端) —— 等 2MSL 时长 —— CLOSED
3. 被动建立连接请求端:
CLOSED —— LISTEN —— 接收SYN、发送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (数据通信)
4. 被动断开连接请求端:
ESTABLISHED —— 接收 FIN、发送 ACK —— CLOSE_WAIT —— 发送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP状态转换:
netstat -an | findstr端口号
Linux下查看TCP状态转换:
netstat -an | grep端口号
TCP和UDP对比:
TCP: 面向连接的可靠的数据包传递 。针对不稳定的 网络层,完全弥补 。ACK
UDP:无连接不可靠的报文传输 。针对不稳定的 网络层,完全不弥补 。还原网络真实状态 。
优点缺点
TCP:可靠、顺序、稳定系统资源消耗大,程序实现繁复、速度慢
UDP:系统资源消耗?。?程序实现简单、速度快不可靠、无序、不稳定
使用场景:
TCP:大文件、可靠数据传输 。对数据的 稳定性、准确性、一致性要求较高的场合 。
UDP:应用于对数据时效性要求较高的场合 。网络直播、电话会议、视频直播、网络游戏 。
UDP-CS-Server实现流程:
1.创建 udp地址结构 ResolveUDPAddr(“协议” , “IP:port”) —— udpAddr 本质 struct{IP、port}
2.创建用于 数据通信的 socket ListenUDP(“协议”, udpAddr ) —— udpConn (socket)
3.从客户端读取数据,获取对端的地址 udpConn.ReadFromUDP() —— 返回:n,clientAddr, err
4.发送数据包给 客户端 udpConn.WriteToUDP("数据",clientAddr)
UDP-CS-Client实现流程:
1.创建用于通信的 socket 。net.Dial("udp", "服务器IP:port") —— udpConn (socket)
2.以后流程参见 TCP客户端实现源码 。
UDPserver默认就支持并发!
------------------------------------
命令行参数: 在main函数启动时,向整个程序传参 。【重点】
语法: go run xxx.goargv1 argv2argv3argv4。。。
xxx.exe:第 0 个参数 。
argv1 :第 1 个参数 。
argv2 :第 2 个参数 。
argv3 :第 3 个参数 。
argv4 :第 4 个参数 。
使用: list := os.Args提取所有命令行参数 。
获取文件属性函数:
os.stat(文件访问绝对路径) —— fileInfo 接口
fileInfo 包含 两个接口 。
Name() 获取文件名 。不带访问路径
Size() 获取文件大小 。
网络文件传输 —— 发送端(客户端)
1.获取命令行参数,得到文件名(带路径)filePathlist := os.Args
2.使用 os.stat() 获取 文件名(不带路径)fileName
3.创建 用于数据传输的 socketnet.Dial("tcp",“服务器IP port”) —— conn
4.发送文件名(不带路径)给接收端,conn.write()
5.读取 接收端回发“ok”,判断无误 。封装函数 sendFile(filePath, conn) 发送文件内容
6.实现 sendFile(filePath,conn)
1) 只读打开文件 os.Open(filePath)
for {
2) 从文件中读数据f.Read(buf)
3) 将读到的数据写到socket中conn.write(buf[:n])
4)判断读取文件的 结尾 。io.EOF. 跳出循环
}
网络文件传输 —— 接收端(服务器)
1. 创建用于监听的 socket net.Listen() —— listener
2. 借助listener 创建用于 通信的 socket listener.Accpet()—— conn
3. 读取 conn.read() 发送端的 文件名,保存至本地 。
4. 回发 “ok”应答 发送端 。
5. 封装函数 , 接收文件内容 recvFile(文件路径)
1) f = os.Create(带有路径的文件名)
for {
2)从 socket中读取发送端发送的 文件内容。conn.read(buf)
3)将读到的数据 保存至本地文件 f.Write(buf[:n])
4)判断 读取conn 结束, 代表文件传输完成 。n == 0break
}
关于GO 语言的入门学习 求解答已经有好多程序员都把Go语言描述为是一种所见即所得(WYSIWYG)的编程语言 。这是说 , 代码要做的事和它在字面上表达的意思是完全一致的 。在这些新语言中,包含D , Go,Rust和Vala语言,Go曾一度出现在TIOBE的排行榜上面 。与其他新语言相比 , Go的魅力明显要大很多 。Go的成熟特征会得到许多开发者的欣赏,而不仅仅是因为其夸大其词的曝光度 。下面我们来一起探讨一下谷歌开发的Go语言以及谈谈Go为什么会吸引众多开发者: 快速简单的编译 Go编译速度很快,如此快速的编译使它很容易作为脚本语言使用 。关于编译速度快主要有以下几个原因:首先,Go不使用头文件;其次如果一个模块是依赖A的,这反过来又取决于B , 在A里面的需求改变只需重新编译原始模块和与A相依赖的地方;最后,对象模块里面包含了足够的依赖关系信息,所以编译器不需要重新创建文件 。你只需要简单地编译主模块 , 项目中需要的其他部分就会自动编译,很酷,是不是? 通过返回数值列表来处理错误信息 目前,在本地语言里面处理错误的方式主要有两种:直接返回代码或者抛异常 。这两种都不是最理想的处理方式 。其中返回代码是非常令人沮丧的,因为返回的错误代码经常与从函数中返回的数据相冲突 。Go允许函数返回多个值来解决这个问题 。这个从函数里面返回的值,可以用来检查定义的类型是否正确并且可以随时随地对函数的返回值进行检查 。如果你对错误值不关心,你可以不必检查 。在这两种情况下,常规的返回值都是可用的 。简化的成分(优先于继承) 通过使用接口,类型是有资格成为对象中一员的,就像Java指定行为一样 。例如在标准库里面的IO包,定义一个Writer来指定一个方法,一个Writer函数,其中输入参数是字节数组并且返回整数类型值或者错误类型 。任何类型实现一个带有相同签名的Writer方法是对IO的完全实现,Writer接口 。这种是解耦代码而不是优雅 。它还简化了模拟对象来进行单元测试 。例如你想在数据库对象中测试一个方法 , 在标准语言中,你通常需要创建一个数据库对象,并且需要进行大量的初始化和协议来模拟对象 。在Go里面 , 如果该方法需要实现一个接口,你可以创建任何对该接口有用的对象,所以,你创建了MockDatabase,这是很小的对象 , 只实现了几个需要运行和模拟的接口——没有构造函数,没有附件功能,只是一些方法 。简化的并发性 相对于其他语言,并发性在Go里面显得更加容易 。把‘go’关键字放在任意函数前面然后那个函数就会在其go-routine自动运行(一个很轻的线程) 。go-routines是通过通道进行交流并且基本上封锁了所有的队列消息 。普通工具对相互排斥是有用,但是Go通过使用通道来踢掉并发性任务和坐标更加容易 。优秀的错误消息 所有与Go相似的语言,自身作出的诊断都是无法与Go相媲美的 。例如 , 一个死锁程序,在Go运行时会通知你目前哪个线程导致了这种死锁 。编译的错误信息是非常详细全面和有用的 。其他 这里还有许多其他吸引人的地方,下面就一概而过的介绍一下 , 比如高阶函数、垃圾回收、哈希映射和可扩展的数组内置语言(部分语言语法,而不是作为一个库)等等 。当然,Go并不是完美无瑕 。在工具方面还有些不成熟的地方和用户社区较小等 , 但是随着谷歌语言的不断发展,肯定会有整治措施出来 。尽管许多语言,尤其是D、Rust和Vala旨在简化C并且对其进行简化,但它们给人的感觉仍是“C看上去要更好” 。
【Go语言的优势】
可直接编译成机器码,不依赖其他库,glibc的版本有一定要求,部署就是扔一个文件上去就完成了 。
静态类型语言 , 但是有动态语言的感觉,静态类型的语言就是可以在编译的时候检查出来隐藏的大多数问题,动态语言的感觉就是有很多的包可以使用,写起来的效率很高 。
语言层面支持并发 , 这个就是Go最大的特色,天生的支持并发,我曾经说过一句话,天生的基因和整容是有区别的 , 大家一样美丽,但是你喜欢整容的还是天生基因的美丽呢?Go就是基因里面支持的并发,可以充分的利用多核,很容易的使用并发 。
内置runtime , 支持垃圾回收,这属于动态语言的特性之一吧,虽然目前来说GC不算完美,但是足以应付我们所能遇到的大多数情况 , 特别是Go1.1之后的GC 。
简单易学,Go语言的作者都有C的基因,那么Go自然而然就有了C的基因,那么Go关键字是25个,但是表达能力很强大 , 几乎支持大多数你在其他语言见过的特性:继承、重载、对象等 。
丰富的标准库,Go目前已经内置了大量的库,特别是网络库非常强大,我最爱的也是这部分 。
内置强大的工具 , Go语言里面内置了很多工具链,最好的应该是gofmt工具,自动化格式化代码,能够让团队review变得如此的简单,代码格式一模一样,想不一样都很困难 。
跨编译,如果你写的Go代码不包含cgo,那么就可以做到window系统编译linux的应用 , 如何做到的呢?Go引用了plan9的代码,这就是不依赖系统的信息 。
内嵌C支持,前面说了作者是C的作者,所以Go里面也可以直接包含c代码,利用现有的丰富的C库 。
【go语言猜拳 猜拳游戏编程】go语言猜拳的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于猜拳游戏编程、go语言猜拳的信息别忘了在本站进行查找喔 。
推荐阅读
- 显卡散热器怎么拆,显卡散热器怎么拆卸
- 拍短视频用什么相机,拍短视频用什么相机软件比较好
- 笔记本硬盘坏了会怎么样,笔记本硬盘坏了还值得修吗
- win10显卡怎么看,独立显卡有什么作用
- windows系统自制的简单介绍
- 硬盘马达驱动板怎么造图解,硬盘马达坏了怎么修理
- 中小卖家如何做店铺推广,商家怎么做推广
- 宇宙飞行游戏,好玩的宇宙飞船游戏
- c语言中什么是空函数 c++空函数