Go语言学习重点
近年来多核化和集群化正在成为了互联网时代发展的典型特征,Go语言的设计者们宣称对C、C++、java、C#、Delphi,乃至于PHP、Python、Perl、Ruby等语言感到深深的沮丧,他们要创造一门新的编程语言来满足分布式和并行计算的要求,事实也证明现在国内许多互联网公司在编写大并发高效处理的服务业务首选Go作为开发语言。对于C、C++、java和C#开发工程师来说,学习Go会非常轻松,特别是抓住下面的知识点,上手是分分钟的事情。
- 并发编程模型分为两个流派:共享内存流派和消息传递流派,gotoutine和channel构成go语言的基础,虽然go语言支持共享内存,但还是忘记它吧,只有channel才能把gotoutine的性能发挥到极致;
- go语言是强制统一代码风格的编程语言,首字母大写的变量、函数和方法等同于公有属性为包外可见,否则为对象私有包外不可见,变量函数命名规则主流有骆驼命名法(JAVA和C#)和下划线法(C),强烈建议骆驼法,左花括号必须位于行尾否则编译不给过,如果不能改变就不要吐槽go的编码风格;
- go语言支持函数多返回值,如:f, err := os.Open(filename),不关心可以使用占位符表示,如:f, _ := os.Open(filename),免去传递一大堆引用参数或封装结构体和对象的尴尬,越用越喜欢的语言特性;
- defer关键字含义为无论函数执行是否异常,均在函数退出前自动执行,且执行的顺序为先进后出,用法例如:创建连接defer连接、打开句柄defer句柄、打开结果集defer结果集;
- go语言反对函数和操作符重载、反对继承、虚函数,但并不代表go语言不能实现上述功能,可以通过组合方式变现,go语言同时放弃了对象的构造和析构等OOP特性,接口(interface)的非侵入性是其与其他面向对象语言最大的区别,go语言在面向对象的编程思想上真正做到了取C++、JAVA精髓而又去其糟粕;
- go数据分为数值语义和引用语义,其中数组是数值语义,切片和字典(二者与channel一样均为引用语义)作为内置的数据类型,支持接口、闭包和匿名函数、支持反射、支持自动垃圾回收,充分体现了go语言的先进性;
- go语言定义一个接口并声明一个接口变量,new一个对象赋值给接口变量从而实现接口与类型的直接转换,松散低耦合的对应关系大大降低接口调整导致的代码变动量,优势谁用谁知道;
- Cgo功能提供C与go语言的交互,相比JNI简单易用多了,几行注释轻轻松松实现集成和调用真是省心省力;
- 采用gdb对go程序调试与C没有特别的不同,调试信息的格式为DWARFv3,gdb的版本需高于7.1,C\C++开发工程师表示毫无压力;
- go语言的位运算符取反操作为^x,与其他语言~x的写法不同,时时刻刻提醒go就是go,是颜色不一样的烟火,天空海阔,要做最坚强的泡沫~
- go语言switch的case可以是值也可以是表达式如:0 <= num && num <= 3,也可以如case 1, 2, 3多个值,且语句下不用接break,关键字fallthrough表示执行完当前case后继续执行下面的case,C\C++和java表示无可奈何;
- go语言循环语句关键字为for,支持foreach风格(for idx, arg := range args),但不支持while和do-while,类似while(1)和while(true)之类的代码不会再出现了;
- 函数func myfunc(args ...int)表示入参个数不确定,原样传参:myfunc1(args...),传片段:myfunc2(args[1:]...),表示把args片段从下标1到结尾打散传输,不确定类型的如:func myfunc3(args ...interface{});
- 匿名函数:func(ch chan int) {ch <- ACK} (reply_chan),形参ch是一个int类型的channel,大括号是函数体,reply_chan为实参表示实际调用,f := func(x, y int) int {return x + y}表示将匿名函数赋值给函数对象变量f,开始别扭习惯就好了;
- go语言函数是函数,方法是方法,函数是一段代码片段,方法是指定了函数的接收者;方法:func (a *Integer) Add(b Integer)指出其接收者为Integer对象的指针类型,func (a Integer) Add(b Integer)为对象的值类型,区别在于对接收者a的操作结果,此外,go语言编译器可以根据值语义的接收者方法自动生成引用语义的接收者方法,没读懂请再读一遍;
- go语言支持接口查询功能,例如:if file, ok := file1.(two.IStream); ok {...},其中file1为某接口变量,two.IStream为某包下的某接口定义,判断ok值后调用接口中的方法可以避免不必要的异常;
- go语言采用select判断句柄状态,每个case必须是一个IO操作,超时控制首先异步sleep指定时间,然后向超时chan里写入值,在select下的case里可读出意味超时,go语言没有提供直接的超时处理机制,这种变通的实现方法总觉得设计者高深莫测有所保留;
- 单向channel机制,例如:var ch1 chan<- float64,表示ch1是单向channel,只用于写入float64数据,再例如:var ch2 <-chan int,表示ch2是单向channel,只用于读取int数据,channel之间可以相互转换,把chan单向强制类型转换成双向go不禁止但这么做要对得起自己的良心;
- sync.Once(函数名)用于全局初始化操作,sync.atomic子包提供一系列原子操作的函数,各种语言分别有对应的方法,列出来加深记忆;
- type Person struct {
Name string "name"
Mail string "mail"
}为每个字段增加tag以便通过反射机制获取成员变量,以及用于标注序列化字段的名称;
- 一份赏心悦目的代码可以提高工作效率,如果不知道怎么空格怎么缩进怎么换行可以执行命令go fmt 源文件.go,学习一下以后就这样写代码吧;
开发工具强烈建议JetBrains,风格一如IDEA,Go语言汲取了众多语言的优点,但更简单更精炼,值得花些时间研究,因为它老爸叫谷歌。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SSM基础框架搭建
SSM(Spring + SpringMVC + MyBatis)三个开源框架的简称,是WEB项目开发的不二之选,是码农进阶全栈工程师心路历程上的驿站。大公司开源框架和算法制定标准规范引领行业趋势,小公司拿来主义面向业务敏捷开发快速迭代在夹缝中艰难生存。SSM框架完美的符合了当下的这种行业现状,对于底层是如何实现的开发人员完全不必关注,踏踏实实梳理好业务逻辑,做好质量把控年底KPI基本问题就不大了。 Spring是一个轻量级IoC及AOP容器框架,配置又多又细,SpringBoot简化了大量通用且不常用的配置项,使构建一个微服务变得超简单;SpringMVC是目前最优秀的MVC框架,注解用得好事半功倍;MyBatis用于数据持久化,MyBatisPlus增强版内置分页功能简化开发流程自动化代码生成,唯一要做的事情就剩下写写SQL了。 无私的分享从这里开始: git clone git@gitee.com:gonglibin/kirin.git 文件夹 PATH 列表 卷序列号为 0009-68A2 D:\WORKSPACES\KIRIN │ kirin.iml │ pom.xml ...
- 下一篇
GO语言版鹅厂广告交易实时平台价格解析
腾讯广告实时交易平台在向竞价胜出一方返回成交价的时候,先对价格进行TEA加密,再对密文进行BASE64编码,接收方先对BASE64解码,再对密文解密,双方事先约定密钥。鹅厂官网提供了C#、C++、JAVA和PHP的解密代码包,无奈原有平台都是基于GO语言的,虽然可以调C++的静态库(libdecrypt.a),但开发工具是JetBrains GoLand,跑在Windows 7下后期难以调试,在虚拟机下跑linux版严重影响开发效率,不得不尝试改写为GO语言直接调用来的酣畅淋漓,主要原因还是太穷买不起MacBook。 原本觉得是个小活儿分分钟就可以搞定,没想到是个花了十二个工时的脏活累活,压根不是抄抄写写那么简单,一个坑接着一个坑。libdecrypt.a静态库在编译的时候没有加入调试信息完全无法跳入,jar倒是可以反编译看到源码,但编译器对部分中间变量做了优化处理,尤其对部分逻辑还原的带有强烈的个人感情色彩,IDEA和Java Decompiler两个工具自说自话,连被优化掉的变量命名都那么令人忍俊不禁。 // IntelliJ IDEA if(nInBufLen % 8 == 0 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作