likes
comments
collection
share

GO---基本结构和数据类型

作者站长头像
站长
· 阅读数 59

kubernetes 的开发语言就是 GO ,也就是说要想深入的去理解他的工作流程我们就需要去学习这个编程语言,包括其一些编码的骚操作这些。

1、文件名、关键字及标识符

1.1、标识符

我们在编码时需要操作的标识符也就是以下的几类:关键字、标识符、文件名。

  • 关键字

    关键字作用关键字作用
    break跳出当前循环case匹配 case,自动跳出
    chan管道(先进先出的消息队列)const声明一个常量
    continue跳出此次循环default默认 case
    defer函数返回之前调用else条件表达式
    fallthrough强制执行 case 后面的for唯一循环结构
    func定义函数gogo funcName() 开启并发
    goto标记跳转if条件表达式
    import引入一个包interface方法的集合
    map哈希表package定义一个包
    range遍历可拆分元素(下标、对应元素)return函数返回
    select同时等待多个通道操作struct结构体
    switch选择 casetype定义类型
    var定义变量
  • 标识符

    由 UTF-8、_ 开头后跟 ***** 多个字符或者 Unicode 数字

  • 文件名

    小写字母组成,多个单词则用下划线进行划分(不包含空格或其他的特殊字符)。

2、基本结构和要素

  • 类似于命名空间的这样用法,一个 GO 文件标识一个包,有且也仅属于一个包,一个包内可以有多个程序文件(包名使用小写字母作为标识)。

  • 入口类

    标识了 package main 的作为一个可独立执行的程序文件,其他的包即使能够编译也不是一个可执行的文件。

  • 导包

    通过 import package 的形式可以导入一个包,可在当前目录或者绝对目录下进行寻找、也可以在全局文件中进行寻找。

  • 可见性

    标识符首字母大写则表示全局可见,可以随着包一起导出使用;标识符首字母小写则表示只在当前的包中可见,不可对外进行引用。

2.1、函数定义

GO 的函数定义方式很简单,用关键字跟上函数名、参数、返回值就可以了(参数和返回值通常由名称和类型组成),具体的形式如下所示:

func functionName(parameter_list) (return_value_list) {
	…
}

2.2、程序执行流程

  1. 按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程:
  2. 如果该包又导入了其它的包,则从第一步开始 递归执行,但是每个包只会被导入一次。
  3. 然后以相反的顺序在每个包中 初始化常量和变量,如果该包含有 init() 函数的话,则调用该函数。
  4. 在完成这一切之后,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 来标明,分为 float32float64 两个,他们两个之间的精确度是不一样的,前者精确到小数点后 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
评论
请登录