Go 编程入门hello world

在本文中,我们将介绍 Go 编程语言的基础知识。我们将补充代码示例来说明这一点并提供一些有意义的代码。

如果你有一点 C 的背景,就很容易理解语法。由于 Go 有很好的文档记录,我们将主要关注我们可以多快进入编码并通过实际操作来理解它。让我们首先设置环境。

设置 Go

  • 安装 Go 其实很简单。下载编译器安装指南中给出了精确的安装说明。
  • 有许多免费的 IDE 可以通过Atomvscode、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

例如,这是我们处理复杂类型的方式:

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 编码的绝佳来源。还有更多内容,敬请期待。

参考:

文档

Go 编程语言规范