Golang 学习笔记 (一)
Go
基本特性
变量/常量
-
导入包的内置变量,字母大写开头
-
函数返回类型和变量放在参数列表后面,函数传参先变量后类型、多个相同类型变量可以把类型放最后
可以简化C当中的函数复杂性
例如,
int (*fp)(int a, int b);
声明了一个函数指针fp
,这个指针指向的函数接受两个int
类型的参数并返回一个int
类型的结果。如果参数之一也是一个函数,声明会变得更加复杂,如int (*fp)(int (*ff)(int x, int y), int b)
。这种情况下,理解和编写类型声明变得非常困难。 -
在变量赋值方面,我觉得很有意思,Golang像是pyhton和C这两者(即弱类型与强类型语言)的结合体
它可以不声明变量类型,像python或js一样
a:=1
或var a=1
(初始化阶段)也可以提前声明类型,像C一样
var a int =10
即(隐式声明/显示声明)
-
函数允许多值返回,接收的时候 := 可以自动识别并赋值,(放在入参列表后面)
看上去挺有趣的,因为可以提前为返回值进行操作/(赋值)
-
有个很逆天的iota,专门使用在const初始化中,在其之后每多声明一个变量,就会自增一次,甚至不重置的话,会自动赋值
-
你要么直接在声明的时候初始化,选择隐式声明;要么显示声明之后,后续进行初始化。
不管如何,初始化是必须的
-
强制类型转换时,使用函数实现 float32(int)
循环
-
没有while 循环,只有for 循环
-
内置下标索引,可以在for的 初始化部分,使用
range
可以自动识别迭代器默认返回两个值 index , value ,如果只接收了一个,会默认返回index
如果只想接收一个,可以选择使用
_
替代一个 如_:value
如
for sub:= range nums
自动取出下标如
for i, sub := range nums
其中的i
就会自动获取下标的索引 -
如果 需要遍历的变量本身就像 map 一样存键值对, 那么也可以像上面那样实现多变量提取
数组
- 和之前一样,类型放后面,需要注意的是,
[size]
需要放在类型前面 - 如果不确定长度,可以先用
...
代替,如nums [...]int
指针
- 指针和之前的数组一样,虽然类型放在后面,但是
*
放在类型前面 nil
就是C中的NULL
- 指针指向结构体,不需要和CPP一样,使用
->
,依旧使用.
来实现访问内部变量 - 使用new 可以返回一个(内部初始化为0)的新指针
结构体
-
声明时类型放在后面
-
初始化的时候,可以直接使用列表初始化的形式
:=structure {value1, value2}
初始化所有内部变量或者自定义,初始化一部分
:=structure{key1:value1,key2:value2}
切片
本身的定义就是 未指定大小的数组,类似于vector
-
初始化可以使用
make
函数(使用make可以初始化长度、容量) -
可以根据下标生成一个新的切片副本(很像python)
如:
a := arr[0:2]
-
!!!居然可以格式化输出一整个容器,厉害的
如
fmt.Printf("%v",a)
会自动遍历并输出整个容器内容甚至可以
%#v
带类型输出,%+v
带字段输出(结构体)应用到的底层原理是反射机制,原理就像CPP动态绑定一样,在运行时能通过反射API检测对象的类型和值
-
通过 append 来实现尾部添加、copy 实现切片拷贝
两者返回的都是新的切片,因此并不是像CPP那样调用对象的方法,而是直接调用函数,返回值是一个新的切片,函数不会修改原切片(除非用指针),通过赋值修改
Map
-
也可以使用make来构造Map
-
Go的Map 类似于CPP的 unordered_map ,基于散列表实现
-
格式化输出时是按key的内部顺序输出,而遍历是按赋值顺序遍历
接口
-
go中的接口和CPP中的接口很像(抽象基类
含纯虚函数
),主要是为了定义一组方法签名,然后通过其他类重写该接口下的方法来实现多态 -
接口中的所有方法都应该被重写,才能调用新的对象
-
接口本身并不是指针或非指针,如果新的类型(结构体)实现了接口的所有方法,那么接口会存储该对象或其指针,后续即可直接调用
类似于基类被子类重写,然后基类指针重新指向子类类型的对象,即可调用子类重写的方法
类型转换
-
num,_ := strconv.Atoi(a)
字符串转成int 时,需要两个变量接收,前一个为值,后一个为errorgo会自动import 新加入的 包
-
接口的类型断言和类型转换
断言用于将接口类型转成指定类型
i.(string)
类型转换用于将接口类型的值转换成另一个接口类型
T(value)
T 是目标接口类型,value 是要转换的值。
仓库
许愿速速OC