Go语言基础——Go的深入学习 | 青训营笔记

126 阅读5分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 10 天

前言

本文主要内容是对Go语言的相关基础知识进行查缺补漏!!

  • Go的命名
  • Go的os包
  • Go的导包知识
  • Go的关键字type的知识

1 Go的命名

  • 尽量使用短小的名字
  • 使用 驼峰式 命名,即“当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔”
  • 不要用下面展示的关键字和预定义名进行变量或常量的命名

Go的关键字

break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var

Go的预定义名

  1. 内建常量:true false iota nil

  2. 内建类型:

    int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr float32 float64 complex128 complex64 bool byte rune string error

  3. 内建函数:

    make len cap new append

    copy close delete complex real imag panic recover

2 Go的os包

  • os包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Args变量获取,os包外部使用os.Args访问该变量

  • os.Args变量是一个字符串(string)的切片(slice),切片是Go语言的基础概念。现在先把切片s当作数组元素序列,序列的长度动态变化,用s[i]访问单个元素,用s[m:n]获取子序列。序列的元素数目为len(s)。

    • 大多数编程语言类似,区间索引时,采用左闭右开形式,即,区间包括第一个索引元素,不包括最后一个,因为这样可以简化逻辑。如s[m:n]这个切片,0 ≤ m ≤ n ≤ len(s),包含n-m个元素。
    • os.Args的第一个元素:os.Args[0],是命令本身的名字,其它的元素则是程序启动时传给它的参数。
    • 系统启动时传给它的参数的获取可以简写成os.Args[1:] ,其中对于s[m:n],会默认传入0或len(s)。

3 Go的导包

Go语言的代码通过(package)组织,包类似于其它语言里的库(libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个.go源代码文件组成,目录定义包的作用。每个源文件都以一条package声明语句开始,如package main,表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在这个文件里的程序语句。

main包

  • main包比较特殊,它定义了一个独立可执行的程序,而不是一个库。
  • main里的main 函数 也很特殊,它是整个程序执行时的入口(译注:C系语言差不多都这样)。
  • main函数所做的事情就是程序做的。main函数一般调用其它包里的函数完成很多工作(例如:fmt.Println)。

导包的一些技巧

  • 导入的包之间可以通过添加空行来分组
  • 如果某个值不被使用,可以将其分配给blank identifier(即下划线__)

包的初始化

包的初始化首先是解决包级变量的依赖顺序,然后按照包级变量声明出现的顺序依次初始化:

var a = b + c // a 第三个初始化, 为 3
var b = f()   // b 第二个初始化, 为 2, 通过调用 f (依赖c)
var c = 1     // c 第一个初始化, 为 1

func f() int { return c + 1 }
  • 如果包中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化,Go语言的构建工具首先会将.go文件根据文件名排序,然后依次调用编译器编译。

  • 对于在包级别声明的变量,如果有初始化表达式则用表达式初始化,还有一些没有初始化表达式的,例如某些表格数据初始化并不是一个简单的赋值过程。在这种情况下,我们可以用一个特殊的init初始化函数来简化初始化工作。每个文件都可以包含多个init初始化函数

func init() { /* ... */ }

这样的init初始化函数除了不能被调用或引用外,其他行为和普通函数类似。在每个文件中的init初始化函数,在程序开始执行时按照它们声明的顺序被自动调用。

4 Go的关键字type

Golang语言中存在一个关键字type

两种使用方式

  • 类型别名
  • 类型定义

是不是很像C语言中define和typedef

类型定义

类型定义是完全定义了一种新的类型

type Student struct {
  name String
  age int
  email String
}

type I int

类型别名

类型别名只是给现有的类型取了一个别名alias

type Sdt = Student
type I = int

两者区别展示说明

例子1:

type I int //类似于C语言中的typedef
type D = int //类似于C语言中的#define

例子2:

type Student struct {
  name String
  age int
  email String
}

type Teacher Student

从例子2来看,相当于定义了一个新的Teacher类型,和下面的代码是等价的。虽然两个类型内存布局完全一样,但是从概念上来说,它们是完全不同的两个类型,不能相互兼容。

type Teacher struct {
  name String
  age int
  email String
}

小技巧

类型别名这个功能非常有用,鉴于go中有些类型写起来非常繁琐,比如json相关的操作中,经常用到map[string]interface {}这种类型,要写完全部很麻烦,可以给它起个简单的别名,通过这个方式进行使用就方便多了。

type strMap2Any = map[string]interface {}

心得

今天对于Go的相关基础知识进行了复习和一些不懂的相关问题的调查,因此根据学习知识从四个方面写下了本文,分别为Go的命名,Go的os包,Go的导包知识,Go的关键字type的知识,经过今天的再次温习Go语言,我感觉到自己对go语言的学习更进一步,获益匪浅,希望之后也能加油学习!

引用

ppt:‌‌‍‌‍⁢‬‍‍​⁤⁤⁡⁤‬​‬​​⁣​⁤⁤⁢⁡⁣⁣⁢‬⁤​​⁡‌⁡‍‬⁤⁤‬⁣​‍​⁡​Go 语言上手 - 基础语法 .pptx - 飞书云文档 (feishu.cn)

学习:前言 · Go语言圣经 (studygolang.com)