GO---基本结构和数据类型
kubernetes
的开发语言就是 GO ,也就是说要想深入的去理解他的工作流程我们就需要去学习这个编程语言,包括其一些编码的骚操作这些。
1、文件名、关键字及标识符
1.1、标识符
我们在编码时需要操作的标识符也就是以下的几类:关键字、标识符、文件名。
-
关键字
关键字 作用 关键字 作用 break 跳出当前循环 case 匹配 case,自动跳出 chan 管道(先进先出的消息队列) const 声明一个常量 continue 跳出此次循环 default 默认 case defer 函数返回之前调用 else 条件表达式 fallthrough 强制执行 case 后面的 for 唯一循环结构 func 定义函数 go go funcName() 开启并发 goto 标记跳转 if 条件表达式 import 引入一个包 interface 方法的集合 map 哈希表 package 定义一个包 range 遍历可拆分元素(下标、对应元素) return 函数返回 select 同时等待多个通道操作 struct 结构体 switch 选择 case type 定义类型 var 定义变量 -
标识符
由 UTF-8、_ 开头后跟 ***** 多个字符或者 Unicode 数字
-
文件名
小写字母组成,多个单词则用下划线进行划分(不包含空格或其他的特殊字符)。
2、基本结构和要素
-
包
类似于命名空间的这样用法,一个 GO 文件标识一个包,有且也仅属于一个包,一个包内可以有多个程序文件(包名使用小写字母作为标识)。
-
入口类
标识了
package main
的作为一个可独立执行的程序文件,其他的包即使能够编译也不是一个可执行的文件。 -
导包
通过
import package
的形式可以导入一个包,可在当前目录或者绝对目录下进行寻找、也可以在全局文件中进行寻找。 -
可见性
标识符首字母大写则表示全局可见,可以随着包一起导出使用;标识符首字母小写则表示只在当前的包中可见,不可对外进行引用。
2.1、函数定义
GO 的函数定义方式很简单,用关键字跟上函数名、参数、返回值就可以了(参数和返回值通常由名称和类型组成),具体的形式如下所示:
func functionName(parameter_list) (return_value_list) {
…
}
2.2、程序执行流程
- 按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程:
- 如果该包又导入了其它的包,则从第一步开始 递归执行,但是每个包只会被导入一次。
- 然后以相反的顺序在每个包中 初始化常量和变量,如果该包含有 init() 函数的话,则调用该函数。
- 在完成这一切之后,main 也执行同样的过程,最后 调用 main 函数 开始执行程序。
2.3、类型转换
没有隐式的类型转换,也就是需要显示的调用类型来进行转换:类型 B 的值 = 类型 B(类型 A 的值)
- 小范围的类型可以转换大范围的类型;
- 相同底层的类型可以相互转换。
3、常量
常量使用关键之 const
来定义,用于存储不会改变的数据(只能是布尔型、数字型以及字符型)。
const b string = "abc" // 显式类型定义
const b = "abc" //隐式类型定义
**TP:**常量的赋值必须是在编译期就能确定的,可以通过计算来获得,但是最终的计算结果必须能够获得,不能使用自定函数的方式来赋值(内置函数可以)。
-
iota
可在表达式中使用,其初始为 0,每使用一次就会自动的递增(在同一个 const 的常量块定义中)
4、变量
使用 var
关键字来定义,可在运行期间进行值的更改(他的类型在变量名之后出现)。
var name string
4.1、作用域
-
全局变量
在函数体外进行定义的变量即可在函数、包内、包外地方进行引用,但是需要遵守前面说明的可见性原则。
-
局部变量
指在一个函数体内部进行定义的变量,其作用域就在当前定义位置往后的代码块中。
4.2、值类型和引用类型
和 Java
整个代码中都是值复制,但是针对于引用类型的复制就是将当前对象的地址给复制出去,也就是所谓的浅复制,同时接受这两个变量的变化修改当前所指向内存的值。
4.3、初始化声明
GO 本身可以进行自动类型推断的,我们在使用 var
进行变量声明时指定的那个类型就有点突兀了,可以使用 :=
来对变量进行声明和初始化赋值(只能被用在函数体内,而不可以用于全局变量的声明与赋值)。
这个关键字只有在第一次出现的时候可以使用,后面变量的重新复制不可使用。
5、基本类型和运算符
5.1、布尔类型
和 Java 语言中的关键字使用类似,支持同样的逻辑表达运算。
5.2、数字类型
主要分为整型表达和浮点型表达,和 Java 中不同的是在不同的机器下,int 类型的占位不同,32 机器下即为 4 字节、64 为机器下即为 8 字节(常量之间可以混合使用)。
浮点类型没有一个单独的 float 来标明,分为 float32
和 float64
两个,他们两个之间的精确度是不一样的,前者精确到小数点后 7 位、后者精确到小数点后 15 位。
由于不精确的浮点位数,对于需要高精确的计算我们局不能简单的使用 float 来完成了。
5.3、复数类型
这个概念还是出现在课本中的,在 GO 中存在 complex64(32 位实数和虚数)、complex128(64 位实数和虚数)两个类型的复数定义。
var c1 complex64 = 5 + 10i
目前还不清楚这个类型具体的用法,后续的继续深入可能会遇见相关的场景,先做一个眼熟,避免看见了看不懂。
6、指针
GO 和 C 一样保留着指针的概念,允许我们对于内存进行直接的操作,一方面是为了通过指针的复制来降低对于一个大对象值复制造成的内存紧张,但是为了避免复杂的指针操作带来的内存安全问题,所以是不能进行指针的复杂操作的,例如 *(ptr++) 这种操作是不被允许的.
正常的操作和 C 语言中的指针是一样的,通过 &
符号可以拿到一个变量的地址从而赋值给一个指针变量,指针变量的变化直接影响当前的变量的值。
转载自:https://juejin.cn/post/7148694368604389407