Go语言自学十八式:布尔型和字典篇

字典

字典(Map 类型),是由若干个 key:value 这样的键值对映射组合在一起的数据结构。

key必须是可哈希的。它是哈希表的实现,要求每个映射里的key唯一,即可以使用 == 和 != 来进行判等操作。

可哈希是指:一个不可变对象(key),都可以用一个哈希值来唯一表示,这样的不可变对象,比如字符串类型的对象(也就是说key 不能是切片,不能是字典,不能是函数)。 

声明字典时,必须指定key和value的类型,然后使用 map 关键字表明是字典:

map[KEY_TYPE]VALUE_TYPE

声明初始化字典

三种声明并初始化字典的方法

// 第一种方法
var scores map[string]int = map[string]int{"English": 80, "chinese": 85}

// 第二种方法
scores := map[string]int{"English": 80, "chinese": 85}

// 第三种方法
scores := make(map[string]int)
scores["English"] = 80
scores["chinese"] = 85

要注意的是,第一种方法如果拆分成多步(声明、初始化、再赋值),和其他两种有很大的不一样了,相对会比较麻烦(具体请看注释)。

import "fmt"

func main() {
    // 声明一个名为 score 的字典
    var scores map[string]int

    // 未初始化的 score 的零值为nil,无法直接进行赋值
    if scores == nil {
        // 需要使用 make 函数先对其初始化
        scores = make(map[string]int)
    }

    // 经过初始化后,就可以直接赋值
    scores["chinese"] = 90
    fmt.Println(scores)
}

添加或更新字典元素

若key已存在,则直接更新value

scores["math"] = 95

读取字典元素

直接使用 [key] 即可 ,如果 key 不存在,也不报错,会返回其 value-type 的零值。

fmt.Println(scores["math"])

删除字典元素

使用 delete 函数,如果 key 不存在,delete 函数会静默处理,不会报错。

delete(scores, "math")

判断 key 是否存在

不能通过返回的结果是否是零值来判断对应的 key 是否存在,因为 key 对应的 value 值可能恰好就是零值。

其实字典的下标读取可以返回两个值,使用第二个返回值都表示对应的 key 是否存在,若存在ok为true,若不存在,则ok为false

import "fmt"

func main() {
    scores := map[string]int{"english": 80, "chinese": 85}
    if mathValue, ok := scores["math"]; ok {
        fmt.Printf("math 的值是: %d", mathValue)
    } else {
        fmt.Println("math 不存在")
    }
}

对字典进行循环

Go 语言中没有提供方便的函数,想要获取,你得自己循环。

循环还分三种:

1. 获取 key 和 value

import "fmt"

func main() {
    scores := map[string]int{"English": 80, "chinese": 85}

    for subject, score := range scores {
        fmt.Printf("key: %s, value: %d\n", subject, scores)
    }
}

 2. 只获取key,这里注意不用占用符。

import "fmt"

func main() {
    scores := map[string]int{"English": 80, "chinese": 85}

    for subject := range scores {
        fmt.Printf("key: %s\n", subject)
    }
}

 3. 只获取 value,用一个占位符替代。

import "fmt"

func main() {
    scores := map[string]int{"English": 80, "chinese": 85}

    for _, score := range scores {
        fmt.Printf("value: %d\n", score)
    }
}

布尔型

在 Go 中,真值用 true 表示,不但不与 1 相等,并且更加严格,不同类型无法进行比较,而假值用 false 表示,同样与 0 无法比较。

如下图所示,Goland 直接波浪线提示类型不匹配,不能比较。

bool 与 int 的转换

Go 中确实不太灵活,bool 与 int 不能直接转换,如果要转换,需要你自己实现函数。

bool 转 int

func bool2int(b bool) int {
    if b {
        return 1
    }
    return 0
}

int 转 bool

func int2bool(i int) bool { 
    return i != 0 
}

逻辑操作

 对逻辑值取反,Go 中使用 ! 符号

import "fmt"

var male bool = true
func main()  {
    fmt.Println( !male == false)
    // 或者
    fmt.Println( male != false)
}

// output: true

一个 if 判断语句,有可能不只一个判断条件,在 Go 语言中,则使用 && 表示,用 || 表示,并且有短路行为即左边表达式已经可以确认整个表达式的值,那么右边将不会再被求值):

import "fmt"

var age int = 15
var gender string = "male"
func main()  {
    //  && 两边的表达式都会执行
    fmt.Println( age > 18 && gender == "male")
    // gender == "male" 并不会执行
    fmt.Println( age > 18 || gender == "male")
}

// output: false
// output: true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值