• Go开始:Go基本元素介绍


    标识符与关键字

    file


    在任何编程语言中,标识符和关键字都是核心概念,Go也不例外。标识符用于命名各种类型的代码元素,如变量、常量、函数等。关键字是预留的词汇,用于指示编程语言的特定操作。在本部分中,我们将详细介绍Go语言中的标识符和关键字。

    Go中的标识符

    标识符是用于标识各种程序实体(例如变量、函数、类型等)的名称。在Go中,标识符遵循以下规则:

    1. 必须以字母或下划线(_)开头。
    2. 可以包含字母、数字和下划线(_)。
    3. 区分大小写。

    例如,以下都是有效的Go标识符:

    1. name
    2. _x9
    3. go_variable
    4. Count123

    以下是无效的标识符:

    1. 9name // 以数字开头
    2. !var // 包含非法字符

    Go关键字

    Go语言有25个预留的关键字,不能用作标识符。以下是这些关键字的列表以及它们的简要解释:

    1. break 用于中断循环或switch语句
    2. default 用于switch语句,表示默认情况
    3. func 定义新的函数
    4. interface 定义接口
    5. select 用于处理多个通道
    6. case 用于switchselect语句中的条件分支
    7. defer 用于确保函数调用在程序执行结束后发生
    8. go 用于并发执行
    9. map 定义map类型
    10. struct 定义结构体
    11. chan 定义通道类型
    12. else 用于if-else结构
    13. goto 用于无条件跳转
    14. package 定义包
    15. switch 用于多路分支
    16. const 定义常量或常量组
    17. fallthrough 用于switch语句,使得控制流穿透到下一个case
    18. if 条件语句
    19. range 用于循环遍历数组、切片、字符串、map或通道
    20. type 定义新的数据类型或类型别名
    21. continue 跳过当前循环的剩余部分,开始下一次迭代
    22. for 循环语句
    23. import 导入包
    24. return 从函数返回
    25. var 声明变量

    关键字示例

    1. // 使用if-else关键字
    2. if x > 10 {
    3. fmt.Println("x is greater than 10")
    4. } else {
    5. fmt.Println("x is not greater than 10")
    6. }
    7. // 使用for关键字
    8. for i := 0; i < 5; i++ {
    9. fmt.Println(i)
    10. }
    11. // 使用func和return关键字
    12. func add(a int, b int) int {
    13. return a + b
    14. }

    具名的函数

    file


    在Go语言中,函数是一组执行特定任务的代码块,具名函数即是有名称的函数。本文将详细讨论Go中各类具名函数,包括常规函数、方法、高阶函数、匿名函数和闭包。

    常规函数

    这是最基础的函数类型。常规函数具有名称,可以接受参数,并且可以返回值。

    代码示例

    1. // 常规函数,接受两个int类型参数,返回int类型值
    2. func add(a int, b int) int {
    3. return a + b
    4. }

    方法

    在Go中,方法是一种特殊类型的函数,它作用于特定类型的变量,这个特定类型称为接收者。

    代码示例

    1. type Circle struct {
    2. Radius float64
    3. }
    4. // Circle类型的方法,计算圆的面积
    5. func (c Circle) Area() float64 {
    6. return 3.14159 * c.Radius * c.Radius
    7. }

    高阶函数

    高阶函数是接受函数作为参数或返回一个函数的函数。

    代码示例

    1. // 高阶函数,接受一个函数作为参数
    2. func applyFunc(f func(int) int, value int) int {
    3. return f(value)
    4. }

    匿名函数与Lambda表达式

    匿名函数是没有名字的函数,通常用于临时操作。

    代码示例

    1. // 匿名函数
    2. add := func(a, b int) int {
    3. return a + b
    4. }

    闭包

    闭包是一个函数值,它引用了其函数体之外的变量。简单来说,这个函数“记住了”这些引用的变量。

    代码示例

    1. // 闭包示例
    2. func outer() func() int {
    3. x := 0
    4. return func() int {
    5. x++
    6. return x
    7. }
    8. }

    具名的值

    file


    在Go语言中,具名的值主要包括变量和常量。这些都是用于存储数据或代表特定值的标识符。接下来,我们会分别探讨变量和常量的各种类型和用法。

    变量

    变量是用于存储数据的容器。在Go中,变量的声明有多种方式,并且支持多种数据类型。

    基本数据类型

    Go支持一系列基本的数据类型,包括整数、浮点数、布尔值、字符串等。

    1. var i int = 10 // 整数
    2. var f float64 = 10.5 // 浮点数
    3. var b bool = true // 布尔值
    4. var s string = "hello" // 字符串

    复合数据类型

    Go还提供了数组、切片、映射(Map)、结构体(Struct)等复合数据类型。

    1. var arr [3]int = [3]int{1, 2, 3} // 数组
    2. var slice []int = []int{1, 2, 3} // 切片
    3. var m map[string]int = map[string]int{"a": 1, "b": 2} // 映射
    4. type Person struct {Name string; Age int} // 结构体

    指针类型

    Go语言也支持指针,但不支持指针运算。

    1. var p *int
    2. i := 42
    3. p = &i

    常量

    与变量不同,常量是不可变的值,一旦声明,就不能更改。

    基本常量类型

    1. const pi float64 = 3.14159 // 浮点数常量
    2. const str string = "Hello" // 字符串常量
    3. const b bool = true // 布尔常量

    枚举常量

    在Go中,可以使用iota关键字生成一组增量的整数常量,通常用于枚举。

    1. type Weekday int
    2. const (
    3. Sunday Weekday = iota
    4. Monday
    5. Tuesday
    6. )

    常量表达式

    Go支持常量表达式,允许用于计算的常量值在编译期间进行运算。

    const x = 2 + 3
    

    定义类型和类型别名

    Go语言不仅提供了一系列内建类型,还允许通过type关键字定义新的类型或为现有的类型创建别名。这两者在语法上可能相似,但在类型系统中有不同的意义和用途。本篇文章旨在详细介绍定义类型和类型别名的各种情况。

    类型定义(Type Definition)

    通过类型定义,你可以创建一个全新的类型,尽管它可能与某个现有类型在结构上完全相同。

    基础类型

    下面是如何定义一个基于int的新类型MyInt

    type MyInt int
    

    复合类型

    也可以基于复合类型来定义新类型:

    1. type MyMap map[string]int
    2. type Person struct {
    3. Name string
    4. Age int
    5. }

    接口类型

    你还可以定义接口类型,它包含了一组方法签名:

    1. type Writer interface {
    2. Write([]byte) (int, error)
    3. }

    类型别名(Type Alias)

    类型别名并不创建新类型,只是为现有类型创建一个新名字。

    type Integer = int
    

    类型定义与类型别名的区别

    类型定义和类型别名在Go中有着本质的区别。

    • 类型定义会创建一个全新的类型,它与其基础类型在类型系统中是完全不同的。
    • 类型别名只是创建了一个新名称,但并没有创建新类型。

    代码示例

    1. type MyInt int
    2. type YourInt = int
    3. var a int
    4. var b MyInt
    5. var c YourInt
    6. a = 1
    7. b = MyInt(a) // 需要显式转换
    8. c = a // 不需要转换,因为YourInt只是int的别名

    包和模块管理

    file


    Go语言通过包(Packages)和模块(Modules)来组织和管理代码。这两者虽然在目的上有些许相似,但在用法和规模上各有特点。在本篇文章中,我们将深入探讨Go中的包和模块管理,以及如何高效地使用它们。

    包(Packages)

    包是Go语言代码组织的基本单位。每个Go程序都是由包组成的,包用于封装代码以实现可重用和可维护。

    标准库包

    Go语言提供了丰富的标准库,例如 fmtnet/httpio 等。

    1. import "fmt"
    2. func main() {
    3. fmt.Println("Hello, world!")
    4. }

    自定义包

    你也可以创建自定义的包。通常情况下,每个文件夹就是一个单独的包。

    例如,创建一个名为 mathutils 的包:

    1. // mathutils/add.go
    2. package mathutils
    3. func Add(a, b int) int {
    4. return a + b
    5. }

    使用自定义包:

    1. import "mathutils"
    2. func main() {
    3. sum := mathutils.Add(1, 2)
    4. }

    包的可见性

    在Go中,以大写字母开头的函数或变量在包外是可见的(Public),以小写字母开头的则不是(Private)。

    模块(Modules)

    模块是包的集合。Go 1.11版本引入了模块的概念,旨在解决依赖管理问题。

    初始化模块

    使用 go mod init 初始化一个新模块。

    go mod init mymodule
    

    这将生成一个 go.mod 文件,其中列出了模块名和依赖。

    添加依赖

    当你导入一个新的包并运行 go build 或 go get,依赖将自动添加到 go.mod 文件。

    升级和降级依赖

    你可以使用 go get 命令升级或降级模块依赖。

    go get -u example.com/some/module@v1.2.3
    

    代码块与断行

    在Go编程中,理解如何有效地使用代码块和断行是编写可读、可维护代码的基础。在本篇文章中,我们将深入了解Go语言中各种类型的代码块和断行规则。

    代码块(Code Blocks)

    代码块是由一对大括号{}包围的代码序列。这些代码块在不同的语境中有不同的作用。

    函数体

    最常见的代码块是函数体,它包含函数的实现。

    1. func sayHello() {
    2. fmt.Println("Hello!")
    3. }

    控制结构

    ifforswitch 等控制结构也使用代码块。

    1. if true {
    2. fmt.Println("This is true.")
    3. }
    4. for i := 0; i < 3; i++ {
    5. fmt.Println(i)
    6. }

    声明块

    常量和变量也可以在块内声明。

    1. const (
    2. Pi = 3.14
    3. E = 2.71
    4. )

    断行(Line Breaks)

    Go语言相对宽松的断行规则让你可以在多数表达式和声明中自由地添加空白和换行。

    语句结束

    在Go中,大多数语句通过换行符或者分号来结束。

    fmt.Println("This is the end of the statement")
    

    长语句的断行

    对于较长的语句,Go允许在操作符附近断行。

    1. result := someVeryLongVariable +
    2. anotherVeryLongVariable -
    3. yetAnotherVeryLongVariable

    函数调用和定义

    在函数调用或定义时,参数也可以进行断行。

    1. func longFunction(
    2. param1 int,
    3. param2 string,
    4. param3 float64,
    5. ) {
    6. // 函数体
    7. }
  • 相关阅读:
    《battles and wastelands》
    OceanBase开源获信通院认可:开源300万行核心代码、社区答疑超3万次
    力扣32. 最长有效括号
    制造型企业的数字化转型离不开 MES 系统
    【报错】springboot3启动报错
    JS判断一个字符串中出现次数最多的字符 统计这个次数
    Python全栈开发【基础-05】基本数据类型
    Scrapy-reids-概念
    洛谷P1223 排队接水
    java类加载器总结
  • 原文地址:https://blog.csdn.net/weixin_45925028/article/details/133951547