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

 

posted @ 2022-07-19 22:58  nLesxw  阅读(126)  评论(0编辑  收藏  举报