Golang map(无set)

创建,初始化,删除查找遍历判断

package main
import (
	"fmt"
	"sort"
)


func main() {
	// 一、创建
	// 1。make
	// make(map[keytype]valuetype, cap)
	// 或者 make(map[keytype]valuetype)
	tall := make(map[string]float64)
	// 2. map[key]value{初始化} 
	ages := map[string]int{
		"alice":31,
		"amy":34,
	}

	// 3。使用下标
	ages["aaa"] = 2

	fmt.Println(ages) // map[aaa:2 alice:31 amy:34]
	fmt.Println(tall) // map[]

	// 二、删除。使用内置的delete函数,key不存在也不会产生错误
	delete(ages, "alice")
	fmt.Println(ages) // map[aaa:2 amy:34]

	// 三、下标语法访问
	ages["bob"]++
	fmt.Println(ages) // map[aaa:2 amy:34 bob:1]
	
	// 四、遍历
	for name, age := range ages {
		fmt.Printf("%s\t%d\n", name, age)
	}
	// 不要value的遍历
	for name := range ages {
		...
	}
	// 不要key的遍历
	for _, age := range ages {
		...
	}
	fmt.Println(".............................")

	// 五、按照key排序
	// 调用sort.Strings对key进行排序
	var names []string // key的一个集合
	for name := range ages {
		names = append(names, name)
	}
	sort.Strings(names)
	for _, name := range names {
		fmt.Printf("%s\t%d\n", name, ages[name])
	}

	// 六、map类型的零值是nil,没有引用任何哈希表
	var weights map[string]float64
	fmt.Println(weights == nil) 	// true
	fmt.Println(len(weights) == 0)  // true

	// 向一个nil值的map存入元素将导致一个panic异常
	// 在向map存数据前必须先创建map。(make)
	// weights["carol"] = 21.0 // panic: assignment to entry in nil map
	tall["carol"] = 158				// tall是make创建的map,可以直接存入元素
	fmt.Println(tall) 				// map[carol:158]

	// 七、判断元素是否存在
	// 下标运算符有2个返回值,一个value,一个flag
	if age, ok := ages["bob"]; !ok {
		// 不存在bob这个key
		fmt.Println("no exist", age)
	} else {
		fmt.Println("exist", age)
	}

	// 八、和slice一样,map之间不能比较。只能通过循环实现
	fmt.Println(equal(ages, map[string]int{
		"amy":34,
		"aaa":2,
	}))									// false
	fmt.Println(equal(ages, map[string]int{
		"amy":34,
		"aaa":2,
		"bob":1,
	}))									// true
}

func equal (map1, map2 map[string]int) bool {
	if len(map1) != len(map2) {
		fmt.Println("dafdf")
		return false
	}

	for key1, value1 := range map1 {
		if value2, ok2 := map2[key1]; !ok2 || value1 != value2 {
			return false
		} 
	}
	return true
}

map类型的切片

vector<map<string, int>>

Go中需要先make切片,再对每个元素make map

	items := make([]map[string]int, 5)
	for i:= range items {
		items[i] = make(map[string]int, 1) // cap = 1
		items[i]["1"] = i
	}
	fmt.Printf("Version A: Value of items: %v\n", items)

排序

如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序,然后可以使用切片的 for-range 方法打印出所有的 key 和 value。

// the telephone alphabet:
package main
import (
	"fmt"
	"sort"
)

var (
	barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,
							"delta": 87, "echo": 56, "foxtrot": 12,
							"golf": 34, "hotel": 16, "indio": 87,
							"juliet": 65, "kili": 43, "lima": 98}
)

func main() {
	fmt.Println("unsorted:")
	for k, v := range barVal {
		fmt.Printf("Key: %v, Value: %v / ", k, v)
	}
	keys := make([]string, len(barVal))
	i := 0
	for k, _ := range barVal {
		keys[i] = k
		i++
	}
	sort.Strings(keys)
	fmt.Println()
	fmt.Println("sorted:")
	for _, k := range keys {
		fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
	}
}
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读