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是存在的,反之则不存在。

浙公网安备 33010602011771号