CNCF(云原生计算基金会)旗下目前总共有153个项目,其中已经毕业的项目20个,孵化中的项目35个,其余95个项目尚在沙盒之中。这些项目中有我们非常熟悉的kubernetes、prometheus等。
在已经毕业的20个项目中,主要使用Go语言构建的项目有15个,占比75%;孵化中的项目中,主要使用Go语言构建的项目达到24个,占比68.57%。这个趋势非常的明显,在云原生的趋势下,Go语言展现出强大的生命力,被广泛采用。所以了解Go语言非常有必要。
Go语言,又称Golang,是Google公司于2007年开始设计和开发的一种开源编程语言。其开发目的是为了提供一种高效、简洁、安全的系统编程语言,尤其适用于网络编程、分布式系统、并发编程等领域。Go语言在2012年正式发布了1.0版本,目前稳定版已经更新到了1.20.1,广泛应用于云计算、大数据、容器化等领域。
Go语言的基本语法比较简单,以下是几个常用的语法元素:
var a int = 10
。func add(a int, b int) int {return a + b}
。Go语言支持各种基本数据类型,如整数、浮点数、字符串、布尔型等,还支持复合数据类型,如数组、切片、映射、结构体等。以下是几个常用的数据类型:
要使用Go语言进行编程,需要先安装Go语言环境。以下是安装步骤:
下载安装包:从官网https://golang.org/dl/下载相应版本的安装包。
安装Go语言:按照安装包提示进行安装,安装完成后,需要设置环境变量。
设置环境变量:在系统环境变量中添加GOPATH和GOROOT两个变量,分别指向Go语言的工作目录和安装目录。
验证安装:在终端输入go version命令,可以查看Go语言的版本信息,证明安装成功。
$ go version
go version go1.20.1 windows/amd64
以下是一个简单的Go语言程序示例,可以打印出“Hello, World!”:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
在终端中使用go run命令即可执行该程序:
$ go run hello.go
Hello, World!
也可以使用go build命令将该程序编译成可执行文件,然后直接执行:
$ go build hello.go
$ ./hello
Hello, World!
go编译的速度非常快,编写helloworld和Java差不多,都非常简单。
我们再尝试一下开发一个Hello的Web服务,代码同样非常简单,有现成的网络包可以快速支持,这块比Java还是更方便一些。如下所示,简单启动一个http服务,接收请求并打印参数,返回特定字符串。
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
//解析参数
r.ParseForm()
var res string = "you say hello,I say hi!"
//打印表单参数
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:",strings.Join(v, ""))
}
//响应客户端
fmt.Fprintf(w,res)
}
func main() {
//路由和处理器映射
http.HandleFunc("/", helloHandler)
//监听端口设置
err := http.ListenAndServe(":8080", nil) 、
if err != nil {
log.Fatal("Error Info: ", err)
}
}
curl访问可以看到得到预期的返回“you say hello,I say hi!”。
$ curl http://localhost:8080?name=lucas
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 23 100 23 0 0 29831 0 --:--:-- --:--:-- --:--:-- 23000
you say hello,I say hi!
此时服务端输出表单中带入的参数
$ ./hello-hi-web.exe
key: name
val: lucas
Go语言标准库中包含了大量的包,涵盖了各种各样的功能,可以实现许多不同的任务。以下是一些常见的Go语言包和它们可以实现的一些功能:
除了标准库,还有很多第三方包可以使用,包括:
这只是一小部分可用的包和功能,Go语言生态系统非常丰富,用户可以根据需要选择适合自己的包。
相对于Java语言,Go语言有以下几个优势:
总之,Go语言在编译速度、执行效率、语法简洁性、并发编程支持、内存管理和分布式系统开发方面都具有很大的优势。
Go语言项目的工程结构通常是根据一些通用的模式和最佳实践来设计的。以下是一个常见的Go项目工程结构示例:
project/
├── cmd/
│ ├── main/
│ │ └── main.go
│ └── other/
│ └── main.go
├── internal/
│ ├── pkg1/
│ │ ├── file1.go
│ │ └── file2.go
│ └── pkg2/
│ ├── file1.go
│ └── file2.go
├── pkg/
│ ├── pkg1/
│ │ ├── file1.go
│ │ └── file2.go
│ └── pkg2/
│ ├── file1.go
│ └── file2.go
├── vendor/
├── web/
│ ├── app/
│ │ ├── handlers/
│ │ │ ├── api.go
│ │ │ └── web.go
│ │ ├── models/
│ │ │ ├── db.go
│ │ │ └── user.go
│ │ ├── templates/
│ │ │ ├── index.html
│ │ │ └── layout.html
│ │ ├── config.go
│ │ ├── main.go
│ │ └── routes.go
│ ├── static/
│ │ ├── css/
│ │ ├── img/
│ │ └── js/
│ └── Dockerfile
├── config/
│ ├── config.yaml
│ ├── config_dev.yaml
│ └── config_prod.yaml
├── scripts/
│ ├── build.sh
│ └── deploy.sh
├── test/
│ ├── integration/
│ └── unit/
├── .gitignore
├── Dockerfile
├── go.mod
├── go.sum
└── README.md
这个工程结构包括以下几个主要部分:
cmd/
:该目录包含所有可执行程序的源代码。每个子目录都应该是一个独立的程序,有一个主要的 main.go
文件,并使用相关的包来实现其功能。internal/
:该目录包含项目内部的代码,这些代码不希望被其他包或程序使用。这些包通常只由主要的可执行程序使用。pkg/
:该目录包含可重用的包,这些包可以由其他项目使用。每个子目录都应该是一个独立的包,有自己的API和文档。vendor/
:该目录包含项目的依赖项。可以使用 go mod vendor
命令将依赖项下载到此目录。web/
:该目录包含Web应用程序的源代码。它使用了一个传统的MVC结构,其中app/
目录包含所有控制器、模型和视图。config/
:该目录包含所有的配置文件。使用不同的文件名来区分开发、测试和生产环境。scripts/
:该目录包含所有的构建、测试和部署脚本。test/
:该目录包含所有的测试代码,包括单元测试和集成测试。.gitignore
:该文件包含所有应该被 Git 忽略的文件和目录。Dockerfile
:该文件包含构建 Docker 镜像的指令。go.mod
:该文件定义了该项目的所有依赖项。go.sum
:该文件包含所有依赖项的哈希值,用于确保依赖项的版本不会改变。README.md
:该文件包含项目的说明和文档。请注意,这只是一种常见的工程结构,不是硬性规定。根据项目的需求和规模,可以根据需要进行修改。