Skip to content

Go 语言基础语法

Go 标记

Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:

go
fmt.Println("Hello, World!")

6 个标记是(每行一个):

go
1. fmt
2. .
3. Println
4. (
5. "Hello, World!"
6. )

行分隔符

在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。

以下为两个语句:

go
fmt.Println("Hello, World!")  
fmt.Println("菜鸟教程:runoob.com")

注释

注释不会被编译,每一个包应该有相关注释。

单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。如:

// 单行注释
/*
 Author by 菜鸟教程
 我是多行注释
 */

标识符

标识符用来命名变量、类型等程序实体。一个标识符实际上就是一个或是多个字母(A~Z和a~z)数字(0~9)、下划线_组成的序列,但是==第一个字符必须是字母下划线而不能是数字==。

以下是有效的标识符:

mahesh   kumar   abc   move_name   a_123
myname50   _temp   j   a23b9   retVal

以下是无效的标识符:

1ab(以数字开头)
case(Go 语言的关键字)
a+b(运算符是不允许的)

字符串连接

Go 语言的字符串连接可以通过 + 实现:


关键字

下面列举了 Go 代码中会使用到的 25 个关键字或保留字:

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:

appendboolbytecapclosecomplexcomplex64complex128uint16
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint64
printprintlnrealrecoverstringtrueuintuint8uintptr

程序一般由关键字、常量、变量、运算符、类型和函数组成。

程序中可能会使用到这些分隔符:括号 ()中括号 []大括号 {}

程序中可能会使用到这些标点符号:. , ; : 和 


Go 语言的空格

在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。

Go 语言中变量的声明必须使用空格隔开,如:

go
var x int
const Pi float64 = 3.14159265358979323846

在运算符和操作数之间要使用空格能让程序更易阅读:

无空格:

fruit=apples+oranges;

在变量与运算符间加入空格,程序看起来更加美观,如:

fruit = apples + oranges;

在关键字和表达式之间要使用空格。

if x > 0 {
    // do something
}

在函数调用时,函数名和左边等号之间要使用空格,参数之间也要使用空格。

result := add(2, 3)

格式化字符串

Go 语言中使用 fmt.Sprintf 或 fmt.Printf 格式化字符串并赋值给新串:

导包

在Go语言中,导包语句用于引入外部或内部的包,以便在当前文件中使用包内的函数、类型和变量。Go的包管理遵循严格的模块化结构,每个文件都必须明确地导入所需的包。

导包语句的基本语法

go
import "package_path"
  • 单个包导入:导入单个包,路径使用双引号括起来,例如:
go
import "fmt"
  • 多个包导入:可以使用小括号 () 来导入多个包,每行一个包路径:
go
import (
    "fmt"
    "time"
)

导入包的路径

  • 标准库包:例如 fmttime 等,直接使用标准库包的名称即可。
  • 自定义包:对于同一项目中的自定义包,使用相对于 GOPATHgo.mod 文件所在目录的路径。
  • 第三方包:通过路径引用第三方包,例如 github.com/user/package,使用 go get 命令获取并添加到项目中。

包的导入方式

Go语言提供了多种包导入方式,根据不同的使用需求,可以选择合适的导入方式。

1. 标准导入

标准导入是最常用的导入方式,直接导入包并使用包名访问其中的函数和变量。

go
import "fmt"

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

在这里,fmt 包的 Println 函数通过 fmt.Println 的方式调用。

2. 别名导入

在导入包时,可以为包指定一个别名,以便使用更简洁或更符合上下文的名称来引用该包。

go
import f "fmt"

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

在这个示例中,fmt 包被重命名为 f,因此可以使用 f.Println 来调用 fmt.Println

3. 匿名导入(仅执行初始化)

在某些情况下,只需要执行包的初始化代码,而不直接使用包中的任何函数或变量。可以使用 _ 作为包的别名,称为匿名导入。

go
import _ "net/http"
  • 匿名导入的包会执行其 init 函数,但不会在代码中显式引用该包。
  • 常见于数据库驱动或一些插件型包的初始化,例如 import _ "github.com/go-sql-driver/mysql"

4. 导入同名包的情况

有时候,不同路径的包可能会有相同的名称,这时可以通过别名导入来区分它们。

go
import (
    jsonPkg "encoding/json"
    jsonIter "github.com/json-iterator/go"
)

func main() {
    data := []byte(`{"name": "Alice"}`)
    var result map[string]interface{}

    // 使用标准库的 json 包
    jsonPkg.Unmarshal(data, &result)

    // 使用第三方的 json-iterator 包
    jsonIter.Unmarshal(data, &result)
}

在这个示例中,encoding/json 包和 github.com/json-iterator/go 包都被导入并使用别名来区分。

包的导入路径规则

  1. 模块化路径:导入路径通常是从 GOPATHgo.mod 文件所在目录计算的相对路径。
  2. 标准库:对于Go标准库,直接使用包名称即可,不需要额外配置。
  3. 模块化项目的路径:如果项目使用了 go.mod,可以直接根据模块名称和包目录结构导入。

使用 go get 获取外部包

Go使用 go get 命令获取并安装第三方包:

cmd
go get github.com/user/package

执行后,包会下载并自动添加到 go.mod 中。

示例:导入和使用多个包

go
package main

import (
    "fmt"
    "math"
    "time"
)

func main() {
    fmt.Println("Square root of 16 is:", math.Sqrt(16))
    fmt.Println("Current time is:", time.Now())
}

注意事项

  1. 导入但未使用:Go不允许导入未使用的包,编译器会报错,因此必须确保所有导入的包都被使用。
  2. 避免循环导入:Go不支持循环导入,即包A导入包B,包B又导入包A。需要合理设计包结构避免这种情况。
  3. 包的唯一性:导入路径唯一确定一个包,包名通常与目录名一致。

评论区

欢迎留言、补充或勘误。

xiaoba.blog