GO语言的设计理念与C++,Java,Python之流大相径庭。

一、没有函数重载

GO语言里面没有函数重载,Java、C#、C++三位大牛都是支持函数重载的,Python虽然不支持函数重载,但是支持默认形参,这在很大程度上缓解了没有函数重载的不足。

GO语言不支持函数重载主要是为了简单,像C语言一样不支持重载。

二、方法是第一等公民,奇葩而灵活的面向对象

GO语言中没有class关键字,它的面向对象是对C语言中struct的扩展。
结构体像一个插线板,函数像插头,想给结构体添加什么功能直接在插线板上插入就可以了。
面向对象,一言以蔽之,就是把若干个数据跟若干个方法打包成一团。GO语言中除了结构体就是方法,但是方法可以多了一种属性:结构体属性。

C#中的扩展方法跟GO语言中的方法非常像。

三、大一统的GOPATH

1、要理解三个环境变量

  • GOROOT:安装GO的路径,GOROOT下应该包含bin,src,pkg等文件夹。
  • GOPATH:用户自己编的package的位置,GO语言要求所有与GO相关的代码全部放在GOPATH下面,否则引用包会出错的。GOPATH默认为${user.home}/go文件夹。
  • PATH:系统的环境变量,最好把$GOROOT/bin$GOPATH/bin添加到环境变量中。

Java的包管理有maven,不同项目之间共享代码可以通过本地的mvn仓库来实现。
Python的包管理有pip,需要什么包就安装什么包,以包名为唯一标识符。
Node的包管理有npm,需要什么包全安装到项目里面,不同项目之间不共享包。
Go的包管理方式可谓简单粗暴,一切都得是源代码,一切都得在GOPATH下面。

2、代码组织

Go语言代码组织比较奇葩,初入门时很难理解,建议读一下官网文档:https://golang.org/doc/code.html

  • Go programmers typically keep all their Go code in a single workspace.
    Go程序员通常把Go代码放在一个文件夹(名叫workspace,工作空间)里面,而不是分散在好几处
  • A workspace contains many version control repositories (managed by Git, for example).
    一个工作空间包含多个git仓库
  • Each repository contains one or more packages.
    每一个git仓库包含多个包
  • Each package consists of one or more Go source files in a single directory.
    每个包包含多个go源码文件,这些文件都在同一个目录下
  • The path to a package's directory determines its import path.
    包所在文件的路径就是引入包时需要注明的路径

工作空间中包含三个文件夹:

  • src contains Go source files,
  • pkg contains package objects, and
  • bin contains executable commands.

3、go install

首先创建一个文件夹,$ mkdir $GOPATH/src/github.com/user/hello,在这个文件夹下面编辑main.go

package mainimport "fmt"func main() {fmt.Printf("Hello, world.\n")
}

现在想把hello命令安装到GOPATH/bin目录下面,只需要 $ go install github.com/user/hello,或者cd到hello目录下面,直接运行go install

四、GO没有虚拟机如何垃圾回收

GO语言编译之后生成的是可执行文件,不像Java生成的是字节码。
Java的字节码由Java虚拟机执行,垃圾回收当然就由虚拟机完成。
Go生成的是一个本地可执行文件,并且它包含垃圾回收,那么垃圾回收必然是打包在了exe里面的。
实际上,垃圾回收不一定非得由虚拟机来完成,Go生成的可执行文件中自动包含了垃圾回收部分的代码,它会自动开辟一个线程专门进行垃圾回收。
那么,不同Go可执行程序之间是不共享垃圾回收模块的,这样就使得Go程序之间存在冗余(不过多占一点地方也不是问题)。

五、Go语言中的主函数

不像Java,类名跟文件名必须一致。Go语言中的文件名可以随便写,包名也不必考虑文件所在目录(但是同一目录下的文件包名必须一致)。但是Go语言中的主函数一定是main包下的main函数。

不同文件夹下的main.main函数互不影响。

Python和Java每一个文件都可以定义主函数,这就为快速测试提供了便利。Go和C、C++一样,只能有一个main函数,正确姿势是使用正经的测试而不是写多个main函数。即便是Java和Python,使用main函数进行测试也不是好主意,

但是程序有多个入口这倒是一件非常方便的事情。Go其实也支持程序有多个入口,只需多写几个main函数就行了。

六、Go语言中的数据类型

1、布尔型
布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
2、数字类型
Go对数字类型的支持相当丰富,不像Java语言没有无符号数字,不像Python那样很装逼的实现了长整数,不像C、C++里面int和long到底有多少位都说不清。Go语言明确支持四种数字类型:

  • uint:uint8,uint16,uint32,uint64
  • int:int8,int16,int32,int64
  • float:float32,float64(没有double了)
  • complex:complex64(实部和虚部都是float32),complex128(实部和虚部都是float64)

3、字符串类型:
字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。
4、派生类型:
包括:

(a) 指针类型(Pointer)

(b) 数组类型

(c) 结构化类型(struct)

(d) Channel 类型

(e) 函数类型

(f) 切片类型

(g) 接口类型(interface)

(h) Map 类型

Go语言的切片类型跟Python的切片类型不一样,Go的切片是在原有数据上进行操作,而Python的切片类型是新复制了一份。

Go语言中没有Object这样的“万物之祖”类型,而interface{}类型就是万物之祖,也就是说:Go认为,不包含任何数据和方法的接口就是万物之祖。

七、奇葩的错误处理

Go语言中允许函数返回多个参数,许多函数都会返回两样东西:正确答案和错误状态。这一点跟C++、Java使用异常的机制完全不同,可以说Go语言里面根本不存在异常这种概念,因此你也不可能看见异常链(也就不可能像Java和Python那样快速看到错误发生前发生的事情)。

参考资料

https://www.zhihu.com/question/58863427

转载于:https://www.cnblogs.com/weiyinfu/p/8633123.html

GO语言中的几个关键思想相关推荐

  1. Context是怎么在Go语言中发挥关键作用的

    Context 是 Go 语言独有的设计,在其他编程语言中很少见到类似的概念,用一句话解释 Context 在 Go 语言中的作用就是: Context 为同一任务的多个 goroutine 之间提供 ...

  2. c语言字符串二维数组的动态分配应,C语言中动态分配二维数组复习过程.doc

    C语言中动态分配二维数组复习过程.doc C语言中动态分配二维数组在C中动态分配内存的,对于单个变量,字符串,一维数组等,都是很容易的.C中动态分配二维数组的方法,很少有C语言书中描述,我查找了有的C ...

  3. python语言中有哪些函数_Python语言中的函数

    本文主要向大家介绍了Python语言中的函数,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 学了 Python 中的数据类型,语句,接下来就来说一下 Python 中的函数,函数 ...

  4. c语言中换行符的ans2码,二级C语言复习

    <二级C语言复习>由会员分享,可在线阅读,更多相关<二级C语言复习(113页珍藏版)>请在人人文库网上搜索. 1.C程序设计复习,(一)要点 (二)概念 50% -疑难举例 ( ...

  5. Java与C语言中的锁

    Java与C语言中的锁 C 嵌入式汇编的语法格式是: asm(code : output operand list : input operand list : clobber list) __asm ...

  6. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  7. 数据处理程序语言中的基本数据类型

    程序语言根据其设计目的不同,其侧重的基本数据类型也不同.JAVA.C#等语言被设计用来进行通用的应用程序开发,其基本数据类型是字符串.数字.布尔等原子数据类型,以及数组和通用对象.而SQL.Power ...

  8. 各方评论《面向儿童的人工智能北京共识》:这是中国人工智能发展轨迹中的一份关键文件...

    近日,智源研究院联合北京大学人工智能研究院.清华大学人工智能研究院.清华大学人工智能国际治理研究院.中科院自动化所.中科院计算所.中科院心理所等高校院所,以及小米.旷视.奇虎360.好未来.爱学习.极 ...

  9. c语言静态存储和动态存储,C语言中的静态内存与动态内存

    我们知道,内存分为动态内存和静态内存,我们先讲静态内存. 一.静态内存 内存管理---存储模型 存储模型决定了一个变量的内存分配方式和访问特性,在C语言中主要有三个维度来决定:1.存储时期 2.作用域 ...

最新文章

  1. linux nohup 英文全称 no hang up(
  2. python 办公自动化-用python进行办公自动化都需要学习什么知识呢?
  3. js作用域及作用域链概念理解及使用
  4. bzoj2002Bounce 弹飞绵羊
  5. javafx FlowPane布局
  6. Linux开发常见问题:GCC:链接器输入文件未使用,因为链接尚未完成
  7. mysql-表完成性约束
  8. 加入域--深入理解DNS在域中作用
  9. 产品经理为什么越来越不值钱?不懂数据,只能尴尬退场
  10. adb命令安装apk
  11. 永中集成Office 2013 简体中文免费版
  12. 开源音频处理软件/项目
  13. ASP.NET项目部署到阿里云服务器(IIS)
  14. 杀毒软件开发,原理、设计、编程实战
  15. fxp连接失败_用FLASHFXP连接站点,总显示连接失败(连接丢失),该怎么办呢
  16. echarts 省市区联动地图
  17. python读取csv表格的数据并用matplotlib画曲线图
  18. EXCEL取小数点数值
  19. 计算机网络安全的对策,计算机网络安全和对策.PDF
  20. android五子棋源代码,Android五子棋游戏源码详解

热门文章

  1. 集合交集,并集,差集运算
  2. Mock(模拟后端接口数据)配合Vuex的使用
  3. python3 + selenium 之窗口切换
  4. maven私服的使用
  5. 学习node.js的一些笔记
  6. KVM虚拟机安装使用教程(Ubantu)
  7. 精通javascript、javascript语言精粹读书笔记
  8. 动态绘制柱状图饼状图
  9. 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)
  10. sqlserver命令行修改用户登录密码