Go语言与其他高级语言的区别
概述:
go语言与其他语言相比,go语言的关键字非常少,只有25个,c语言有37个,c++有84个,python有33个,java有53个。
差异1:go语言不允许隐式转换,别名和原有类型也不能进行隐式类型转换
测试代码1.1:
package const_learn
import "testing"
func TestType(t *testing.T) {
var a int = 1
var b int64
b = a
t.Log(a, b)
}
显示结果:

我们可以发现变量类型报错,使用int32的a也是同样报错
测试代码1.2:
package const_learn
import "testing"
type MyInt int64
func TestType(t *testing.T) {
var a int = 1
var b int64
b = int64(a) //显示类型转换
t.Log(a, b)
var c MyInt
c = b
t.Log(a, b, c)
}
显示结果:

可以发现别名做隐式类型转换也是会报错的,只能进行显示转换
差异2:不支持指针运算
测试代码:
func TestPoint(t *testing.T) {
a := 1
aPtr := &a
aPtr = aPtr + 1
t.Log(a, aPtr)
t.Log("%T, %T", a, aPtr)
}
测试结果:

发现编译错误
差异3:string是值类型,其默认的初始化值为空字符串,而不是nil
测试代码:
func TestString(t *testing.T) {
var s string
t.Log("*" + s + "*")
t.Log(len(s))
if s == "" {
t.Log("string是值类型")
}
}
测试结果:

可以看到变量 s 为空字符串,而不是“空”
差异4:go语言没有前置的 ++ 和 --
差异5:go语言在数组维数和元素个数相同时可以进行比较,比较时,数组中每个元素都相同且顺序相同返回true,反之false
测试代码1.1:
func TestOperator(t *testing.T) {
a := [...]int{1, 2, 3, 4}
b := [...]int{1, 3, 4, 5}
c := [...]int{1, 2, 3, 4, 5}
d := [...]int{1, 2, 3, 4}
t.Log(a == c)
}
测试结果:

数组元素个数不相同,编译错误
测试代码1.2:
func TestOperator(t *testing.T) {
a := [...]int{1, 2, 3, 4}
b := [...]int{1, 3, 4, 5}
d := [...]int{1, 2, 3, 4}
t.Log(a == b)
t.Log(a == d)
}
测试结果:

可以发现只有数组中的每个元素都相等时,比较为true
测试代码1.3:
func TestOperator(t *testing.T) {
a := [...]int{1, 2, 3, 4}
b := [...]int{1, 3, 2, 4}
d := [...]int{1, 2, 3, 4}
t.Log(a == b)
t.Log(a == d)
}
测试结果:

可以发现两个数组中的元素都相同时,顺序不同,返回的结果依然是false
差异6:go语言提供按位清零运算符号 &^

测试代码:
// Readable 0001, Writable 0010, Executable 0100
func TestOperator2(t *testing.T) {
a := 7 //0111
a = a &^ Readable // 0111 &^ 0001 -> 0110
t.Log(a) //6
t.Log(a&Readable == Readable) // 0110 & 0001 -> 0000 != 0001
t.Log(a&writable == writable) // 0110 & 0010 -> 0010 = 0010
t.Log(a&Executable == Executable) // 0110 & 0100 -> 0100 = 0100
}
测试结果:

差异7:go语言没有while,可以使用 for 代替
测试代码:
func TestWhileLoop(t *testing.T) {
n := 0
for n < 5 {
t.Log(n)
n++
}
}
测试结果:

差异8:go语言switch....case语句中的case和 if 语句支持在后面写有多个项
测试代码:
func TestSwitch(t *testing.T) {
for i := 0; i < 5; i++ {
switch i {
case 0, 2:
t.Log("Even")
case 1, 3:
t.Log("Odd")
default:
t.Log("it is not 0-3")
}
}
}
测试结果:

差异9:go语言的map在访问key不存在时,仍会返回零值,使得无法区分当前的key是不存在,还是key的value为0
测试代码:
func TestAccessNotExistingKey(t *testing.T) {
m1 := map[int]int{}
t.Log(m1[1])
m1[2] = 0
t.Log(m1[2])
m1[3] = 0
if v, ok := m1[3]; ok {
t.Logf("key 3's value is %d", v)
t.Log(ok)
} else {
t.Log("key 3 is not existing.")
}
}
测试结果:

使用m1[3]进行赋值时,会返回两个值,一个是value,一个是布尔值。当布尔值为true时,说明当前key的value是存在的,反之则不存在。
Go语言与其他高级语言的区别的更多相关文章
- C、C++、C#、Java、php、python语言的内在特性及区别
C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...
- js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么
js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...
- C程序设计语言--指针和引用的区别
在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在&l ...
- Java 自增(++) 和 C语言中自增的区别
在Java.c语言等高级语言中自增和自减的作用基本一致,都是变量自身加一或减一.下面我只对自增进行说明,自减是类似的. 自增运算符(++),有两种书写形式,一个是在变量前: ++ num; 另一种在变 ...
- C语言几个输入函数的区别(史上最详细)
The difference of the string and the character(char): 字符串是一个带有""的字符序列如 "I fuck xuqian ...
- C语言realloc,malloc,calloc的区别【转载】
转载自:http://www.cnblogs.com/BlueTzar/articles/1136549.html 三个函数的申明分别是: void* realloc(void* ptr, unsig ...
- 动态样式语言Sass&Less介绍与区别
一. Sass/Scss&Less是什么? Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,语法跟css一样(但多了些功能),比css好写, ...
- C语言i++和++i的区别和指针*(a++)和*(++a)的区别
i++ :先引用后增加++i :先增加后引用i++ :先在i所在的表达式中使用i的当前值,后让i加1 ++i :让i先加1,然后在i所在的表达式中使用i的新值 一.c语言中i++和++i的运行效果是不 ...
- c语言return与exit的区别
2013-09-0918:54:33 exit函数在头文件stdlib.h中,函数原型: void exit(int status); exit(0) 正常运行程序并退出程序. exit(1) 非正常 ...
随机推荐
- 2016 ZCTF note3:一种新解法
2016 ZCTF note3:一种新解法 最近在学习unlink做到了这道题,网上有两种做法:一种是利用edit功能读入id时整数溢出使索引为-1,一种是设置块大小为0使得写入时利用整数溢出漏洞可以 ...
- 洛谷P1496 火烧赤壁 (模拟/离散化+差分)
分析可知:将起点和终点按照从小到大的顺序排序,对答案不会产生影响 所以此时我们得到一种模拟做法: 1 #include<bits/stdc++.h> 2 using namespace s ...
- C#中ref和out关键字的应用以及区别
首先:两者都是按地址传递的,使用后都将改变原来参数的数值. 其次:ref可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所 ...
- 齐博x1token字段,请务加在请求地址的头部header
如下图所示,你必须在请求的头部加上 token参数,主要原因有两个.第一点,这个是登录标志,因为接口访问用不了cookie,所以只能通过这个header请求标志判断用户是否已经登录.第二点,系统有时候 ...
- cmd复制移动合并文件
1.单文件复制: (1)把c:\1.txt复制到c:\2\文件夹下 copy c:\1.txt c:\2\ (2)把c:\1.txt复制到c:\1\文件夹下,并把它修改为777.docx copy c ...
- Golang 和 Python 随机生成N位字符串
Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...
- Maven 聚合工程的创建
简单场景举例 聚合工程创建示例 说明: 创建 Maven Project:表示创建 maven 项目,new Project 方式创建 创建 Maven Module:表示创建 maven 项目,ne ...
- P6492 STEP(线段树维护左右区间pushup)
题目链接 题目描述: 给定一个长度为\(~\)n\(~\)的字符序列\(~\)a,初始时序列中全部都是字符\(~\)L. 有\(~\)q\(~\)次修改,每次给定一个\(~\)x,做出如下变化: \( ...
- 高性能MySQL(第4版) 第一章 MySQL架构 读书笔记
这本书去年11月出的,今年中文版也出了,并且直接上了微信读书,之后有空就读一读,分享下读书笔记~ 原文内容比较充实,建议有时间可以读一下原文. 第一章主要是个概览. MySQL的逻辑架构 默认情况下, ...
- C#与Halcon联合编程之用PictureBox控件替代HWindowControl控件
在使用HALCON和C#联合编程,有时候要使用halcon的HWindowControl控件,但是我发现,HWindowControl的图片显示控件,不能使用GDI+绘制ROI,不知道为什么,反正我测 ...