概述:

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语言与其他高级语言的区别的更多相关文章

  1. C、C++、C#、Java、php、python语言的内在特性及区别

    C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...

  2. js课程 3-10 js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么

    js课程 3-10  js中字符串函数数组函数和其它语言中对应函数的区别和联系是什么 一.总结 一句话总结:js中是对象点方法的形式,这些方法都是对象的方法,而在php.java中却不是这样. 1.j ...

  3. C程序设计语言--指针和引用的区别

    在看了一篇文章以后,http://coolshell.cn/articles/7992.html,说的是C和C++之间的缺陷,当然这篇文章说的非常高深了.所以就找了一些资料,分析了这两者的区别 在&l ...

  4. Java 自增(++) 和 C语言中自增的区别

    在Java.c语言等高级语言中自增和自减的作用基本一致,都是变量自身加一或减一.下面我只对自增进行说明,自减是类似的. 自增运算符(++),有两种书写形式,一个是在变量前: ++ num; 另一种在变 ...

  5. C语言几个输入函数的区别(史上最详细)

    The difference of the string and the character(char): 字符串是一个带有""的字符序列如 "I fuck xuqian ...

  6. C语言realloc,malloc,calloc的区别【转载】

    转载自:http://www.cnblogs.com/BlueTzar/articles/1136549.html 三个函数的申明分别是: void* realloc(void* ptr, unsig ...

  7. 动态样式语言Sass&Less介绍与区别

    一. Sass/Scss&Less是什么? Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,语法跟css一样(但多了些功能),比css好写, ...

  8. C语言i++和++i的区别和指针*(a++)和*(++a)的区别

    i++ :先引用后增加++i :先增加后引用i++ :先在i所在的表达式中使用i的当前值,后让i加1 ++i :让i先加1,然后在i所在的表达式中使用i的新值 一.c语言中i++和++i的运行效果是不 ...

  9. c语言return与exit的区别

    2013-09-0918:54:33 exit函数在头文件stdlib.h中,函数原型: void exit(int status); exit(0) 正常运行程序并退出程序. exit(1) 非正常 ...

随机推荐

  1. 重写 hashcode()真有那么简单嘛?

    万万没想到一个 hashcode() 方法,既然会引出一堆的知识盲区,简直了. 起因: 老八股:为什么重写Equals方法要重写HashCode方法. 大声告诉我为什么,闭着眼睛先把答案背出来,啥?这 ...

  2. Linux根据时间过滤文件

    1.显示20分钟前的文件:       find /sdb1/apache-tomcat-show/logs/ -type f -mmin +20 -exec ls -l {} \; 2.删除20分钟 ...

  3. 从源码分析 MGR 的流控机制

    Group Replication 是一种 Shared-Nothing 的架构,每个节点都会保留一份数据. 虽然支持多点写入,但实际上系统的吞吐量是由处理能力最弱的那个节点决定的. 如果各个节点的处 ...

  4. Vue学习之--------深入理解Vuex之getters、mapState、mapGetters(2022/9/3)

    这一篇博客的内容是在上一篇博客的基础上进行:深入理解Vuex.原理详解.实战应用 @ 目录 1.getters的使用 1.1 概念 1.2 用法 1.3 如何读取数据 2.getters在项目中的实际 ...

  5. 15 Uncaught TypeError: Cannot set properties of null (setting ‘onclick‘)

    1.报错的代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  6. js函数组合

    纯函数和柯里化容易引起洋葱代码 函数组合可以让我们把细粒度的函数重新组合生成一个新的函数 函数组合并没有减少洋葱代码,只是封装了洋葱代码 函数组合执行顺序从右到左 满足结合律既可以把g和h组合 还可以 ...

  7. python 类相关 下划线相关 __init__

    类 1.静态方法 class C(object): @staticmethod def f(): print('runoob'); C.f(); # 静态方法无需实例化 cobj = C() cobj ...

  8. .NET7 一个实用功能-中央包管理

    依赖管理是 NuGet 的核心功能.Nuget管理单个项目的依赖关系很容易.管理多项目解决方案的依赖关系可能会变得很困难,因为它们的规模和复杂性开始扩大. 在您管理许多不同项目的公共依赖项的情况下,您 ...

  9. hutool包的DateUtil工具类

    [首先引入依赖 ] <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core& ...

  10. 质数之和【计算第x个到第y个质数之和】

    题目:质数之和 已知,第一个质数是2,第二个质数是3,第三个质数是5,第四个质数是7,第五个质数是11,第六个质数是13,第七个质数是17,输入两个不相等的正整数a和b,求出第a个质数到第b个质数当中 ...