目录
数据类型
基础数据类型
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte
rune
float32 float64
complex64 complex128
类型转换
go语言不允许隐式转换
别名类型和原有类型也不能进行隐式转换
类型的预定义值
math.MaxInt64
math.MaxFloat64
math.MaxUint32
指针类型 - 要比想象的简单的多
不支持指针运算
只有值类型和引用类型
string是值类型,其默认为"",而不是nil
自定义类型
type IntConvertionFn func(n int) int
type MyPoint int
类型转换
ex: x.(int) ,x.(type)
空接口
空接口口可以表示任何类型
通过断言言来将空接口口转换为制定类型
v, ok := p.(int) //ok=true 时为转换成功
运算符
算术运算符
+
-
*
/
%
++
–
go语言没有前置的++ 和 –
比较运算符
==
!=
>
<
>=
<=
相同维数且数量一致的数组才可以进行比较,每个元素都一致才为相等。
逻辑运算符
&&
||
!
位运算符
&
|
^
<<
>>
&^ 按位置零 功能与 a&(^b) 功能一致
结构化程序
循环
循环的关键字只有for
if条件
条件表达式必须为布尔值
支持变量赋值
switch条件
条件表达式不限制为整数或者常量
单个 case 中,可以出现多个结果选项, 使用用逗号分隔
与 Java 语言言等规则相反,Go 语言言不不需要用用break来明确退出一一个 case
可以不不设定 switch 之后的条件表达式,在此种情况下,整个 switch 结构与多个 if...else... 的逻辑作用用等同https://mubu.com/doc/iy2N5v-Ilv
使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
数组和切片
数组
声明
var a [3]int //声明并初始化为默认零值
b := [3]int{1, 2, 3} //声明同时初始化
c := [2][2]int{{1, 2}, {3, 4}} //多维数组初始化
遍历
截取
a[开始索引(包含), 结束索引(不不包含)]
切片
声明
var s0 []int
s := []int{}
s1 := []int{1, 2, 3}
s2 := make([]int, 2, 4)
len() 和 cap()
cap()是指底层数组的大小,len()指可以使用的大小
数组 vs 切片
容量量是否可伸缩
是否可以进行行行比比较
Map映射
Map基础
声明
m := map[string]int{“one”: 1, “two”: 2, “three”: 3}
m1 := map[string]int{}
m2 := make(map[string]int, 10 /Initial Capacity/)
访问
在访问的 Key 不不存在时,仍会返回零值,不不能通过返回 nil 来判断元素是否存在
遍历
Map高级
Map和工厂模式
Map 的 value 可以是一一个方方法
与 Go 的 Duck Typing接口口方方式一一起,可以方方便便的实现单一一方方法对象的工工厂厂模式
实现Set
Go 的内置集合中没有 Set 实现, 可以 map[type]bool
元素的唯一一性
基本操作
添加元素
判断元素是否存在
删除元素
元素个数
线程安全 - sync.Map
适合读多写少,且 Key 相对稳定的环境
线程安全 - Concurrent Map
适用用于读写都很频繁的情况
字符串
区别于其他语言
string 是数据类型,不不是引用用或指针类型
string 是只读的 byte slice,len 函数可以它所包含的 byte 数
string 的 byte 数组可以存放任何数据
字符串函数
strings
strconv
函数 - 一等公平
其他语言的差异type MyPoint int
可以有多个返回值
所有的参数都是值传递 , slice,map,channel会有引用传递的错觉
函数可以作为变量的值
函数可以作为参数和返回值
可变参数
func sum(ops ... int)
defer 函数 延迟函数
defer是return之后添加一个函数调用
当defer被声明时,其参数就会被实时解析
defer fmt.Println(i)
封装数据 - struct
创建
e := Employee{“0”, “Bob”, 20}
e1 := Employee{Name: “Mike”, Age: 30}
e2 := new(Employee) //注意这里里里返回的引用用/指针,相当于 e := &Employee{}
初始化
e2.Id = “2" //与其他主要编程语言言的差异:通过实例例的指针访问成员不不需要使用用->
行为定义 结构体指针函数、结构体函数
func (e Employee) test()
在实例例对应方方法被调用用时,实例例的成员会进行行行值复制
func (e *Employee) test()
指针实例会避免内存拷贝
接口 - interface (交互协议)
Duck Type式接口
差异
接口口为非非入入侵性,实现不不依赖于借口口定义
所以接口口的定义可以包含在接口口使用用者包内
复合
Go 不不支支持继承,但可以通过复合的方方式来实现继承
错误机制
差异 error
没有异常机制
error 类型实现了了 error 接口口
可以通过 errors.New 来快速创建错误实例例
panic
panic 用用于不不可以恢复的错误
panic 退出前会执行行行 defer 指定的内容
os.Exit 退出时不不会调用用 defer 指定的函数
os.Exit 退出时不不输出当前调用用栈信息
recover
形成僵尸尸服务进程,导致 health check 失效。
“Let it Crash!” 往往是我们恢复不不确定性错误的最好方方法。
包
基本复用用模块单元
以首首字母母大大写来表明可被包外代码访问
代码的 package 可以和所在的目目录不不一一致
同一一目目录里里里的 Go 代码的 package 要保持一一致
init方法
在 main 被执行行行前,所有依赖的 package 的 init 方方法都会被执行行行
不不同包的 init 函数按照包导入入的依赖关系决定执行行行顺序
每个包可以有多个 init 函数
包的每个源文文件也可以有多个 init 函数
标签:Map,函数,defer,int,接口,golang,string,语言
From: https://blog.csdn.net/qq_31532979/article/details/136458458