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