go語言入門(二)

Go 語言變量

  Go 語言變量名由字母、數字、下劃線組成,其中首個字母不能爲數字。python

  聲明變量的通常形式是使用 var 關鍵字:ide

  var identifier type

變量聲明

  第一種,指定變量類型,聲明後若不賦值,使用默認值。函數

  var v_name v_type   v_name = value

  第二種,根據值自行斷定變量類型。佈局

  var v_name = value

  第三種,省略var, 注意 :=左側的變量不該該是已經聲明過的,不然會致使編譯錯誤。spa

  v_name := value    var a int = 10   var b = 10   c : = 10

多變量聲明

//類型相同多個變量, 非全局變量 var vname1, vname2, vname3 type vname1, vname2, vname3 = v1, v2, v3 var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不須要顯示聲明類型,自動推斷 vname1, vname2, vname3 := v1, v2, v3 //出如今:=左側的變量不該該是已經被聲明過的,不然會致使編譯錯誤 // 這種因式分解關鍵字的寫法通常用於聲明全局變量 var ( vname1 v_type1 vname2 v_type2 )
 

值類型和引用類型

  全部像 int、float、bool 和 string 這些基本類型都屬於值類型,使用這些類型的變量直接指向存在內存中的值。當使用等號 = 將一個變量的值賦值給另外一個變量時,如:j = i,其實是在內存中將 i 的值進行了拷貝,你能夠經過 &i 來獲取變量 i 的內存地址,例如:0xf840000040(每次的地址均可能不同)。值類型的變量的值存儲在棧中。指針

  一個引用類型的變量 r1 存儲的是 r1 的值所在的內存地址,或內存地址中第一個字所在的位置。這個內存地址爲稱之爲指針,這個指針實際上也被存在另外的某一個字中。同一個引用類型的指針指向的多個字能夠是在連續的內存地址中(內存佈局是連續的),這也是計算效率最高的一種存儲形式;也能夠將這些字分散存放在內存中,每一個字都指示了下一個字所在的內存地址。code

  當使用賦值語句 r2 = r1 時,只有引用(地址)被複制。若是 r1 的值被改變了,那麼這個值的全部引用都會指向被修改後的內容,在這個例子中,r2 也會受到影響。blog

注意事項

  若是你聲明瞭一個局部變量卻沒有在相同的代碼塊中使用它,一樣會獲得編譯錯誤,例以下面這個例子當中的變量 a:內存

package main

import "fmt"

func main() {
   var a string = "abc"
   fmt.Println("hello, world")
}

  

  嘗試編譯這段代碼將獲得錯誤 a declared and not used。這個值必須被使用,因此使用 fmt.Println("hello, world", a會移除錯誤。字符串

  可是全局變量是容許聲明但不使用。 同一類型的多個變量能夠聲明在同一行,如:

  var a, b, c int

  多變量能夠在同一行進行賦值,稱之爲並行賦值,如:

  a, b, c = 5, 7, "abc"

  若是你想要交換兩個變量的值,則能夠簡單地使用 a, b = b, a。

  空白標識符 _ 也被用於拋棄值,如值 5 在:_, b = 5, 7 中被拋棄。

  _ 其實是一個只寫變量,你不能獲得它的值。這樣作是由於 Go 語言中你必須使用全部被聲明的變量,但有時你並不須要使用從一個函數獲得的全部返回值。

  並行賦值也被用於當一個函數返回多個返回值時,好比這裏的 val 和錯誤 err 是經過調用 Func1 函數同時獲得:val, err = Func1(var1)。

 

Go 語言常量

  常量是一個簡單值的標識符,在程序運行時,不會被修改的量。常量中的數據類型只能夠是布爾型、數字型(整數型、浮點型和複數)和字符串型。

  常量的定義格式:

  const identifier [type] = value

  你能夠省略類型說明符 [type],由於編譯器能夠根據變量的值來推斷其類型。

  • 顯式類型定義: const b string = "abc"
  • 隱式類型定義: const b = "abc"

  多個相同類型的聲明能夠簡寫爲:

  const c_name1, c_name2 = value1, value2

  常量還能夠用做枚舉:

  const (   Unknown = 0   Female = 1   Male = 2   )

常量能夠用len(), cap(), unsafe.Sizeof()函數計算表達式的值。常量表達式中,函數必須是內置函數,不然編譯不過:

package main

import "unsafe"
const (
    a = "abc"
    b = len(a)
    c = unsafe.Sizeof(a)
)

func main(){
    println(a, b, c)
}

以上實例運行結果爲:

abc 3 16

Go 語言運算符

  運算符用於在程序運行時執行數學或邏輯運算。Go 語言內置的運算符有:

  • 算術運算符
  • 關係運算符
  • 邏輯運算符
  • 位運算符
  • 賦值運算符
  • 其餘運算符

算術運算符

  算術運算符有加+,減-,乘*,除/,自增++,自減--

關係運算符

  關係運算符有相等==,不等!=,大於>,小於<,大於等於>=,小於等於<=

邏輯運算符

  邏輯運算符有與&&,或||,非!

 

位運算符

  位運算符對整數在內存中的二進制位進行操做。位運算符有位與 &,位或 |,和異或 ^ ,左移運算<<,右移運算符>>。

  左移運算符"<<"是雙目運算符。左移n位就是乘以2的n次方。 其功能把"<<"左邊的運算數的各二進位所有左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0。

  右移運算符">>"是雙目運算符。右移n位就是除以2的n次方。 其功能是把">>"左邊的運算數的各二進位所有右移若干位,">>"右邊的數指定移動的位數。高位補上符號位。

 

賦值運算符

  go支持加強賦值運算,如 +=,-=等

 

其餘運算符

  取地址運算符&

  指針運算符*

 

運算符優先級

  有些運算符擁有較高的優先級,二元運算符的運算方向均是從左至右。下表列出了全部運算符以及它們的優先級,由上至下表明優先級由高到低:

優先級 運算符
7 ^ !
6 * / % << >> & &^
5 + - | ^
4 == != < <= >= >
3 <-
2 &&
1 ||

  建議經過使用括號來明確某個表達式的總體運算優先級。

相關文章
相關標籤/搜索