Go 语言上手-基础知识 | 青训营笔记

80 阅读5分钟

前言

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

今天主要学习 Go 语言的相关背景知识,包含:

  • 开发环境配置
  • 基础语法
  • 标准库

正文

以下部分为个人觉得初学者需要注意的一些点

Go 语言结构

Go 语言的基础组成有以下几个部分:

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释

  • 必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package mainpackage main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  • main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)
  • 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
  • 需要注意的是 { 不能单独放在一行,所以以下代码在运行时会产生错误:
package main  
  
import "fmt"  
  
func main()    
{  // 错误,{ 不能在单独的行上  
    fmt.Println("Hello, World!")  
}

Go 语言基础语法

  • 在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分
  • Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串:
    • Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。
    • Printf 根据格式化参数生成格式化的字符串并写入标准输出。
package main  
  
import (  
    "fmt"  
)  
  
func main() {  
   // %d 表示整型数字,%s 表示字符串  
    var stockcode=123  
    var enddate="2023-01-15"  
    var url="Code=%d&endDate=%s"  
    fmt.Printf(url,stockcode,enddate)// Code=123&endDate=2023-01-15
    var target_url=fmt.Sprintf(url,stockcode,enddate)  
    fmt.Println(target_url)  // Code=123&endDate=2023-01-15
}

Go 语言数据类型

  • 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。
  • Go 语言按类别有以下几种数据类型: |序号 | 类型和描述 | | -- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | 1 | 布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。 | | 2 | 数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。 | | 3 | 字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。 | | 4 | 派生类型: 包括: (a) 指针类型(Pointer) (b) 数组类型 (c) 结构化类型(struct) (d) Channel 类型 (e) 函数类型 (f) 切片类型 (g) 接口类型(interface) (h) Map 类型 |

Go 语言变量

  • 声明变量的一般形式是使用 var 关键字

  • 变量声明

    • 第一种,指定变量类型,如果没有初始化,则变量默认为零值
    • 第二种,根据值自行判定变量类型。
    • 第三种,如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误。
  • 值类型和引用类型

    • 所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值。当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝。你可以通过 &i 来获取变量 i 的内存地址,例如:0xf840000040(每次的地址都可能不一样)。值类型变量的值存储在堆中。
    • 更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。这个内存地址称之为指针,这个指针实际上也被存在另外的某一个值中。当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。
  • 使用 := 赋值操作符

    • a := 50 或 b := false。a 和 b 的类型(int 和 bool)将由编译器自动推断。这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。
    • 如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误。但是全局变量是允许声明但不使用的。
  • 如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同。

  • 空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)