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

Go 语言入门指南:基础语法和常用特性解析

一.什么是Go语言

Go语言(也称为Golang)是由Google开发的一种开源编程语言。它于2009年首次发布,旨在提高编程效率,特别是在处理高并发和大规模系统时,能有效提升系统处理响应请求的效率。

Go语言主要具有如下特点: 其中最出名的正是其并发的特性,在Go语言中我们开启并发有多容易呢?

js 复制代码
package main
import (
    "fmt"
    "time"
)
func main() {
    fmt.Println("主goroutine启动")
    go subRoutine() // 启动一个新的goroutine
    time.Sleep(time.Second) // 主goroutine等待一秒
    fmt.Println("主goroutine结束")
}
func subRoutine() {
    fmt.Println("子goroutine启动")
    time.Sleep(2 * time.Second)
    fmt.Println("子goroutine结束")
}

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

二.Go语言环境配置

既然Go有这样的特点,那么我们该如何使用Go语言呢?首先我们得进入到官方网站(The Go Programming Language),官方网站如下图所示,我们点击Download按钮。 之后可以跳转到如下图所示的资源下载页面,此处有两种下载方式(installer和archive),使用installer方式安装和你平时使用软件安装包一样,只需点击选项即可;而采用archive方式,我们需要下载并解压压缩包,并为其配置环境变量,推荐尝试archive安装方式。此外下载的版本一定要和自己使用的系统相匹配 ,不然会发生错误。 我们选择下载zip文件(Linux则是tar.gz,一定要和自己使用的系统相匹配 ),之后我们还需要为其配置环境变量。

一个是 GOROOT ,这个就是 Go 环境所在目录的配置。

另一个是 GOPATH ,这个是 Go 项目的工作目录,你以后开发的代码就写在这个文件夹中。

  • GOROOT - go语言的安装路径
  • GOPATH - go语言依赖存放路径

GOPATH和GOROOT的配置略有不同,可以配置两个GOPATH目录,第一个用于放 Go 语言的第三方包,第二个用于放自己的开发代码。 之后我们需要将新建的GOROOT添加到 Path 这个环境变量中(%GOROOT%\bin)。 最后在cmd命令行或powershell中执行go version命令,最后能正常显示版本就说明安装正确。

js 复制代码
#查看Go版本
go version

#查看Go环境变量
go env

此外我们还需要配置GOPROXY,Go默认的GOPROXY的值是:GOPROXY=proxy.golang.org,direct 而我们打开这个网站就会发现 因此,我们需要将其替换为国内镜像网站,比如改为:goproxy.io,direct (七牛镜像)或 mirrors.aliyun.com/goproxy (阿里云镜像)

我们需要在cmd命令行或powershell中执行如下指令

js 复制代码
#开启mod模式(项目管理需要用到)
go env -w GO111MODULE=on
#重新设置成七牛镜像源或阿里镜像源(用原有的会比较慢)
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy

#关闭包的MD5校验
go env -w GOSUMDB=off

#查看环境变量
go env

三.Go语言基础语法

1.Hello World!

js 复制代码
package main  
  
import "fmt"  
  
func main() {  
    fmt.Println("Hello, World!")  
}

package main表示当前是main包下,import表示引入了fmt库,func为函数关键词,而func main()即当前代码下的主函数。

2.变量与常量

  • 变量声明使用 var 关键字
  • 常量声明使用 const 关键字
  • 变量的定义形式: var name 【类型】 = 【表达式】
  • 变量的简化形式: name := 【表达式】

Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。
大写字母和小写字母是不同的 :heapSort和Heapsort是两个不同的名字。

Go语言中类似if和switch的关键字有25个;关键字不能用于自定义名字,只能在特定语法结构中使用。

常见的关键词
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

3.条件语句与循环语句

Go语言中条件语句有如下使用的形式(单if,if-else,if-else嵌套,switch等):

js 复制代码
package main
import "fmt"
func main() {
	if true {
		fmt.Println(true)
	}

	if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

	if 8%4 == 0 {
		fmt.Println("8 is divisible by 4")
	}

	if num := 9; num < 0 {
		fmt.Println(num, "is negative")
	} else if num < 10 {
		fmt.Println(num, "has 1 digit")
	} else {
		fmt.Println(num, "has multiple digits")
	}

	a := 2
	switch a { //优化版的switch自带break
	case 1:
		fmt.Println("one") // break;
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	case 4, 5:
		fmt.Println("four or five")
	default:
		fmt.Println("other")
	}
}

值得注意的是Go语言中的switch使用时,我们不需要在case中加入break,这点和Java中的switch不大一样。

循环语句则通过for的关键词来实现(没有while)

js 复制代码
package main

import "fmt"

func main() {

    i := 1
    //死循环
    for {
       fmt.Println("loop")
       break    //使用break跳出循环
    }
    
    for j := 7; j < 9; j++ {
       fmt.Println(j)
    }

    for n := 0; n < 5; n++ {
       if n%2 == 0 {
          continue    //使用continue跳过当前循环
       }
       fmt.Println(n)
    }
    
    for i <= 3 {
       fmt.Println(i)
       i = i + 1
    }
}

4.函数

函数是基本的代码块,用于执行一个任务。Go 语言最少有个main函数。函数声明需要告诉编译器函数的名称,返回类型和参数。我们甚至可以将一个函数作为参数传入另一个函数中调用执行,该过程也被称为回调。

js 复制代码
package main

import "fmt"

func add(a int, b int) int {
	return a + b
}

func add2(a, b int) int {
	return a + b
}

func add3(a,b int,add_func func(int,int) int) int {
	return add_func(a,b)
}

func exists(m map[string]string, k string) (v string, ok bool) {
	v, ok = m[k]
	return v, ok
}

func main() {
	a := add3(3,4,add)
	fmt.Println(a)
	
	res := add(1, 2)
	fmt.Println(res) // 3
	v, ok := exists(map[string]string{"a": "A"}, "a")
	fmt.Println(v, ok) // A True
}

四.Go语言常用库包

下面是Go语言常用的一些库包,有使用需求时现查即可。

  • fmt,用于处理格式化输入输出的包
  • html,html模板操作包
  • net,提供一系列网络操作的包,相当的强大
  • flag,命令行参数解析包
  • reflect,反射操作包
  • log,自带的日志包
  • sort,排序操作包
  • regex,正则表达式包
  • image,图像操作的包
  • time,时间操作的包
  • unicode,unicode字符集操作包
  • unsafe,提供没有类型限制的指针操作
  • syscall,操作系统提供的系统调用包
  • testing,测试包,主要是写测试的时候用。
  • sync ,并发操作包
  • context,上下文包
  • strconv,字符串转换包
  • strings,字符串操作包
  • bytes,字节切片操作包
  • maps,map操作包
  • slices,切片操作包
  • io,定义了一系列基础的IO接口,例如常用的CloserWriter等,还有一些基础的IO操作函数。
  • io/fs,定义了一系列文件系统的接口,算是对文件系统的抽象。
  • os,操作系统进行交互的包,提供的是一系列具体的函数,可以简单理解为是上面两个的具体实现。
  • os/signal,操作系统信号包,用于监听操作系统的信号,主要用于实现程序的优雅关闭。
  • os/exec,操作系统命令包,用于执行操作系统命令。
  • os/user,操作系统用户包,用于获取操作系统的用户信息。
  • bufio,有缓冲IO读写包。
  • path,处理斜杠分隔路径的包,例如url之类的。
  • path/filepath,处理文件路径的包。
  • math,数学操作包
  • math/bits,位运算操作包
  • math/cmplx,复数操作包,也提供了一些三角函数的工具函数。
  • math/rand,伪随机包
  • math/big,大数高精度计算包
  • container/heap,最小堆的实现
  • container/list,双线链表的实现
  • container/ring,环的实现
  • archive/zip,zip压缩归档的包
  • archive/tar,tar归档文件的包
  • compress,压缩算法实现的包,比如gzip,flate。
  • database/sql,与数据库进行交互的包
  • encoding,处理编码的包,其下有很多子包,比如jsonxml之类的,还有base64这种。
  • crypto,处理加密的包,其下有很多子包,比如sha1,rsa等
  • go/ast,go源代码抽象语法树映射的包
  • go/parser ,将go源代码解析成抽象语法树的包
  • go/importer,提供了对导入器的访问
  • go/format,go语言格式化包
  • areana,提供可手动分配和释放内存的功能,处于实验阶段
  • runtime,运行时操作包,go中有许多操作都是这个包实现的。

五.Go语言学习资料

下面是一些Go语言学习资料:

Go语言圣经(Go语言圣经 - Go语言圣经)

Go入门指南(《Go 入门指南》 | Go 技术论坛

Golang中文学习文档(首页 | Golang中文学习文档)

相关推荐
Find24 天前
MaxKB 集成langchain + Vue + PostgreSQL 的 本地大模型+本地知识库 构建私有大模型 | MarsCode AI刷题
青训营笔记
理tan王子24 天前
伴学笔记 AI刷题 14.数组元素之和最小化 | 豆包MarsCode AI刷题
青训营笔记
理tan王子24 天前
伴学笔记 AI刷题 25.DNA序列编辑距离 | 豆包MarsCode AI刷题
青训营笔记
理tan王子24 天前
伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵1 个月前
分而治之,主题分片Partition | 豆包MarsCode AI刷题
青训营笔记
三六1 个月前
刷题漫漫路(二)| 豆包MarsCode AI刷题
青训营笔记
tabzzz1 个月前
突破Zustand的局限性:与React ContentAPI搭配使用
前端·青训营笔记
Serendipity5651 个月前
Go 语言入门指南——单元测试 | 豆包MarsCode AI刷题;
青训营笔记
wml1 个月前
前端实践-使用React实现简单代办事项列表 | 豆包MarsCode AI刷题
青训营笔记
用户44710308932421 个月前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记