Go語言 字典和結(jié)構(gòu)體

Go語言字典

  • 概念
  • 字典和數(shù)組切片一樣也是用來保存一組相同類型數(shù)據(jù)的
  • 數(shù)組和切片能通過相應(yīng)的索引/下標(biāo)獲得對應(yīng)的值
  • 字典能通過對應(yīng)的key來獲得對應(yīng)的值,key 由自己定義
  • 個(gè)人理解 GO語言中的字典就相當(dāng)于是完全自定義的數(shù)組或切片
  • 定義格式
var  字典名稱 map [ key的數(shù)據(jù)類型 ] value的數(shù)據(jù)類型
var  dict  map[int]int 
  • 注意點(diǎn): 字典也需要初始化之后才能使用
  • 如何創(chuàng)建字典
1. 通過GO語言的自帶語法創(chuàng)建
package main

import "fmt"

func main() {

    // 第一種格式
    var dict map[int]int = map[int]int{0:7,1:9,2:11}

    //第二種
    var dict1 map[int]int
    dict1 = map[int]int{0:1,1:666,2:888}

    fmt.Println("dict = ",dict)  // dict =  map[0:7 1:9 2:11]

    fmt.Println("dict1 = ",dict1)  // dict1 =  map[0:1 1:666 2:888]

}
2. 通過make() 函數(shù)創(chuàng)建字典
  • 格式

    make ( 字典數(shù)據(jù)類型, 字典長度 )  ----->  長度可以不寫
    
  • 如果知道要定義的字典長度最好寫上

package main

import "fmt"

func main() {

    var dict map[int]int  // 定義一個(gè)字典變量

    dict = make(map[int]int,3)  

    dict[0] = 7
    dict[1] = 9
    dict[2] = 11

    fmt.Println("dict = ",dict)  // dict =  map[0:7 1:9 2:11]

}
  • 如果定義了字典,沒有初始化的話 其長度是0
package main

import "fmt"

func main() {

    var dict map[int]int

    dict = make(map[int]int)

    var dict1 map[int]int

    dict1 = make(map[int]int,3)

    fmt.Println(len(dict))  // 0

    fmt.Println(len(dict1))  // 0

}
  • 遍歷字典
package main

import "fmt"

func main() {

    dict := map[string]string{"name":"小明","age":"18"}

    for key,value := range dict{
        
        fmt.Println("key = ",key,"value = ",value)
        
    }

}

字典的曾刪改查

1.增加
  • 如果字典中沒有對應(yīng)的key就是增加
  • 注意點(diǎn) 字典中不能有重名的 [key]
  • 格式
字典名稱[key] = 值

dict[3] = 666

2.修改
字典名稱[key] = 值  ----> 有對應(yīng)的值就是修改
package main

func main() {

    dict := map[string]string{"name":"小明","age":"18"}

    dict["name"] = "小紅"

}

3.查詢
  • 格式
value , ok := 字典名稱 [ 查詢的key值 ] ----------> value , ok :=  dict [ " name " ]
package main

import "fmt"

func main() {

    dict := map[string]string{"name":"小明","age":"18"}

    dict["name"] = "小紅"

    value,ok := dict["name"]

    fmt.Println(ok)   // true
    fmt.Println(value) // 小紅

}
  • 企業(yè)中標(biāo)準(zhǔn)的查詢字典的寫法
package main

import "fmt"

func main() {

    dict := map[string]string{"name":"小明","age":"18"}

    if value,ok := dict["name"];ok{
        fmt.Println(ok)
        fmt.Println(value)
    }
}

4.刪除
  • 格式
delete( 字典名稱 , key值)
package main

import "fmt"

func main() {

    dict := map[string]string{"name":"小明","age":"18"}

    delete(dict,"name")

    fmt.Println(dict)  // map[age:18]
}

字典的注意點(diǎn)

  • 字典和切片一樣是地址傳遞,所以字典作為函數(shù)參數(shù)時(shí)修改形參會(huì)影響實(shí)參
  • 字典里保存的數(shù)據(jù)是無序

Go語言結(jié)構(gòu)體

概念

  • 和C語言一樣,go語言中的結(jié)構(gòu)體也是用來保存不同數(shù)據(jù)類型
  • 需要先定義結(jié)構(gòu)體類型,在定義結(jié)構(gòu)體變量
  • 結(jié)構(gòu)體定義完就可以使用
定義格式
type 結(jié)構(gòu)體名稱 struct{
      屬性1名稱  數(shù)據(jù)類型
      屬性2名稱  數(shù)據(jù)類型
      屬性3名稱  數(shù)據(jù)類型
}
  • 實(shí)例
package main

func main() {
    //定義結(jié)構(gòu)類型
    type person struct{
        name string
        age  int
        height int
    }
}
定義結(jié)構(gòu)體變量
  • 格式
var 結(jié)構(gòu)體變量名稱  結(jié)構(gòu)體類型
  • 實(shí)例
package main

func main() {
    //定義結(jié)構(gòu)類型
    type person struct{
        name string
        age  int
        height int
    }

    var  people  person  // people 是結(jié)構(gòu)體變量
    
}
結(jié)構(gòu)體變量初始化
  • 定義的同時(shí)初始化
  • 注意點(diǎn) 如果部分初始化需要指定屬性名稱
package main

func main() {
    //定義結(jié)構(gòu)類型
    type person struct{
        name string
        age  int
        height int
    }
   // 定義的同時(shí)初始化
    var people person = person{"小紅",18,170}  //完全初始化
}
  • 先定義再初始
package main

func main() {
    //定義結(jié)構(gòu)類型
    type person struct{
        name string
        age  int
        height int
    }
  // 定義結(jié)構(gòu)變量
    var people person
    people.name = "小紅"
    people.age = 18
    people.height = 170
}

結(jié)構(gòu)體注意點(diǎn)

  • 結(jié)構(gòu)體和函數(shù)一樣 作為參數(shù)傳入函數(shù)里,外界實(shí)參不會(huì)被改變
  • 如果結(jié)構(gòu)體中包含切片和字典類型 需要先初始化在使用
  • 結(jié)構(gòu)體之間的轉(zhuǎn)換 必須保證結(jié)構(gòu)體的屬性名稱 屬性數(shù)據(jù)類型 屬性個(gè)數(shù)完全一樣才能轉(zhuǎn)換

匿名結(jié)構(gòu)體屬性

  1. 匿名結(jié)構(gòu)體屬性就是有數(shù)據(jù)類型沒有屬性名稱
type Person struct {
        int // 只有數(shù)據(jù)類型, 沒有名稱, 就是匿名屬性
        name string
    }
  • 結(jié)構(gòu)體嵌套是如何操作屬性
結(jié)構(gòu)體變量 . 屬性名稱
type Person struct {
        age int 
        name string
    }
var p person  // 定義結(jié)構(gòu)題變量

p. age  

p.name
  • 嵌套
結(jié)構(gòu)體變量 . 嵌套的結(jié)構(gòu)體類型 . 嵌套結(jié)構(gòu)里的屬性
  • 嵌套的注意點(diǎn)
  1. 結(jié)構(gòu)體屬性類型不能是當(dāng)前結(jié)構(gòu)體類型
  2. 嵌套時(shí)只有結(jié)構(gòu)體里的匿名屬性才會(huì)向上去尋找
  3. 如果嵌套的結(jié)構(gòu)體中有重名的屬性時(shí),系統(tǒng)會(huì)就近原則,現(xiàn)在自己的結(jié)構(gòu)體里尋找,如果沒有再去嵌套的結(jié)構(gòu)里尋找
package main

import (
    "fmt"
)

func main() {

    type Object struct{
        name string
    }

    type Person struct{
        name string
    }

    type Student struct {
        Object
        Person
        name string
        score int
    }

    stu := Student{Object{"Object"},Person{"person"},"student",99}

    fmt.Println(stu.name)  // student
    fmt.Println(stu.Object.name)  // Object
    fmt.Println(stu.Person.name)  // person

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容