Go语言基础语法入门 |豆包MarsCode AI刷题

52 阅读12分钟

1.Go的起源

Go语言的设计始于2007年底,当时Google的三位工程师Robert Griesemer、Rob Pike和Ken Thompson开始讨论并设计一种新的编程语言,旨在解决Google内部遇到的一些编程问题,尤其是多核处理器、网络系统和大型代码库的管理问题。Go语言因其简洁、高效和强大的并发支持,在云计算、微服务、网络编程等领域得到了广泛应用,未来发展前景广阔。

2.Go语言的优点

1. 简洁性和易学性

  • 语法简洁:Go语言的语法非常简洁,类似于C语言,但更加简化。它去掉了很多不必要的符号和特性,使得代码更加清晰易读。
  • 易于学习:Go语言只有25个关键字,且语言特性相对较少,开发者可以快速上手。对于有其他编程语言经验的开发者来说,学习曲线较为平缓。

2. 高效的编译和执行

  • 快速编译:Go语言的编译速度非常快,这得益于其设计上的简洁和自举编译器的优化。开发者可以快速编译和运行程序,提高开发效率。
  • 高性能:Go语言的运行时性能非常接近C/C++,特别是在网络服务和高并发场景下,Go的表现尤为出色。

3. 强大的并发支持

  • Goroutines:Go语言原生支持并发编程,通过Goroutines可以非常轻松地创建轻量级线程。Goroutines的创建和销毁成本非常低,可以轻松启动成千上万个Goroutines。
  • Channel:Go语言通过Channel实现了Goroutines之间的通信,使得并发编程更加安全和简单。Channel是一种线程安全的通信机制,可以避免传统多线程编程中的锁和条件变量等问题。

4. 内存管理

  • 垃圾回收:Go语言自带垃圾回收机制,开发者无需手动管理内存,减少了内存泄漏的风险。Go的垃圾回收器经过多个版本的优化,性能和延迟已经非常优秀。
  • 内存分配:Go语言的内存分配机制非常高效,特别是在高并发场景下,内存分配和回收的性能表现尤为出色。

5. 跨平台支持

  • 编译型语言:Go语言是编译型语言,可以直接编译成机器码,生成独立的可执行文件。这使得Go语言可以轻松跨平台部署,无需依赖额外的运行时环境。
  • 多平台支持:Go语言支持多种操作系统和硬件平台,包括Linux、macOS、Windows、ARM等。

6. 强大的标准库

  • 丰富的标准库:Go语言的标准库非常丰富,涵盖了网络、文件I/O、文本处理、图像处理等多个领域。标准库的质量和稳定性都非常高,可以大大简化开发者的工作。
  • 易于扩展:Go语言的标准库和第三方库都非常容易使用和扩展,开发者可以快速构建自己的工具和应用。

7. 静态类型系统

  • 类型安全:Go语言是静态类型语言,编译时进行类型检查,可以有效避免类型错误。
  • 类型推导:Go语言支持类型推导,开发者可以在声明变量时省略类型,编译器会根据上下文自动推导出类型。

8. 开源和社区支持

  • 开源项目:Go语言是开源项目,由Google发起并维护,社区贡献者众多。开源社区非常活跃,不断推动Go语言的发展和改进。
  • 丰富的第三方库:Go语言的生态系统非常丰富,有大量的第三方库和工具可供使用,涵盖了Web开发、数据库操作、分布式系统等多个领域。

9. 部署简单

  • 单一可执行文件:Go语言编译后的程序是一个单一的可执行文件,无需依赖其他库和环境,部署非常简单。
  • 容器化支持:Go语言的单一可执行文件特性非常适合容器化部署,可以轻松构建Docker镜像,实现微服务架构下的快速部署和扩展。

10. 广泛的应用场景

  • 云计算和微服务:Go语言在云计算和微服务领域得到了广泛应用,如Kubernetes、Docker等项目都是使用Go语言开发的。
  • 网络编程:Go语言在网络编程和高并发场景下表现尤为出色,如Web服务器、分布式系统、实时通信等。

3.Go的学习方向

  • 区块链研发工程师
  • GO服务器端/游戏软件工程师
  • 分布式/云计算/软件工程师

应用领域

  • 区块链应用
  • 后端服务器的应用(计算能力强,高并发)
  • 云计算/云服务后台应用

4.学习方法

  1. 高效而愉快的学习
  2. 先建立一个整体框架,然后细节
  3. 需要使用什么,现学
  4. 先how ,后 why
  5. 编程时一门 ”做中学“ 的学科,不是回了在做,而是做了才会
  6. 适当的囫囵吞枣,不会的先跳过。
  7. 学习软件编程是在琢磨别人怎么做,而不是我认为应该怎么做的过程
  8. 完成大于完美

如何快速深入学习一个新的技术或者一个知识点

  1. 我们有一个需求(页面局部刷新问题)
  2. 先看看使用现有的技术能否解决这个问题
  3. 学习一下新技术或者知识点的基本语法
  4. 快速入门,简单,了解,基本使用,不需要设计技术细节
  5. 讨论你这个新技术知识点的细节怎么使用更规范,使用的细节,使用时需要注意什么...体现一个程序员水平

5.go的注意事项

  • 严格区分大小写
  • 语句结束不需要加;
  • 一行一行写
  • go语言定义的变量或者import的包如果没有使用到,代码编译不能通过
  • 大括号成对出现,缺一不可
  • 包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main
  • 引入包,其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。

6.数组

Go语言中数组的语法相对简单和直接。以下是关于Go语言数组的主要语法要点:

1. 数组声明

你可以使用以下语法来声明一个数组:

var 数组名 [长度]类型

例如:

var numbers [5]int

这声明了一个名为 numbers 的数组,包含5个 int 类型的元素。

2. 数组初始化

你可以在声明数组时对其进行初始化:

var 数组名 [长度]类型 = [长度]类型{值1, 值2, ..., 值N}

例如:

var numbers [5]int = [5]int{1, 2, 3, 4, 5}

你也可以省略长度,用 ... 来自动推断长度:

var numbers = [...]int{1, 2, 3, 4, 5}

3. 访问和修改数组元素

你可以使用索引来访问和修改数组中的元素:

数组名[索引]

例如:

numbers[0] = 10  // 修改第一个元素
fmt.Println(numbers[2])  // 访问第三个元素

4. 数组长度

你可以使用 len 函数来获取数组的长度:

len(数组名)

例如:

fmt.Println(len(numbers))  // 输出数组的长度

5. 遍历数组

你可以使用 for 循环遍历数组:

for i := 0; i < len(数组名); i++ {
    fmt.Println(数组名[i])
}

或者使用 range 关键字:

for index, value := range 数组名 {
    fmt.Printf("索引: %d, 值: %d\n", index, value)
}

示例代码

以下是一个完整的示例代码,展示了数组的声明、初始化、访问、修改和遍历:

package main
​
import "fmt"func main() {
    // 声明并初始化一个数组
    var numbers [5]int = [5]int{1, 2, 3, 4, 5}
​
    // 打印数组
    fmt.Println("数组内容:", numbers)
​
    // 访问数组中的元素
    fmt.Println("第一个元素:", numbers[0])
    fmt.Println("第三个元素:", numbers[2])
​
    // 修改数组中的元素
    numbers[1] = 10
    fmt.Println("修改后的数组:", numbers)
​
    // 获取数组的长度
    fmt.Println("数组长度:", len(numbers))
​
    // 遍历数组
    for i := 0; i < len(numbers); i++ {
        fmt.Printf("索引: %d, 值: %d\n", i, numbers[i])
    }
​
    // 使用 range 遍历数组
    for index, value := range numbers {
        fmt.Printf("索引: %d, 值: %d\n", index, value)
    }
}

7.go循环

在Go语言中,for 循环是主要的循环结构,用于重复执行一段代码。Go只有一种循环语法,即 for 循环,但它可以实现多种不同的循环形式。以下是Go语言中 for 循环的主要语法和用法:

1. 基本的 for 循环

最常见的 for 循环形式如下:

for 初始化; 条件; 后操作 {
    // 循环体
}
  • 初始化:在循环开始前执行一次,通常用于初始化计数器。
  • 条件:在每次循环迭代前进行判断,如果为 true,则继续执行循环体;如果为 false,则退出循环。
  • 后操作:在每次循环迭代后执行,通常用于更新计数器。

示例:

package main
​
import "fmt"
​
func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}

输出:

0
1
2
3
4

2. 无限循环

你可以省略所有条件,使循环无限执行:

for {
    // 无限循环
}

可以使用 break 语句来退出循环:

package main
​
import "fmt"
​
func main() {
    i := 0
    for {
        fmt.Println(i)
        i++
        if i >= 5 {
            break
        }
    }
}

输出:

0
1
2
3
4

3. 条件循环

你可以在 for 循环中只使用条件部分:

for 条件 {
    // 循环体
}

这类似于其他语言中的 while 循环:

package main
​
import "fmt"
​
func main() {
    i := 0
    for i < 5 {
        fmt.Println(i)
        i++
    }
}

输出:

0
1
2
3
4

4. for 循环与 range

你可以使用 range 关键字来遍历数组、切片、字符串、映射(map)和通道(channel):

for 索引, 值 := range 集合 {
    // 循环体
}

示例:

package main
​
import "fmt"func main() {
    numbers := []int{1, 2, 3, 4, 5}
    for index, value := range numbers {
        fmt.Printf("索引: %d, 值: %d\n", index, value)
    }
}

输出:

索引: 0, 值: 1
索引: 1, 值: 2
索引: 2, 值: 3
索引: 3, 值: 4
索引: 4, 值: 5

5. 跳过循环

你可以使用 continue 语句来跳过当前迭代并开始下一次迭代:

package main
​
import "fmt"
​
func main() {
    for i := 0; i < 5; i++ {
        if i == 2 {
            continue
        }
        fmt.Println(i)
    }
}

7.go的条件语句

Go 语言中的条件语句主要使用 ifswitch 语句来实现。下面详细介绍这两种条件语句的语法和使用示例。

1. if 语句

Go 语言中的 if 语句用于根据条件执行不同的代码块。其基本语法如下:

if 条件 {
    // 条件为 true 时执行的代码
}
示例:
package main
​
import "fmt"func main() {
    a := 10
    if a > 5 {
        fmt.Println("a 大于 5")
    }
}

输出:

a 大于 5
if-else 语句

你可以使用 else 来处理条件为 false 的情况:

if 条件 {
    // 条件为 true 时执行的代码
} else {
    // 条件为 false 时执行的代码
}
示例:
package main
​
import "fmt"func main() {
    a := 3
    if a > 5 {
        fmt.Println("a 大于 5")
    } else {
        fmt.Println("a 小于或等于 5")
    }
}

输出:

a 小于或等于 5
if-else if-else 语句

你可以使用多个条件来处理多种情况:

if 条件1 {
    // 条件1true 时执行的代码
} else if 条件2 {
    // 条件2true 时执行的代码
} else {
    // 所有条件都为 false 时执行的代码
}
示例:
package main
​
import "fmt"func main() {
    a := 10
    if a > 100 {
        fmt.Println("a 大于 100")
    } else if a > 10 {
        fmt.Println("a 大于 10 但小于或等于 100")
    } else {
        fmt.Println("a 小于或等于 10")
    }
}

输出:

a 小于或等于 10
if 语句中的变量作用域

在 Go 语言中,你可以在 if 语句前添加一个短变量声明,该变量的作用域仅限于 if 及其附属的 else 块。

if 短变量声明; 条件 {
    // 使用短变量声明中的变量
}
示例:
package main
​
import "fmt"func main() {
    if a := 10; a > 5 {
        fmt.Println("a 大于 5")
    } else {
        fmt.Println("a 小于或等于 5")
    }
}

输出:

a 大于 5

2. switch 语句

Go 语言中的 switch 语句用于根据多个条件执行不同的代码块。其基本语法如下:

switch 表达式 {
    case1:
        // 表达式等于值1时执行的代码
    case2:
        // 表达式等于值2时执行的代码
    default:
        // 表达式不等于任何值时执行的代码
}
示例:
package main
​
import "fmt"func main() {
    a := 2
    switch a {
    case 1:
        fmt.Println("a 等于 1")
    case 2:
        fmt.Println("a 等于 2")
    default:
        fmt.Println("a 不等于 1 或 2")
    }
}

输出:

a 等于 2
switch 语句中的多个条件(续)

你可以在 case 中使用多个值,以处理多种情况:

switch 表达式 {
    case1, 值2:
        // 表达式等于值1或值2时执行的代码
    default:
        // 表达式不等于任何值时执行的代码
}
示例:
package main
​
import "fmt"func main() {
    a := 2
    switch a {
    case 1, 3, 5:
        fmt.Println("a 是奇数")
    case 2, 4, 6:
        fmt.Println("a 是偶数")
    default:
        fmt.Println("a 不是1到6之间的数字")
    }
}

输出:

a 是偶数
switch 语句中的 fallthrough

在 Go 语言中,switch 语句默认情况下在匹配到一个 case 后不会继续执行下一个 case,但如果需要继续执行下一个 case,可以使用 fallthrough 关键字:

switch 表达式 {
    case1:
        // 表达式等于值1时执行的代码
        fallthrough
    case2:
        // 无论值2是否匹配,都会执行这段代码
}
示例:
package main
​
import "fmt"func main() {
    a := 2
    switch a {
    case 1:
        fmt.Println("a 等于 1")
    case 2:
        fmt.Println("a 等于 2")
        fallthrough
    case 3:
        fmt.Println("a 等于 3(通过 fallthrough)")
    default:
        fmt.Println("a 不是1到3之间的数字")
    }
}

输出:

a 等于 2
a 等于 3(通过 fallthrough)
switch 语句中没有表达式

你还可以在 switch 语句中不使用任何表达式,这时它类似于一个 if-else 链:

switch {
    case 条件1:
        // 条件1为 true 时执行的代码
    case 条件2:
        // 条件2为 true 时执行的代码
    default:
        // 所有条件都为 false 时执行的代码
}
示例:
package main

import "fmt"

func main() {
    a := 10
    switch {
    case a > 100:
        fmt.Println("a 大于 100")
    case a > 10:
        fmt.Println("a 大于 10 但小于或等于 100")
    default:
        fmt.Println("a 小于或等于 10")
    }
}