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)體屬性
- 匿名結(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)
- 結(jié)構(gòu)體屬性類型不能是當(dāng)前結(jié)構(gòu)體類型
- 嵌套時(shí)只有結(jié)構(gòu)體里的匿名屬性才會(huì)向上去尋找
- 如果嵌套的結(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
}