Go简单介绍(补充)
Go是编译型语言,Go的工具链将程序的源文件转变成机器相关的原生二进制指令,这些工具可以通过单一的go命令配合其子命令进行使用,Go原生支持Unicode,所以它可以处理所有国家的语言;
包的认识(补充)
fmt 包 其中的函数用来格式化输出和扫描输入,gofmt工具将代码以标准格式重写;
os包 提供一些函数和变量,以与平台的方式和操作系统打交道;
(接上)
三、基本知识梳理
1、程序的基本结构
任何一个代码文件隶属一个包
golang可执行程序,package main,并且有且只有一个main入口函数
对于包中函数的调用:在同一个包中的函数直接调用;不同包中函数,通过包.函数名进行调用
包访问控制规则:
1.大写意味着这个函数/变量是可导出的;
2.小写意味着这个函数/变量是私有的,包外部不能访问;
空标识符(_):可以用在任何语法需要变量名但程序逻辑不需要的地方,例如丢弃每次迭代产生的无用的索引(注意,Go不允许存在无用的临时变量);
2、map
存储一个键值对集合,并且提供常量时间的操作来存储、获取或测试集合中的某个元素。
键可以是其值能够进行相等(==)比较的任意类型;值可以是任意类型。
内置的函数make可以用来新建map,map里面一个元素对应一个值,键的迭代顺序不是固定的,通常是随机的,每次运行都不一致,它是一个使用make创建的数据结构的引用。
当一个map被传递给一个函数时,函数接收到的是这个引用的副本,所以被调用函数中对于map数据结构中的改变函数调用者使用的map引用也是可见的;
注意,因为map元素怒的迭代顺序是不固定的,不同的实现方法会使用不同的散列算法,得到不同的元素熟顺序,即我们无法获取map元素的地址,因为map的增长可能导致已有元素被重新散列到新的存储位置,这样就可能使得获取的地址无效;
3、指针:Go语言存在指针,但是与C语言不同的是,指针不支持算数运算,它是显式可见的,&操作符可以获取一个比那辆的地址,*操作符可以获取指针引用的变量的值;
4、短变量声明:不需要声明所有在左边的变量,如果一些变量在同一个词法块中声明,那么对于那些变量,短声明的行为等同于赋值。另外,短变量声明最少声明一个新变量,否则,代码编译将无法通过,且只有在同一个词法块中已经存在变量的情况下,短声明的行为才和赋值操作一样,外层的声明将被忽略;
5、new函数
使用new创建的变量和取其地址的局部变量没有什么不同,只是不需要引入(和声明)一个虚拟的名字,通过new(T)就可以直接在表达式中使用;
6、生命周期
需要了解的是,在长生命周期对象中保持短生命周期对象不必要的指针,特别是在全局变量中,会阻止垃圾回收器回收短生命周期的对象空间;
7、声明和变量的区别
声明的作用域是声明在程序文本中出现的区域,它是一个编译时属性;
变量的生命周期是变量在程序执行期间能被程序的其他部分所引用的起止时间,它是一个运行时属性;
8、字符串处理
strings包 用于搜索、替换、比较、修整、切分与连接字符串;
bytes包 用于操作字节slice,由于字符串不可变,因此按增量方式构建字符串会导致多次内存分配和赋值,这种情况下,使用bytes.Buffer类型更高效;
strconv包 用于布尔值、整数、浮点数与字符串的相互转换;
unicode包 用于判断文字符号值特性;
注意:[]byte(s)转换操作会分配新的字节数组,拷贝填入s含有的字节,并生成一个slice引用,指向整个数组;
9、数组
数组的长度是数组类型的一部分,且长度必须是常量表达式,如果有省略号“…”出现在数组长度位置,那么数组的长度由初始化数组的元素个数决定;
当调用一个函数的时候,每个传入的参数都会创建一个副本,然后赋值给对应的函数变量,所以函数接受的是一个副本,而不是原始的参数。
使用这种方式传递大的数组会变得很低效,并且在函数内部对数组的任何修改都仅影响副本,而不是原始数组。
当然,也可以显式地传递一个数组的指针给函数,这样在函数内部对数组的任何修改都可以反映到原始数组上面。但是因为数组长度是固定的,所以数组本身是不可变的,即无法接收其他长度类型的数组,也不能给数组添加或者删除元素;
10、结构体
与数组不同的是,结构体可以存储不同类型的变量,除此之外,结构体还可以进行嵌套使用,只不过需要注意的是,如果在嵌套结构的结构体的时候出现两个相同的变量,赋值和访问的时候需要遵循就近原则;
11、JSON
JSON的数组用来编码Go里面的数组和slice,是一个有序的元素序列;
JSON的对象用来编码Go里面的map(键为字符串类型)和结构体,是一个从字符串到值的映射;
12、函数调用
在调用函数的时候,实参是按值传递的,所以函数接收到的是每个实参的副本,修改函数的形参变量并不会影响到调用者提供的实参。然而,如果提供的实参包含引用类型,比如指针、slice、map、函数或者通道,那么当函数使用形参变量时就有可能会间接地修改实参变量;