天天看點

go語言學習4(資料類型、數組、切片、map)

資料類型用于聲明函數和變量,資料類型的出現是為了把資料分成所需記憶體大小不同的資料,程式設計的時候需要用大資料的時候才需要申請大記憶體,就可以充分利用記憶體。

Go 語言按類别有以下幾種資料類型:

布爾型

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

數字類型

整型 int 和浮點型 float32、float64,Go 語言支援整型和浮點型數字,并且支援複數,其中位的運算采用補碼。

字元串類型:

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

派生類型:

包括:

  • (a) 指針類型(Pointer)
  • (b) 數組類型
  • (c) 結構化類型(struct)
  • (d) Channel 類型
  • (e) 函數類型
  • (f) 切片類型
  • (g) 接口類型(interface)
  • (h) Map 類型

數字類型:

uint8、uint16、uint32、uint64、int8、int16、int32、int64,同時也支援基于架構的類型,例如:int、uint 和 uintptr

浮點型:

float32、float64、complex64、complex128

其他數字類型:

         byte、rune(類似int32)、uint、int、uintptr

指針定義:

         var pointer_name *pointer-type

例如:var ip *int

var fp *float32

空指針判斷:

         if(ptr != nil)    

if(ptr == nil)   

數組類型:

                   Go 語言數組聲明需要指定元素類型及元素個數,如下:

                   var array_name [SIZE] array_type

                   舉例:

                   var balance [10]float32

                   var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

           var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0} //編譯器自推導數組個數,“…”不能省略。

切片(slice)類型:

           Go 語言切片是對數組的抽象。Go 數組的長度不可改變,在特定場景中這樣的集合就不太适用,Go中提供了一種靈活,功能強悍的内置類型切片("動态數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。

聲明切片:var slice_name []slice_type

建立初始化切片:slice1 := make([]slice_type,len) //指定類型、長度

         也可以指定容量,如:make([]T, length, capacity)

切片初始化舉例:

s :=[] int {1,2,3 }

s := arr[startIndex:endIndex] //初始化切片s為數組arr的部分元素的引用

s := arr[startIndex:] // startIndex開始到最後

s := arr[:endIndex] //從0開始到endIndex

切片是可索引的,并且可以由 len() 方法擷取長度;切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少。

如果想增加切片的容量,我們必須建立一個新的更大的切片并把原分片的内容都拷貝過來。下面的代碼描述了從拷貝切片的 copy 方法和向切片追加新元素的 append 方法。

package main

import "fmt"

func main() {

   var numbers []int

   printSlice(numbers)

   numbers = append(numbers, 0)

   printSlice(numbers)

   numbers = append(numbers, 1)

   printSlice(numbers)

   numbers = append(numbers, 2,3,4)

   printSlice(numbers)

   numbers1 := make([]int, len(numbers), (cap(numbers))*2)

   copy(numbers1,numbers)

   printSlice(numbers1) 

}

func printSlice(x []int){

   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)

}

map類型:

                   Map 是一種無序的鍵值對的集合。Map 是無序的,我們無法決定它的傳回順序,這是因為 Map 是使用 hash 表來實作的。

var map_variable map[key _type]value _type

map_variable := make(map[key _type]value_type)

用一個示例來看用法:

package main

import "fmt"

func main() {

    var countryCapitalMap map[string]string

    countryCapitalMap = make(map[string]string)

    countryCapitalMap [ "France" ] = "巴黎"

    countryCapitalMap [ "Italy" ] = "羅馬"

    countryCapitalMap [ "Japan" ] = "東京"

    countryCapitalMap [ "India " ] = "新德裡"

    for country := range countryCapitalMap {

        fmt.Println(country, "首都是", countryCapitalMap [country])

    }

    capital, ok := countryCapitalMap [ "American" ]

    if (ok) {

        fmt.Println("American 的首都是", capital)

    } else {

        fmt.Println("American 的首都不存在")

    }

}

delete() 函數用于删除集合的元素, 參數為 map 和其對應的 key。在看一個示例

package main

import "fmt"

func main() {

        countryCapitalMap := map[string]string{"France": "Paris", "Italy": "Rome", "Japan": "Tokyo", "India": "New delhi"}

        fmt.Println("原始地圖")

        for country := range countryCapitalMap {

                fmt.Println(country, "首都是", countryCapitalMap [ country ])

        }

        delete(countryCapitalMap, "France")

        fmt.Println("法國條目被删除")

        fmt.Println("删除元素後地圖")

        for country := range countryCapitalMap {

                fmt.Println(country, "首都是", countryCapitalMap [ country ])

        }

}