Go 语言初步

十二、go语言函数的初步介绍 go语言函数的值传递,引用传递,多参,可变参数 阅读详情

这几天认真玩起了 Go。所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧。

据说 Go 的最佳开发平台是 Mac OS ,我没有。其次应该是 Linux 。Windows 版还没全部搞定,但是也可以用了。如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上。千万别上当,这是个废弃的项目。如果你用这个,很多库都没有,而且语法也是老的。我在 Windows 下甚至不能正确链接自己写的多个 package 。活跃的 Windows 版是 gomingw ,对于 Windows 用户,装一个 mingw32 以后就可以开始玩了。

就三天来实战经历,我喜欢上这门新语言有如下原因:

mix-in 的接口风格。非常接近于我在用 C 时惯用的面向对象风格。有语法上的支持要舒服多了。以平坦的方式编写函数,没有层次。而后用 interface 把需要的功能聚合在一起。没有继承层次,只有组合功能。

强类型系统。使得犯错误的机会大大降低。正确通过编译,几乎就没有什么 bug 了。而编写程序又有点使用 lua 这种动态语言的感觉,总之,写起来很舒服。

内置的 string / slice 类型,以及 gc 。这是我觉得现代编程必须的东西。手工管理未必有更高的效率,但一定有更多的出错机会。至少,我一直主张有一个方便的 string 不变量的基本类型的(参见这一篇)。

defer 是个有趣使用的东西,用它来实现 RAII 比 C++ 利用栈上对象的析构函数的 trick 方案让人塌实多了。go 在语言设计上是很吝啬新的关键字的。但多出一个关键字 defer ,并用内建函数 panic / recover 来解决许多看似应该用 exception 解决的问题要漂亮的多。

zero 初始化。我一直觉得 C++ 的构造函数特别多余。按我用 C 的惯例,一切数据结构都应该用 0 初始化。所以 C 里有 calloc 这个函数。go 把这点贯彻了。不会再有未定义的数据。

包系统特别的好。而且严格定义了包的初始化过程,即 init 函数。在我自己的 C 语言构建的项目中,实现了几乎一样的机制,甚至也叫 init 。但是有语言层面的支持就是好。对,只有 init 没有 exit 。正合我意。

goroutine 是个相当有用的设计。8 年前,我给 C 实现了 coroutine 库,并用在项目里,并坚信,程序就应该这么写。但是没有语言级的支持,用起来还是很麻烦。goroutine 不仅简化了许多业务逻辑的编写,而且天生就是为并发编程而生的。select/chan 可能是唯一正确的并发编程的模型。Erlang 还是太小众了,而 Go 可以延用 Erlang 的模型,却有着纯正的 C 语言血统,我想会被更多人接受的。虽然 Go 依然可以用共享状态加锁的方案,但不推荐使用。chan 用习惯了,还是相当方便的。

{ 要不要独立占一行的信仰之争终于结束了。还记得前段时间有位同学来 email 指责我开源的代码没有章法。程序写的太乱。他的理由就是,我的 { 都没有独占一行。好了,争论可以结束了。在 Go 里,如果你把 { 从 if/for 语言的行末去掉,放在下一行。编译器是不会让你通过的。(除非你再加一个 ; )我很欣慰 ;)

我发现我花了四年时间锤炼自己用 C 语言构建系统的能力,试图找到一个规范,可以更好的编写软件。结果发现只是对 Go 的模仿。缺乏语言层面的支持,只能是一个拙劣的模仿。


对于有 C 基础的同学,比如我,学习 Go 毫不费力。按这篇文章的指引即可。Rob Pike 的三日教程 PPT ,我心急,用了一个下午就看完了,并且做完了练习。

不过实战编写程序还是需要反复查阅文档的。学习一门新语言,就是在学习它的各种惯用法和库。而不是去模拟熟悉的语言。我在编写代码的时候,时刻问自己,在 Go 里,通常用什么手法来处理这个问题。接下来就是不断的查询文档了。从这个意义上讲,学习新东西还是很累的。好在 Go 的各种设计都非常切合我的本意,所以自然是越写越舒服了。

至于把变量类型申明都放在后面,按 Sean 同学的话说,有种真气逆行的感觉。对我来说倒是小问题,几个小时就习惯了。反而 C 语言那种亦前亦后的方式才是奇怪呢。


说一下我的练手项目。我用 Go 重新实现了处理多连接的服务器。当然,现在的设计方案和几年前写 blog 时的方案有略微的不同。

需求是这样的:

这个服务会监停一个端口,允许外部多个连接的接入,并可以把这个连接上的数据包汇总发到后端的一个连接上。简单的说,就是一个 N 对 1 的数据处理器。把 N 个 TCP 数据流合成一个数据流。

一个服务的处理上限是 64K 的连接,使用 2 字节的 id 号区分不同的外部连接。我定义了简单的协议,每个数据片段有 3 字节的数据头。分别是数据长度一字节和 2 字节的连接 id 号。

这个服务仅仅做数据流的合并,而不规定数据逻辑上的分包。对内的数据管道上看起来的数据流就是这样的:

len id_lo id_hi content ... len id_lo id_hi content ...  len id_lo id_hi content ... 

处理合并起来的数据流非常简单,只需要通过一个 IO 管道 (可以是 socket 也可以的 stdio/stdout ,对于 Go 来说,甚至可以是一个 in-memory Pipe )这方便后端的程序不再考虑多连接的问题。

后端服务需要可以控制连接服务器。最基本的功能就是可以强制断开某个外部连接。并且可以获得新的外部连接接入或离开的信号。

更进一步,应该由后端服务器来控制连接服务器对外监听端口的开启与关闭,以及外部连接的上限等。

为了简化设计,我选择在一个特殊的内部连接(0号连接)上收发内部的控制指令。并且使用 \r\n 分割的文本协议。


用 Go 来实现这个服务非常简洁。全部我只使用了 240 行左右的 Go 代码。所有的网络连接都使用独立的 goroutine 来控制。每个都以阻塞方式处理 socket 。主循环仅仅使用一个 select ,这类似 Erlang 的事件驱动模型。

对于控制指令流,创建一个 in-memory Pipe 即可。在对内的数据流上,过滤到 id 为 0 的数据包,转发到这个 Pipe 上。使用 bufio 把 Pipe 转换成一个 bufio.Reader 接口,就可以方便的使用 ReadString 方法去读以回车分割的文本行,进而排发到解析指令的 goroutine 中,把结构化指令利用 chan 发进消息 select 循环。整个只需要不到 10 行代码。

大多数 goroutine 内部都是一个 for 循环,结束条件是和它通讯的 chan 被外部关闭。

需要稍微考虑性能的地方是给外部连接的数据包加上三字节的头转发到内部通道上。这里如果每个包都用 make 创建一个新的 array slice 会有一些内部管理上的开销。我的做法是每次申请 16k 的 array ,再创建一个 slice 去组包,如果这个 16k 的 array 没用完,就会顺着用下去。如 Go 的教程中所言,slice 的创建是很廉价的,想来也是如此。它只是对 array 的部分引用。

Go 的引用和值分得很清楚,这使它更像 C 而不是 Java ,却又提供了 C++ 提供不了的安全性。

用 Go 写网络程序,真是非常舒心。socket 和 file 在 interface 上的统一,暗合 Unix 之道。程序嘛,就是处理输入,产生输出。Reader 和 Writer 接口让人愉快。


原文出自:http://blog.codingnow.com/2010/11/go_prime.html


保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南) 本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。 阅读详情

相关推荐

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 877

go语言

go语言,是用在服务端的。 知乎大部分项目是 Python 写的,有几个小项目是用 Go 写的。我从一个 Python 为主的开发者的角度说说对 Go 的优点的体会吧: 部署简单。Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要的管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减

证券指标的专栏 2455

避坑指南:HslCommunication连接西门子PLC时常见的5个错误及解决方法(S7-1200/S1500适用)

本文详细解析了使用HslCommunication连接西门子S7-1200/S1500 PLC时常见的5个错误及解决方法,包括基础连接配置、数据块读写异常、连接闪断、防火墙与权限问题以及高级调试技巧。通过实战案例和代码示例,帮助开发者快速定位和解决连接问题,提升工业自动化项目的开发效率。

weixin_30752699的博客 395

Golang,一道春天的闪电

触碰到Golang,仿佛又和大神们站在了一起,仿佛又有干劲去追逐那些了不起的事情。

IoT小能手 2115

山东大学软件工程应用与实践——GMSSL开源库(六)——SM9密钥交换协议

2021SC@SDUSC 文章目录基本概念符号及辅助算法SM9密钥交换协议 基本概念 1976年,Diffie和Hellman在其题为《密码学的新方向》的论文中首次给出了公钥密码学的定义,并提出了Diffie-Hellman密钥交换算法。该算法解决了对称密码体制中的密钥分发问题,使得通信双方可以通过公开信道安全地交换共享密钥。 使用SM9通信的双方通过对方的标识和自身的私钥,经过两次或者可选的三次信息传递过程,计算获取一个由双方共同决定的共享秘密密钥。该密钥可以作为对称密码算法的会话密钥,其中可选步骤用来实

m0_51588039的博客 1986

文献阅读笔记:量子微波测量技术综述

量子微波测量技术研究进展:量子微波测量技术利用里德堡原子与微波电场的相干相互作用,突破了传统测量方法的物理限制。该技术基于电磁诱导透明效应和里德堡原子能级跃迁原理,通过激光激发原子并监测光谱变化来测量微波电场强度。相比传统方法,量子微波测量具有超高灵敏度(理论极限可达nV/cm)、宽动态范围(超过100dB)、小型化等显著优势,且测量结果可直接溯源至普朗克常数。典型实验系统包括光源、原子气室和探测器,采用光谱法、干涉法等多种测量方法。近年来,该技术在基础研究和应用方面取得重要进展,展现出在通信、雷达、计量等

Grow into a more wonderful you 988

go语言的安装和配置,以及包引用

1.下载和安装 首先大家可以去官网下载 http://golang.org/dl/ 如果官网你看不懂的话,可以到这里下载: http://golangtc.com/download ,这里也提供了百度云的下载地址: 如果下载msi文件还需要进一步安装,安装过程也非常简单; 如果下载zip文件,直接解压了就可以用了。 2.配置 打开环境变量

Xiaosang's blog 3628

SAP MM 物料描述MAKTX 40个字符不够用的问题处理

SAP物料描述表,长度40个字符一般情况下,40个字符在描述中也够用了,但是要加上规格之类的额外描述就不一定了,特别是对于辅助件-刀具。解决方案一:对maktx增强,换成CHAR80或者CHAR100的,但是风险较大,涉及到好多地方,另外SAP+ 算号器 也不支持。解决方案二:增强字段。内部顾问,建议在 那就在这里加一个字段,具体过程如下:1、创建域2、创建架构3、附加架构4、GUI 设置 5、后台设置6、MASS/MM17字段新增。过程1、创建域 SE112、创建结构 se11 3、MARA附加架构

GAVIN 4728

我们建了一个 Golang 硬核技术交流群(内含视频福利)

目录 目录 Golang 是什么? 我们为什么选择 Golang? Golang 是云时代的宠儿! 我们搞了一场 Golang 入门直播 Golang 是什么? Golang 是谷歌 2009 年发布的第二款开源编程语言。 Golang 针对多处理器计算平台的应用程序编程进行了优化,使用 Golang 编译的程序可以媲美 C/...

weixin_34067980的博客 736

【Agent实战】Agent Skills 深度解析:从原理到落地的完整指南

本文深入解析了Agent Skills的概念及其在AI协作中的实际应用。Skill是一种可被AI按需发现和加载的任务执行说明书,它将团队经验、规则和步骤固化为结构化文档,如SKILL.md。文章阐明了Skill与Prompt、MCP、Function Calling的关系,强调Skill专注于"怎么做"而非底层能力。重点介绍了SKILL.md的编写规范,包括元数据命名规则、描述技巧和正文内容优化,旨在帮助开发者高效构建可复用的知识资产,提升Agent的任务执行稳定性与专业性。通过清晰的示例和对比,为AI架构

少说,多做 115

小龙虾们的好伙伴专栏导航

本文系统解析了OpenClaw技术架构,包括Channel层和网关层的设计实现,并与AgentSkills等技术方案进行对比。同时提供了OpenClaw的系列实用指南,涵盖小龙虾培养、客户资源管理、系统自动化巡检以及技术趋势助手构建等应用场景,帮助用户从零成本入门到高效落地应用,实现业务全流程自动化管理。

wend的博客 209

【Golang】第一弹-----初步认识GO语言

初步认识go语言

2302_80713883的博客 1382

文末含资料链接和视频讲解!YOLOv8集成CoordAtt注意力机制详细教程

本文详细介绍了如何在YOLOv8目标检测框架中集成CoordAtt注意力机制。首先解析了CoordAtt的工作原理,它通过分解式池化将位置信息嵌入到通道注意力中,相比传统注意力机制具有更好的空间信息保持能力。然后提供了PyTorch实现代码解析,包括自适应平均池化、Hard-Swish激活函数等关键实现细节。最后概述了YOLOv8架构,为后续集成CoordAtt提供基础。该教程适合具备深度学习基础的开发者,将理论与实践结合,帮助读者掌握这一目标检测优化技术。

FJN110的博客 266

Go语言初步学习

关键字:breakdefaultfuncinterfaceselectcasedefergomapstructchanelsegotopackageswitchconstifrangetypeconsinueforimportreturnvar预定义标识符:基础数据类型和系统内嵌函数appendboolbytecapclosecomplexcomplex64complex128uint16copyfalsefloat32。

m0_71237226的博客 1619

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Go语言的初步认识

Go语言是来自Google的一门语言,Go语言的一些开源项目如下   链接:http://www.open-open.com/lib/view/open1396063913278.html   关于Go语言的一些内容如下   链接:http://www.tuicool.com/articles/7fMzYnB   链接:http://www.youkuaiyun.com/article/201

渡辺麻友 1485

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Go语言基础:初步认识GO语言

Go是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”。在本章的内容中,将详细讲解语言的发展历程,讲解搭建Go语言环境的方法,并详细讲解了开发第一个Go语言程序的过程。

荷塘月色 126

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Go语言初步入门

Go语言入门 学习内容视频来源慕课网GO语言语法入门篇,这是入门篇,下次总结学习进阶篇。这里面并没有代码说明,只是理论上的只是 Go语言特点 静态类型的、编译型的开源语言 脚本化的语法,支持多种编程范式->函数式编程&面向对象编程 原生、给力的并发编程支持 Go语言优势 脚本化的语法。非常容易的编程Go语言程序 静态类型+编译型,程序运行速度有保障 原生的支持并发编程。降低...

weixin_34247155的博客 185

590-初步接触Golang语言

对Golang语言的认识 C语言诞生50年了 Golang语言是在2009年发布的 Go的特征 Go是个“大杂烩" Go的特性 Go没有线程,有例程 Go的优缺点 泛类型:void * Go的应用场景 Go的环境配置

LINZEYU666的博客 149

初步了解GO语言

初步了解Go语言

shaun_yang的博客 164

GO语言与其他语言初步比较

main函数需要保存在名为main的包中,只有这样才能生成可执行文件 ,定义函数使用func,函数传参时,参数类型和名称相反 func test(name string){ fmt.Println(name) } 一个函数允许返回多个值,比如一个值和一个错误值,当有错误值返回时,尽量不要使用其他值,避免错误加重 声明变量的两种方式: name1 :="xiang" var name = "xiang" //两种声明方式都可以,第一种方式简化了var //编译器也可以检测函数的返回值来确定变量类型.

Xiang_lhh的博客 3719

GO语言管道初步

go语言定义管道,与多线程相似,在多线程基础上添加了锁,防止数据同时共用。 go语言中管道与切片相似,都需要make之后才能够使用 package main //声明管道make(chan 存储类型,容量) func main(){ var name chan string name=make(chan string,1) name<-"silves" fmt.Prinln(<-name) } 管道:一个队列,保持先进先出的原则 使用情形:在多线程中,对于同一个数据的使用,保持一致 管

Xiang_lhh的博客 3389

对Go语言的一点初步的感受和经验。

由于项目需要,这两天抽空学习Go语言。简单说说Go语言还算不上入门的我的一点感受和经验。 感受 风格 Go语言象C和Java的结合体,融合了这两种语言的风格。 代码中有结构体、指针,象C;有import、package,象Java。 严格意义来说,Go语言不是面向对象语言,但通过结构体可以实现面向对象语言的某些特性。 由于较新,它汲取了多种流行语言的特点,感觉很

trophawk的专栏 848

GO 语言初步印象

go 语言 是c的一个替代者(按照官方的说法,是C++语言的一个替代者)。他改良了许多C遗留下来的不好的编程习惯,譬如 switch /case ,默认没有fallthrough;switch值可以为“任意”类型。muilti return;自动垃圾回收;“{”要放在if 后边。。。总之 许多C中不人性化的地方(比如C陷阱 里边提到的多种)都有了改良。还有因为goroutine 和 chan 的特...

sunweiliang的博客 234

GO语言web初步

web编程,路由,回调函数,端口 package main import ( "io" "log" "net/http" ) func helloHandler(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello, world!")//流输出 } func main() { http.HandleFunc("/hello", helloHandler)//路由,第一个参数为url, //注意的是,需要使用/开头

Xiang_lhh的博客 3210

清理你的重复文件,GO语言并发初步

上周笔者的博客《为什么大厂上在用GO语言-读透GO语言的切片》立了个flag,要带大家共同来实战一下GO语言的项目,通过这些日子的研究对于GO语言笔者已经路转粉了。 笔者在接触GO之前长期从事物联网操作系统的内核及时序数据库的开发工作,特别推崇开源精神,曾经参与国产开源数据库Tdengine与TencentOS等开源项目,在优快云公众号中发表过《腾讯开源开年红!TencentOS 内核正式开源...

Python爱好者的专栏 3199

go语言学习初步配置

go语言学习笔记配置GOPATH-工作目录Go语言项目结构及开发工具配置代码片段快捷键 安装go开发包,配置go的开发环境 配置GOPATH-工作目录 新建目录,添加到环境变量-存放go语言代码 新建三个文件夹bin、pkg、src。把bin目录添加到path后面 查看环境配置go env Go语言项目结构及开发工具 开发在src下直接写:域名-作者名-项目名(建议)、utf-8开发 安装go-tools工具:Windows平台按下Ctrl+Shift+P,这个时候VS Code界面会弹出一个输入框,如

zioniu的博客 2824
上一篇: 严重: End event threw exception java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedM
下一篇: SQL注入专题
freewind
博客等级 码龄16年 136粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值