天天看點

Go學習筆記day01

變量

單變量聲明

第一種,指定變量類型,聲明後若不指派,使用預設值

var name type
name = value
           

第二種,類型推斷

var name = value
//也可以寫作
var name type = value
           

第三種,簡短聲明,省略var

注意 :=左側的變量至少保證一個是新變量,否則會導緻編譯錯誤

name := value

// 例如
var a int = 10
var b = 10
c : = 10
           
這種方式它隻能被用在函數體内,而不可以用于全局變量的聲明與指派

多變量聲明

第一種,相同類型的變量。以逗号分隔,聲明與指派分開,若不指派,存在預設值

var name1, name2, name3 type
name1, name2, name3 = v1, v2, v3
           

第二種,直接指派,下面的變量類型可以是不同的類型

var name1, name2, name3 = v1, v2, v3
           

第三種,集合類型,這種因式分解關鍵字的寫法一般用于聲明全局變量

var (
    name1 type1
    name2 type2
)
           

注意事項

1、如果在相同的代碼塊中,我們不可以再次對于相同名稱的變量使用初始化聲明,例如:a := 20 就是不被允許的,編譯器會提示錯誤 no new variables on left side of :=,但是 a = 20 是可以的,因為這是給相同的變量賦予一個新的值。

2、局部變量定義了就要使用,否則無法通過編譯,但是全局變量是允許聲明但不使用的。

3、變量的預設值:

整型:預設值是0

浮點類型:預設是0

字元串:預設值""

布爾:false

其他:

以下幾種類型為 nil:

var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口
           

4、如果你想要交換兩個變量的值,則可以簡單地使用 a, b = b, a,兩個變量的類型必須是相同。

5、空白辨別符 _ 也被用于抛棄值,如值 5 在:_, b = 5, 7 中被抛棄。

_ 實際上是一個隻寫變量,你不能得到它的值。這樣做是因為 Go 語言中你必須使用所有被聲明的變量,但有時你并不需要使用從一個函數得到的所有傳回值。

6、多變量可以在同一行進行指派,如:

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

//或
var a, b int
var c string
a, b, c = 5, 7, "abc"
           

常量

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

常量可以作為枚舉,常量組

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

常量組中如不指定類型和初始化值,則與上一行非空常量右值相同

package main

import (
	"fmt"
)

func main() {
	const (
		x uint16 = 16
		y
		s = "abc"
		z
	)
	fmt.Printf("%T,%v\n", y, y)
	fmt.Printf("%T,%v\n", z, z)
}
           

運作結果:

uint16,16
string,abc
           

常量可以用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
           

注意事項

  • 常量中的資料類型隻可以是布爾型、數字型(整數型、浮點型和複數)和字元串型
  • 不曾使用的常量,在編譯的時候,是不會報錯的
  • 顯示指定類型的時候,必須確定常量左右值類型一緻,需要時可做顯示類型轉換。這與變量就不一樣了,變量是可以是不同的類型值

iota

iota,特殊常量,可以認為是一個可以被編譯器修改的常量。

第一個 iota 等于 0,每當 iota 在新的一行被使用時,它的值都會自動加 1。

iota 用法

package main

import "fmt"

func main() {
    const (
            a = iota   //0
            b          //1
            c          //2
            d = "ha"   //獨立值,iota += 1
            e          //"ha"   iota += 1
            f = 100    //iota +=1
            g          //100  iota +=1
            h = iota   //7,恢複計數
            i          //8
    )
    fmt.Println(a,b,c,d,e,f,g,h,i)
}
           

運作結果:

0 1 2 ha ha 100 100 7 8
           

如果中斷iota自增,則必須顯式恢複。且後續自增值按行序遞增

自增預設是int類型,可以自行進行顯示指定類型

另起一個const(),iota依舊從零遞增

數字常量不會配置設定存儲空間,無須像變量那樣通過記憶體尋址來取值,是以無法擷取位址

有趣的的 iota 執行個體

package main

import "fmt"
const (
  i=1<<iota
  j=3<<iota
  k
  l
)

func main() {
  fmt.Println("i=",i)
  fmt.Println("j=",j)
  fmt.Println("k=",k)
  fmt.Println("l=",l)
}
           

以上執行個體運作結果為:

i= 1
j= 6
k= 12
l= 24
           

iota 表示從 0 開始自動加 1,是以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,這沒問題,關鍵在 k 和 l,從輸出結果看 k=3<<2,l=3<<3。

簡單表述:

  • i=1:左移 0 位,不變仍為 1;
  • j=3:左移 1 位,變為二進制 110, 即 6;
  • k=3:左移 2 位,變為二進制 1100, 即 12;
  • l=3:左移 3 位,變為二進制 11000,即 24。

注:<<n==*(2^n)。

基本資料類型

1.1 布爾型bool

布爾型的值隻可以是常量 true 或者 false。一個簡單的例子:var b bool = true

1.2 數值型

1、整數型

  • int8 有符号 8 位整型 (-128 到 127) 長度:8bit
  • int16 有符号 16 位整型 (-32768 到 32767)
  • int32 有符号 32 位整型 (-2147483648 到 2147483647)
  • int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
  • uint8 無符号 8 位整型 (0 到 255) 8位都用于表示數值:
  • uint16 無符号 16 位整型 (0 到 65535)
  • uint32 無符号 32 位整型 (0 到 4294967295)
  • uint64 無符号 64 位整型 (0 到 18446744073709551615)
int和uint:根據底層平台,表示32或64位整數。除非需要使用特定大小的整數,否則通常應該使用int來表示整數。 大小:32位系統32位,64位系統64位。 範圍:-2147483648到2147483647的32位系統和-9223372036854775808到9223372036854775807的64位系統。

2、浮點型

  • float32

    IEEE-754 32位浮點型數

  • float64

    IEEE-754 64位浮點型數

  • complex64

    32 位實數和虛數

  • complex128

    64 位實數和虛數

3、其他

  • byte

    類似 uint8

  • rune

    類似 int32

  • uint

    32 或 64 位

  • int

    與 uint 一樣大小

  • uintptr

    無符号整型,用于存放一個指針

1.3 字元串型

字元串就是一串固定長度的字元連接配接起來的字元序列。Go的字元串是由單個位元組連接配接起來的。Go語言的字元串的位元組使用UTF-8編碼辨別Unicode文本

var str string
	str = "Hello World"
           

注意事項

1、即使是64位機,int與int64不認為是同一種類型,也不能互相指派。

2、64位機,整數預設類型int,浮點數預設類型float64

var a = 100
var b = 29.0
fmt.Printf("%T\n",a)
fmt.Printf("%T\n",b)

//輸出
int
float64
           

資料類型轉換

文法格式:Type(Value)

注意點:相容類型可以轉換

常數:在有需要的時候,自動轉型

變量:需要手動轉型

繼續閱讀