天天看點

Go: 分布式學習利器(3) -- Go的資料類型和運算符

文章目錄

  • ​​1. Go的資料類型​​
  • ​​1.1 類型轉化​​
  • ​​1.2 類型的預定義​​
  • ​​1.3 指針類型​​
  • ​​2. Go 的運算符​​

1. Go的資料類型

GO的基本資料類型如下:

bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // 基本和uint8 類型一樣
rune // 代表unicode 的字元編碼,和 uint32類似
float32 float64 // 浮點類型
complex64 complex128 // 複數類型      

1.1 類型轉化

Go的類型轉化和其他語言的主要差異:

  • Go語言不允許隐式類型轉化
  • 别名和原有類型也不能進行隐式類型轉化

比如如下代碼,測試隐式類型轉化,go的規則并不允許

package _type

import "testing"

func TestImplicit(t *testing.T) {
  var a int = 1
  var b int64 

  b = a // 報錯,cannot use a (type int) as type int64 in assignment
  b = int64(a) // 顯示類型轉化即可
  t.Log(a, b)
}      

再比如如下測試代碼, 測試别名和原有類型也不能進行隐式類型轉化

type MyInt int;
func TestOthername(t *testing.T)  {
  var a int = 1
  var c MyInt 
  c = a // 使用原有類型,不過是别名,也無法進行隐式類型轉化
  c = MyInt(a) // 隻有顯式類型轉換才可以
  t.Log(a,c)
}      

1.2 類型的預定義

Go 支援類型的預定義,比如想要擷取某一種類型的最大最小值,可以直接通過内置的預定義類型擷取

比如:

math.MaxFloat64 //最大浮點類型
math.MaxUint64 // 最大無符号整型
math.MaxInt64 // 最大的整型
...      

1.3 指針類型

Go的指針類型和其他語言的主要差異是:

  • 不支援指針的運算(其他語言可以支援指針位址的自加)
  • string 是值類型,其預設的初始化值為空字元串,而不是nil

如下代碼,測試指針類型的運算:

func TestPointer(t *testing.T) {
  a := 1
  aPtr := &a // 正常輸出 變量a的位址0xc00001c190

  aPtr = aPtr + 1 // 指針運算會報錯,Fail: aPtr + 1 (mismatched types *int and int)
  t.Log(a,aPtr)
  t.Logf("%T %T", a, aPtr)
}      

如下代碼,測試string類型:

func TestString(t *testing.T) {
  var s string

  t.Log("*"+s+"*", len(s)) // 字元串是空的,且字元串的長度為0
}      

是以在Go語言中判斷一個字元串是否為空,不像C語言中​

​if (s == NULL) {}​

​​ ,而是​

​if s=="" {}​

2. Go 的運算符

基本的運算符和其他語言一樣:算術運算符(+,-,*,/,%,++,–),比較運算符(==,!=,>,<,>=,<=),邏輯運算符(&&,||,!),位運算符(&,|,^,<<,>>)

需要注意的是和其他語言的差異 如下幾點:

  • Go語言沒有前置的 ++ 和 –
  • 支援 == 比較數組

要求是:

相同維數且含有相同個數元素的數組才可以比較

每個元素都相同的才相等

  • Go語言支援按位置零 ​

    ​&^​

    ​,将右側值為1 的所有位都置0
1 &^ 0 = 1
1 &^ 1 = 0
0 &^ 1 = 0
0 &^ 0 = 0      
func TestArray(t *testing.T) {
  a := [...]int{1,2,3,4}
  b := [...]int{1,2,4,3}
  c := [...]int{1,2,3,4,5}
  d := [...]int{1,2,3,4}

  // t.Log(a==b,a==c,a==d) // a==c fail, 不支援不同元素個數的數組比較
  t.Log(a==b,a==d) // success 
}      
=== RUN   TestArray
    type_test.go:43: false true
--- PASS: TestArray (0.00s)