这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
bool类型
布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true
数值型
- 整数型
可以简单讲解一下二进制和位数的关系,以及int和uint的关系
- int8 有符号 8 位整型 (-128 到 127) 长度:8bit
- int16 有符号 16 位整型 (-32768 到 32767)
- int32 有符号 32 位整型 (-2147483648 到 2147483647)
- int64 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
- uint8 无符号 8 位整型 (0 到 255) 8位都用于表示数值:
- uint16 无符号 16 位整型 (0 到 65535)
- uint32 无符号 32 位整型 (0 到 4294967295)
- uint64 无符号 64 位整型 (0 到 18446744073709551615)
有符号数会拿出第一位表示正/负数,上限会变小
- 浮点型
- float32 32位浮点型数
- float64 64位浮点型数
其他
- byte 等于 uint8
- rune 等于 int32
- uint 32 或 64 位
据类型转换
strconv Itoa和Atoi
Parse类函数 Parse类函数用于转换字符串为给定类型的值
Format类函数 将给定类型格式化为string类型
错误和异常
错误和异常 错误就是可以预先知道的出错的可能,这个时候我们把这情况叫做错误, 不可预知的问题叫做异常 程序员写的代码不严谨造成的某个地方在某种情况下产生了异常
比如Django的get方法,我们必须通过文档来看到底是返回空list,还是异常
异常 go语言中如何抛出异常和如何捕捉异常 go语言认为错误就要自己处理, 就个人而言,go语言的这种想法是正确的。但是实际的使用中确实人有点烦人
面向对象
go语言不支持面向对象
对Python而言,如果只关心数据,用tuple更合适,tuple更省内存 性能更高 namedtuple很像是一个只能封装数据的类 但是namedtuple的性能比class高, 内存会比class小很多
go语言的struct更像是namedtuple, 尽量配置简单的语法尽量猜测你的意图
python里面,类属性加_代表变量是内部使用
大小写在go语言中的重要性 可见性 一个包中的变量或者结构体如果首字母是小写 那么对于另一个包不可见 机构体定义的 名称 以及属性首字母大写很重要
接口
go语言的接口(protol 协议)设计是参考了鸭子类型(python)和java的接口 什么是鸭子类型? 什么叫协议 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子 采用的是面向对象的类继承
dog是不是动物类 实际上dog就是动物类 忽略了鸭子类型, 对于用惯面向对象的人来说呢 这个做法有点奇怪 python语言本身的设计上来讲是基于鸭子类型实现的 Animal实际上只是定义了一些方法的名称而已 其他的任何类只要实现了这个Animal里面的方法那你类就是Animal类型
for语句 可以对dict, list tuple set等等类型进行for循环 for语句可以对iterable类型进行操作 只要你实现了__iter__那你就可以进行for循环 你的类继承了什么不重要 你的类名称不重要 重要的是你实现了什么魔法方法
python本身是基于鸭子类型设计的一门语言 - 协议最重要 python靠的是方法名,协议,比如django的中间件 强调 什么是鸭子类型 非常推荐大家去好好的学习python中的魔法方法
通过Python的鸭子类型去学习go的接口
包管理和编码规范
包管理,异常处理,泛型被诟病很多
能用go modules就用modules,不用去考虑以前的开发模式 即使你使用了以前的模式,也可以自动设置为现在的modules模式
go modules是一个统一的做法
同一个包下面的文件,package要定成一样的
// 1. 新建项目的时候选择go modules // 2. 新建一个包的时候,新建一个文件夹一般小写 这个文件夹下面的所有源码中的package都一样 // 3. import "PackageTest/calc" 实际上很多人会认为包名,实际上是包的路径 // 4. 同一个文件夹下面的package名称可以不和文件夹名称保持一致,但是这些源码中的package