在本文中,我们将介绍 Go 编程语言的基础知识。我们将补充代码示例来说明这一点并提供一些有意义的代码。
如果你有一点 C 的背景,就很容易理解语法。由于 Go 有很好的文档记录,我们将主要关注我们可以多快进入编码并通过实际操作来理解它。让我们首先设置环境。
设置 Go
- 安装 Go 其实很简单。下载编译器。安装指南中给出了精确的安装说明。
- 有许多免费的 IDE 可以通过Atom、vscode、Eclipse等插件支持 Go 编程。在这里,我们将使用 vscode。在vscode 市场中有可用于 Go 编码的插件。
- Go 编译器安装成功后,我们需要设置一些环境变量,如 GOROOT、GOBIN、GOPATH 和 PATH。事实上,只设置 GOPATH 和 PATH 就足够了,但为了方便起见,我们还将设置其他环境变量。
- GOROOT环境变量是指Unix/Linux中的/usr/local/go等go安装目录。
- GOPATH 环境变量指定了我们通常保存编程代码的工作空间位置。如果未设置此环境变量,则默认为主目录中名为“go”的目录,例如 Unix/Linux 中的 $HOME/go 或 Windows 中的 %USERPROFILE%go。GOPATH 可能包含引用不同 Go 项目的多个目录路径。
- GOBIN 环境变量是指 go 安装目录中的bin目录,例如$GOROOT/bin。如果我们经常在不同的 GOPATH 目录之间切换,设置这个环境变量特别有用。此变量是指您可以找到二进制文件的位置。
- PATH 是一个常见的操作系统环境变量,它指的是 shell 用于正确可执行文件的目录。我们通常将 $GOBIN 和 $GOPATH/bin 目录设置为 PATH 变量,以便正确找到 GO 附带的可执行文件和我们通过 Go 编程创建的可执行文件。
正确完成安装和设置后,我们可以使用以下命令从终端检查事情是否正确。
- go version – 将显示安装的 Go 版本
- go env – 将打印环境变量的状态
如果一切顺利,go version应该会显示安装的 Go 编译器版本,go env会显示环境变量列表及其内容,其中一些是我们最近设置的。可以在此处找到 go 命令的综合文档。
注意:从 Go 1.13 开始,Go 开发的模块模式一直是默认现象。如果我们在 Go 编程中选择使用模块模式,则无需设置 GOPATH。让我们暂时搁置这个想法并设置 GOPATH。至少现在我们不会使用模块模式。
去工作区
Go 通过 Go 工作区促进源代码管理。它包含用于快速编译的源文件、编译的二进制文件和缓存的对象。Go 工作区通常包含三个目录:bin、pkg、src。
src目录将包含我们所有的源代码。因此,当我们说工作区目录的构建路径时,它将在src目录中找到代码文件。bin目录应包含我们在源文件编译后可能创建的二进制文件。pkg目录包含中间二进制文件,例如我们可能在项目中使用的第三方包。这些中间二进制文件存储在pkg目录中。中间二进制文件不需要重新编译,只需在项目编译的最后一步中链接,同时创建单个二进制可执行文件。
请注意,Go 工作区通常包含这三个目录。一个真实的项目结构可能包含多个目录,其中每个子目录都有一个或多个文件。
引入包、main和init函数
Go 代码的第一条语句总是以package开头。这意味着要一起编译的一个或多个源文件被收集在同一个包中。在包中的任何源文件中声明的变量、常量和函数等编程元素在包中都是可见的。
Go 程序必须有一个带有main()函数的主包,该函数用作程序的入口点或通常首先执行的函数。这个函数是自动调用的,不需要显式调用。
但是有一个名为init()的函数在main()之前执行。与main()一样,此函数也不接受任何参数,也不返回任何内容。此函数存在于所有包中,特别用于初始化目的。与main()不同,可以有多个init()函数,它们按照创建顺序执行,如下例所示:
package main
import "fmt"
func init() {
fmt.Println("from first init()")
}
func init() {
fmt.Println("from second init()")
}
func init() {
fmt.Println("from third init()")
}
func main() {
fmt.Println("from main()")
}
输出
from first init() from second init() from third init() from main()
Go 中的类型
- 布尔类型:处理布尔值和表达式 Go 为bool类型提供了标准的真假值。标准的逻辑和比较运算符产生布尔结果。
- 数字类型:Go 具有广泛的内置数字类型,其中包含big.Int的标准库。
- 整数类型:有 13 种整数类型,例如:
- 签名:int、int8、int16、int32、int64
- 无符号:uint、uint8、uint16、uint32、uint64
- 字节与 int uint8相同
- 符文与int32相同
- uintptr是无符号整数,用于存储指针值
- 浮点类型:浮点数和复数各有两种
- 浮点数:float32、float64
- 复数(包含实部和虚部):complex64、complex128
- 整数类型:有 13 种整数类型,例如:
例如,这是我们处理复杂类型的方式:
package main import "fmt" func main() { cnum1 := complex(6, 9) cnum2 := 5 + 23i csum := cnum1 + cnum2 fmt.Println(csum) }
输出
(11+32i)
再举一个例子,下面是我们如何在 Go 中创建一个帕斯卡三角形,从键盘获取用户输入。
package main
import "fmt"
func main() {
//Pascal's triangle
var rows int
cof := 1
fmt.Println("Enter number of rows: ")
fmt.Scanf("%d", &rows)
for i := 0; i < rows; i++ {
for j := 0; j <= i; j++ {
if j == 0 || i == 0 {
cof = 1
} else {
cof = cof * (i - j + 1) / j
}
fmt.Printf("%5d", cof)
}
fmt.Printf("n")
}
}
输出
Enter number of rows: 10 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
Go 中的声明/分配
了解在上面的示例中,我们使用了两种类型的赋值运算符“=”和“:=”。前者 (=) 是常用的赋值运算符,用于为已声明的变量赋值或重新赋值,而后者 (:=) 用于执行没有指定类型的短变量声明。例如:
var x int = 10 var y = 10 var z int z = 10
可以很容易地用简写赋值表达式代替,例如
x :=10 y :=10 z :=10
请注意,与常规变量声明不同,短声明不需要显式类型。它们比常规的变量声明或赋值更简洁。但请注意,短变量声明用于函数或方法内部。在声明可跨包级别访问的全局变量时,不能使用短声明。在这种情况下,我们必须将其声明为 var x int =10。
让我们尝试一个创建另一个文件副本的示例。函数io.Copy将内容从源文件复制到目标文件,直到源文件达到 EOF 或发生错误。它返回复制的字节数和复制时遇到的第一个错误(如果有)。
package main
import (
"io"
"os"
)
func main() {
filecopy("/home/mano/Documents/kartika_copy.pdf", "/home/mano/Documents/kartika.pdf")
}
func filecopy(destfile, sourcefile string) (written int64, err error) {
source, err := os.Open(sourcefile)
if err != nil {
return
}
defer source.Close()
destination, err := os.Create(destfile)
if err != nil {
return
}
defer destination.Close()
return io.Copy(destination, source)
}
结论
设置编程环境、理解类型和变量声明、循环、条件语句和函数是任何编程语言的基础。循环和条件语句非常简单。它们在这里没有明确处理。Go 文档是开始 Go 编码的绝佳来源。还有更多内容,敬请期待。
参考: