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

78 阅读3分钟

go语言是一种静态类型、编译型、高并发型语言,相比c++它语法简洁,相比java它是一门高效的语言,Go语言也编译型的语言,执行效率更高。

go现在依赖管理一般使用go module,每个项目都有一个go.mod文件,定义了项目的依赖关系和版本信息。go mod命令可以自动下载、更新和管理依赖包。

常用的命令有

初始化模块:在项目根目录下运行以下命令,初始化一个新的Go模块:

go mod init <module-name>

添加依赖:在代码中导入依赖包,然后运行以下命令自动下载依赖:

go mod tidy

更新依赖: 运行以下命令更新依赖包到最新版本:

go get -u <package-name>

查看依赖: 运行以下命令查看项目的依赖关系:

go list -m all

go语言的语法和c/c++/java一个显著的不同之处是声明变量/函数的时候,类型写在后面。我读了一篇讲C语言前置声明和go语言后置声明比较的博客,它提到如果在使用多重指针,函数指针等很冗长的类型时,后置类型声明只需要从左到右直接读而不会带来阅读的困难。

Go语言在声明变量的时会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil。

每个Go程序都是由包(package)组成的。程序从main包开始运行。

package main

import "fmt"

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

Go语言使用var关键字声明变量。使用const关键字声明常量。

Go语言支持以下基本数据类型:

布尔型bool

数字类型intfloat32float64complex64complex128

字符串类型string

派生类型: 指针、数组、结构体、联合、函数、切片、接口、Map、通道

Go语言内置了强大的并发支持,使用goroutinechannel实现。

Goroutine

Goroutine是Go语言中的轻量级线程。通过在函数调用前加上go关键字,可以启动一个新的Goroutine。

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

Channel

Channel用于在Goroutine之间传递数据。Channel是类型化的,可以传递任何类型的数据。

使用make函数创建Channel:

ch := make(chan int)

使用<-操作符发送和接收数据,带缓冲的Channel可以在没有接收者的情况下存储一定数量的值,使用close函数关闭Channel

关闭Channel后,不能再向其发送数据,但仍然可以接收数据,直到Channel中的数据被全部接收。

可以使用range关键字遍历Channel中的数据

Go语言支持单向Channel,即只能发送或只能接收数据的Channel。

  • 只发送Channel: chan<- T
  • 只接收Channel: <-chan T

可以使用select处理多个Channel,select语句用于在多个Channel操作中选择一个可执行的操作。如果多个Channel都准备好,select会随机选择一个执行。