Go 语言入门指南:基础语法和常用特性解析| 豆包MarsCode AI刷题

32 阅读5分钟

简单记录一下参加青训营学习Go语言的一个过程,本篇仅介绍一些基础语法和一些常用特性

Go语言的优点

Go是一个特别适合构建高效、简单且具有并发能力的语言,特别是在计算和服务端开发具有非常好的性能,而且相对于java和c++来说,go语言语法较为简洁,还通过静态类型检测避免了很多潜在的错误,此外Go原生支持并发,适合现代的多核处理器

Go语言基础语法

  1. 输出Hello World

我们在学习每一个编程语言的时候,第一步肯定是学会怎么使用这个语言输出“Hello World!”,以下是Go语言的输出“Hello World!”的代码:

package main
import "fmt" 
func main() { 
fmt.Println("Hello, World!") 
}

在Go语言中,每一个程序都需要一个main包,并且main函数是程序的入口点,这点与c++类似,Go没有明显的构造函数,Go的函数设计简洁。

  1. 变量与常量

Go语言有明确的静态类型系统,变量定义可以使用var关键字,也可以通过 :=符号直接赋值

var a int = 10
b := "hello"
const PI = 3.14159

:=是Go语言短声明方式,适用于局部变量的定义。Go语言是一种静态语言,因此在定义变量的时候就需要声明类型。Go的变量定义虽然简单,但是对变量的命名、类型等有严格要求。在学习GO语言的过程中,我们要逐步适应这种约束,这也是Go语言的优势之一。

  1. 函数

函数是编程的核心,在Go语言中,函数的定义和调用也非常简介,并且支持多返回值:

func add(a int, b int) (int, int) {
    sum := a + b
    diff := a - b
    return sum, diff
}

func main() {
    result, difference := add(3, 2)
    fmt.Println("Sum:", result, "Difference:", difference)
}

以上就定义了一个可以返回两数相加和两数相减的结果的函数。多返回值是Go语言的一大特点,简化了错误处理和多项数据返回的场景。设计多返回值的初衷之一就是减少异常处理的繁琐代码。

4.控制结构

Go语言中if、for、switch是最常用的控制语句,但是Go语言中没有while,因为所有需要while实现的功能,for都可以实现:

package main
import "fmt"
func main() {
    for i := 1; i <= 5; i++ {
        if i%2 == 0 {
            fmt.Println(i, "是偶数")
        } else {
            fmt.Println(i, "是奇数")
        }
    }

以上就是一个for循环的基本语法,在Go语言中,for的使用非常灵活,不仅可以用于传统的循环控制,还可以直接遍历数组、切片、映射等,Go语言的switch语句比其他语言的更加强大,它支持任何类型的表达式,并且可以自动进行断行而不需要break:

grade := "B" 
switch grade { 
case "A": 
    fmt.Println("优秀") 
case "B": 
    fmt.Println("良好") 
case "C": 
    fmt.Println("合格") 
case "D": 
    fmt.Println("不及格") 
default: 
    fmt.Println("未知等级") 
    }

在Go语言中,鼓励使用for作为唯一的循环结构,这种设计让代码风格更加统一,减少了“使用何种循环结构”的选择成本。

5.数据结构:数组、切片和映射

在Go语言中,数组、切片和映射是非常重要的数据结构,特别是切片(slice),是Go语言的核心结构之一。

func main() { 
    nums := []int{1, 2, 3, 4} 
    fmt.Println("Slice:", nums) 
}

切片是基于数组的动态结构,长度可以变化,且内存分配上更加灵活。而映射(map)是一种键值对数据结构,用于快速查找和检索:

func main() { 
    ages := map[string]int{"Alice": 25, "Bob": 30} 
    fmt.Println("Alice's age:", ages["Alice"]) 
}

切片和映射的设计让Go语言更加适应数据变化的应用场景。在学习过程中我们要注意切片的底层实现方法,这样可以避免不必要的内存消耗,提高程序性能。

6.并发处理 Goroutine和Channel

Go语言的并发能力是其亮点之一。Goroutine是Go中的轻量级线程,由Go的运行时管理,配合Channel,可以实现高效的并发处理:

func sayHello() {
    fmt.Println("Hello, Go!")
}

func main() {
    go sayHello() // 启动一个新的 goroutine
    fmt.Println("Hello, Main!")
}

在以上代码中,go sayHello()启动了一个新的Goroutine,Goroutine的设计理念是以最小代价实现并发,因此我们可以启动成千上万的Goroutine,而且不必担心过多的系统开销。

Channel是Go语言用来在Goroutine之间传递数据的通信机制,它使并发编程更加简单且安全:

func main() {
    messages := make(chan string)
    
    go func() { messages <- "ping" }()
    
    msg := <-messages
    fmt.Println(msg)
}

Channel提供了一种队列式的通信方式 ,避免了传统并发编程中的共享内存问题,通过Channel,可以轻松实现Goroutine之间的数据同步。Goroutine 和 Channel 让 Go 的并发编程更加易学易用,避免了繁琐的锁和信号量问题。通过这种结构化的并发模型,使得多线程编程变得更清晰,代码更具可读性。

总结

在学习了Go语言的基础语法之后,最大的感受就是Go语言的简洁与高效,Go通过精简的语法和清晰的设计降低了编程的复杂度,在学习Go语言的过程中要坚持写简洁代码以及时刻保持并发思维,这是提高编程水平的重要方法。