PostsMapsLinks
Go

Go

Go(又称 Golang)是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go 被誉为是未来的服务器端编程语言。

Tour

Specification

Packages

Patterns

Dev Tools

  • Go Playground:在线编写、运行和分享 Go 代码的工具
  • g:Version manager for Go

Build

Go 构建时的 VCS 信息嵌入

Go 1.18 引入的构建特性,编译时自动检测 Git 状态并将版本信息嵌入二进制文件。

VCS(Version Control System)信息包括 commit hash、分支名、是否有未提交修改等。可通过 go version -m <binary> 查看嵌入的构建信息。

当在非 Git 仓库目录构建时,Go 无法获取 VCS 信息会报错,此时需使用 -buildvcs=false 标志禁用该功能。

Syntax

函数语法结构快速入门

func (u *UserApplicationService) GetSpaceListV2(
    ctx context.Context,
    req *playground.GetSpaceListV2Request,
) (*playground.GetSpaceListV2Response, error) {
    // 业务逻辑实现
}
部分含义TypeScript 类比
func定义函数/方法function
(u *UserApplicationService)接收者 - 这个方法属于谁class UserApplicationService { async GetSpaceListV2(...) } 中的 this
GetSpaceListV2方法名方法名
ctx context.Context第一个参数参数(Go 是显式传递 context,不像前端自动)
req *playground.GetSpaceListV2Request第二个参数(指针类型)类似 req: GetSpaceListV2Request
(*playground.GetSpaceListV2Response, error)返回值(两个)Promise<[GetSpaceListV2Response, null] | [null, Error]>
// 定义结构体(类似 class)
type UserApplicationService struct {
    db *Database
}
// 给这个结构体"绑定"方法
func (u *UserApplicationService) GetSpaceListV2(...) { ... }

包与作用域

包内函数可见性机制

同一目录下的 .go 文件,如果声明相同的 package xxx,它们就属于同一个包。包内所有文件共享作用域,无需 import 即可互相调用函数、变量、类型。只有不同包之间才需要 import。

// request_inspector.go
package middleware
func RequestInspectorMW() { isNeedOpenapiAuth(ctx) }  // 直接调用,无需import

// openapi_auth.go
package middleware
func isNeedOpenapiAuth(c *app.RequestContext) bool { ... }
Copyright © 2024 Lionad - CC-BY-NC-CD-4.0