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 main

import "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

GO语言中的几个关键思想的更多相关文章

  1. Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)

    Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...

  2. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  3. 2.C语言中的关键字

    1.auto 修饰局部变量,编译器默认所有局部变量都是用auto来修饰的,所以在程序中很少见到. 2.static 它作用可大了,除了可以修饰变量,还可以修饰函数,修饰变量,改变其作用域和生命周期,修 ...

  4. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  5. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  6. C语言中 *.c和*.h文件的区别!

    C语言中 *.c和*.h文件的区别!  http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/        ...

  7. C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期

    全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...

  8. PHP语言中使用JSON

    原文地址:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 在PHP语言中使用JSON 目前,JSON已经成为最流行的数据交换格式之一,各 ...

  9. .Net语言中关于AOP 的实现详解

    来源: IT人家  发布时间: 2011-03-22 20:28  阅读: 3546 次  推荐: 2   原文链接   [收藏] 摘要:该文章主要和大家讲解开发应用系统时在.Net语言中关于AOP ...

随机推荐

  1. C语言头文件的使用(转载)

    C语言头文件的使用 ——by janders 转载请注名作者和出处,谢谢! C语言中的.h文件和我认识由来已久,其使用方法虽不十分复杂,但我却是经过了几个月的“不懂”时期,几年的“一知半解”时期才逐渐 ...

  2. CentOS中zip压缩和unzip解压缩命令详解

    以下命令均在/home目录下操作cd /home #进入/home目录1.把/home目录下面的mydata目录压缩为mydata.zipzip -r mydata.zip mydata #压缩myd ...

  3. CSS只是进化的一部分

    Bert Bos是一位计算机科学家,他也是CSS的创始人之一.在CSS的发展过程中,Bos是最早与Håkon Wium Lie(CSS之父)合作的人之一.在1996年,他加入了World Wide W ...

  4. 添加PMD插件扫描潜在的bug

    上一节使用checkstyle来规范你的项目主要解决了代码编码规范问题,比如缩进换行等.这次继续代码健康工具类PMD. 什么是PMD PMD真的不像checkstyle这样的东西所见即所得啊,去官网找 ...

  5. [转]PostgreSQL Replication之扩展与BDR

    原文:https://www.cnblogs.com/xmzzp/p/6284300.html postgres 实现master, slave ,且master是多主. -------------- ...

  6. High performance find query using lean() in mongoose

    原文: http://www.tothenew.com/blog/high-performance-find-query-using-lean-in-mongoose-2/ ------------- ...

  7. wifidog 源码初分析(1)-转

    wifidog 的核心还是依赖于 iptables 防火墙过滤规则来实现的,所以建议对 iptables 有了了解后再去阅读 wifidog 的源码. 在路由器上启动 wifidog 之后,wifid ...

  8. 前端开发必备 40款优秀CSS代码编写工具推荐

    摘要:CSS工具可以简化工作流,可以提高CSS编写速度,是开发者和设计者所不可缺少的.本文列举了40种CSS工具,功能涉及CSS菜单.动画.3D图形.响应式页面.图层.按钮等界面元素的设计与制作,你定 ...

  9. 在使用Vs2013打开Vs2008的解决方案时出现了以下错误:此版本的应用程序不支持其项目类型(.csproj)

    在使用Vs2013打开Vs2008的解决方案时出现了以下错误: 无法打开 因为此版本的应用程序不支持其项目类型(.csproj). 在网络上找到解决方案: 命令行或者Vs自带的命令提示符输入:deve ...

  10. jquery animate()背景色渐变的处理

    jquery animate函数不能处理背景色渐变,需要使用jquery.color插件 gitHub地址:https://github.com/jquery/jquery-color/ 使用代码: ...