当前位置: 首页 > news >正文

布尔类型_6. Go语言数据类型:字典与布尔类型

e96217c8d094a79881a218ef27d39d98.png

大家好,我是明哥。

由于某些不可抗力,之前该专栏的所有内容都被删除了。因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒。


本文原文:http://golang.iswbm.com

Github:http://github.com/iswbm/GolangCodingTime

1. 字典

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

它是哈希表的一个实现,这就要求它的每个映射里的key,都是唯一的,可以使用 ==!= 来进行判等操作,换句话说就是key必须是可哈希的。

什么叫可哈希的?简单来说,一个不可变对象,都可以用一个哈希值来唯一表示,这样的不可变对象,比如字符串类型的对象(可以说除了切片、 字典,函数之外的其他内建类型都算)。

意思就是,你的 key 不能是切片,不能是字典,不能是函数。。

字典由key和value组成,它们各自有各自的类型。

在声明字典时,必须指定好你的key和value是什么类型的,然后使用 map 关键字来告诉Go这是一个字典。

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)
}

字典的相关操作

添加元素

scores["math"] = 95

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

scores["math"] = 100

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

fmt.Println(scores["math"])

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

delete(scores, "math")

当访问一个不存在的key时,并不会直接报错,而是会返回这个 value 的零值,如果 value的类型是int,就返回0。

package main

import "fmt"

func main() {
    scores := make(map[string]int)
    fmt.Println(scores["english"]) // 输出 0
}

判断 key 是否存在

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

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

import "fmt"

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

我们将上面的代码再优化一下

import "fmt"

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

如何对字典进行循环

Go 语言中没有提供类似 Python 的 keys() 和 values() 这样方便的函数,想要获取,你得自己循环。

循环还分三种

  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: %dn", subject, score)
    }
}
  1. 只获取key,这里注意不用占用符。
import "fmt"

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

    for subject := range scores {
        fmt.Printf("key: %sn", subject)
    }
}
  1. 只获取 value,用一个占位符替代。
import "fmt"

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

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

2. 布尔类型

关于布尔值,无非就两个值:true 和 false。只是这两个值,在不同的语言里可能不同。

在 Python 中,真值用 True 表示,与 1 相等,假值用 False 表示,与 0 相等

>>> True == 1
True
>>> False == 0
True
>>> 

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

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

a441d8aa4ad2724900dcc4d12067a353.png

Go 中确实不如 Python 那样灵活,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 
}

在 Python 中使用 not 对逻辑值取反,而 Go 中使用 ! 符号

import "fmt"

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

// output: true

一个 if 判断语句,有可能不只一个判断条件,在 Python 中是使用 andor 来执行逻辑运算

>>> age = 15
>>> gender = "male"
>>> 
>>> gender == "male" and age >18
False

而在 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

好了,今天的文章就到这里了。

若今天的分享对你有帮助,不如点个赞,支持一下?

相关文章:

  • chord协议模拟实现_Modbus 通讯协议,每个工控人都应该了解的事
  • 方法的重载与重写_如何从jvm角度看懂类初始化、方法重载、重写
  • 简单代码画皮卡丘_超酷!用 Python 教你绘制皮卡丘和哆啦A梦
  • 分析函数hive计算均值_Hive第六天——Hive函数(开窗函数之累计统计)
  • 蓝卡攻略_剑与远征:4.18版本的新手攻略,崛起的三巨头
  • 关抢占 自旋锁_Linux学习第28节,什么是自旋锁?内核是如何设计,如何实现它的...
  • 2019pro与air怎么选_iPad Air 2019 VS iPad Pro 10.5 | 普通人的角度简单思考
  • mysql安装教程与启动_MySql安装启动两种方法教程详解
  • apparmor mysql_Ubuntu 上更改 MySQL 数据库数据存储目录
  • mysql工程师需要会哪些_MySQL面试高频100问(工程师方向)
  • mysql 客户端 连接数_监控mysql上客户端的连接数
  • mysql带库名查询_MySQL优化
  • docker mysql 差8小时_docker之容器日志输出与系统时间相差8小时解决办法
  • java白盒测试问题_白盒测试项目实践经验总结(三)-返回码问题
  • 9点到17点半 cron_定时任务Quartz简单配置与cron表达式
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Gradle 5.0 正式版发布
  • idea + plantuml 画流程图
  • JavaScript创建对象的四种方式
  • Js基础知识(四) - js运行原理与机制
  • k个最大的数及变种小结
  • Python学习笔记 字符串拼接
  • Transformer-XL: Unleashing the Potential of Attention Models
  • TypeScript迭代器
  • 爱情 北京女病人
  • 从0到1:PostCSS 插件开发最佳实践
  • 分布式熔断降级平台aegis
  • 手写一个CommonJS打包工具(一)
  • 微信小程序实战练习(仿五洲到家微信版)
  • 移动端唤起键盘时取消position:fixed定位
  • 智能合约Solidity教程-事件和日志(一)
  • mysql面试题分组并合并列
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • %check_box% in rails :coditions={:has_many , :through}
  • (C语言)fread与fwrite详解
  • (NSDate) 时间 (time )比较
  • (二)构建dubbo分布式平台-平台功能导图
  • (二)丶RabbitMQ的六大核心
  • (七)理解angular中的module和injector,即依赖注入
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)基于IDEA的JAVA基础10
  • (原創) 未来三学期想要修的课 (日記)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .htaccess 强制https 单独排除某个目录
  • .NET Micro Framework初体验(二)
  • .NET MVC 验证码
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 分布式技术比较
  • .net(C#)中String.Format如何使用
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net8 Blazor 尝鲜
  • .NET委托:一个关于C#的睡前故事