[Golang]-2 Map关联数组与下划线(_)的意义

map

map 是 Go 内置关联数据类型(在一些其他的语言中称为哈希 或者字典 )。

func main() {
    // 要创建一个空 map,需要使用内建的 make(map[key-type]val-type).
    m := make(map[string]int)

    // 使用典型的 make[key] = val 语法来设置键值对。
    m["k1"] = 7
    m["k2"] = 13
    fmt.Println("map:", m)

    // 使用 name[key] 来获取一个键的值
    v1 := m["k1"]
    fmt.Println("v1: ", v1)
    // 当对一个 map 调用内建的 len 时,返回的是键值对数目
    fmt.Println("len:", len(m))
    // 内建的 delete 可以从一个 map 中移除键值对
    delete(m, "k2")
    fmt.Println("map:", m)

    // 当从一个 map 中取值时,可选的第二返回值指示这个键是在这个 map 中。这可以用来消除键不存在和键有零值,像 0 或者 "" 而产生的歧义。
    _, prs := m["k2"]
    fmt.Println("prs:", prs)

    pr := m["k2"]
    fmt.Println("pr:", pr)

    // 你也可以通过这个语法在同一行申明和初始化一个新的map。
    n := map[string]int{"foo": 1, "bar": 2}
    fmt.Println("map:", n)
}
输出
map: map[k1:7 k2:13]
v1:  7
len: 2
map: map[k1:7]
prs: false
pr: 0
map: map[bar:2 foo:1]

下划线(underscore)

用在import

import  _  "net/http/pprof"

pprof常见用法。引入包,会先调用包中的初始化函数,这种使用方式仅让导入的包做初始化,而不使用包中其他功能。

定义了一个Foo struct,然后对它进行初始化

package foo
import "fmt"
type Foo struct {
        Id   int
        Name string
}
func init() {
        f := &Foo{Id: 123, Name: "abc"}
        fmt.Printf("init foo object: %v\n", f)
}

然后在main函数里面引入test/foo

package main
import (
        "fmt"
        _ "test/foo"
)
func main() {
        fmt.Printf("hello world\n")
}

输出
init foo object: &{123 abc}
hello world

我们可以看到:在main函数输出”hello world”之前就已经对foo对象进行初始化了!

用在返回值

for _,v := range Slice{}
_,err := func()

表示忽略某个值。单函数有多个返回值,用来获取某个特定的值

用在变量

type T struct{}
var _ I = T{}

其中 I为interface。上面用来判断 type T是否实现了I,用作类型断言,如果T没有实现借口I,则编译错误.

posted @ 2020-12-14 17:03  哆啦梦乐园  阅读(223)  评论(0编辑  收藏  举报