谁能提供一个编写精良的Golang简单代码示例?

谁能提供一个编写精良的Golang简单代码示例? 大家好,能否给我一个链接,或者直接复制粘贴一段遵循Go语言格式规则的、编写精良的简单Golang代码?我不想要太复杂的,但同时希望它能涵盖全部或大部分格式规则。

例如: 变量命名是像JavaScript一样使用驼峰式还是使用下划线?函数名呢? 结构体和接口呢?方法是用Python中的self,还是用小写的结构体名,或者只是首字母?函数和其他内容之间有多少空格?是像Python那样两个空格吗?以及更多类似的问题。

我知道这些事情并不真正重要,但我希望自己能专业地使用Go。在JavaScript中使用下划线会很奇怪,并且当团队中每个人都按照自己认为正确的方式行事时,协作会变得困难。

谢谢!


更多关于谁能提供一个编写精良的Golang简单代码示例?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

https://tour.golang.org

工具 golint 检查你的代码。

更多关于谁能提供一个编写精良的Golang简单代码示例?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


工具如何知道你是否想要导出字段?你会期望一个Java格式化工具为你的代码添加 publicprivate 限定符吗?

惯用的标识符命名采用驼峰式。

方法的接收者通常是其类型名称的首字母,或者前两个字母,亦或是某种由2个(最多3个)字母组成的缩写。其长度应足以在上下文中被识别。

你所询问的大多数其他问题,go fmt 都能处理,你确实应该使用它!

func main() {
    fmt.Println("hello world")
}

你是否已经阅读过 https://golang.org/doc/effective_go.html?它详细说明了 Go 语言中的所有注意事项和最佳实践,并提供了简单的源代码示例。

与 JavaScript 不同,Go 语言对你的某些疑问有严格的规定。其中一些被视为规则而非惯例。例如:首字母的大小写决定了元素(varfuncconstant 等)的导出或非导出属性。

一般来说,Go 开发者会遵循 gofmt 和《Effective Go》的规范,以确保代码在全球范围内的一致性和高效沟通(代码可读性)。例如:尽管你可以使用蛇形命名法(参见:https://play.golang.org/p/sLKepHhyxnA),但不建议这样做,因为这会破坏高效沟通,并且随着你的包不断扩展,其他开发者可能无法有效地为你提供帮助。

在使用多种编程语言时,应避免将语法格式规则和惯例相互迁移。否则,你将无法充分发挥其最大潜力。加油!

以下是一个遵循Go语言官方格式规则的完整示例,涵盖了变量命名、函数、结构体、接口等核心规范:

package main

import (
    "fmt"
    "time"
)

// User 结构体使用大驼峰命名
type User struct {
    ID        int       // 公开字段使用大驼峰
    firstName string    // 私有字段使用小驼峰
    lastName  string
    createdAt time.Time
}

// NewUser 构造函数使用大驼峰
func NewUser(id int, firstName, lastName string) *User {
    return &User{
        ID:        id,
        firstName: firstName,
        lastName:  lastName,
        createdAt: time.Now(),
    }
}

// FullName 方法使用大驼峰
func (u *User) FullName() string {
    return fmt.Sprintf("%s %s", u.firstName, u.lastName)
}

// Stringer 接口使用大驼峰
type Stringer interface {
    String() string
}

// String 实现接口方法
func (u *User) String() string {
    return fmt.Sprintf("User[ID=%d, Name=%s]", u.ID, u.FullName())
}

// calculateScore 私有函数使用小驼峰
func calculateScore(base int) int {
    const multiplier = 2
    return base * multiplier
}

func main() {
    // 变量使用小驼峰
    userCount := 10
    maxRetries := 3
    
    // 切片声明
    users := make([]*User, 0, userCount)
    
    // 循环和条件语句格式
    for i := 0; i < userCount; i++ {
        if i%2 == 0 {
            user := NewUser(i, "John", "Doe")
            users = append(users, user)
        }
    }
    
    // 错误处理
    if err := processUsers(users); err != nil {
        fmt.Printf("Error: %v\n", err)
    }
    
    // 多返回值处理
    result, err := getResult()
    if err != nil {
        fmt.Printf("Failed: %v\n", err)
        return
    }
    
    fmt.Printf("Result: %d\n", result)
}

// processUsers 函数返回错误
func processUsers(users []*User) error {
    if len(users) == 0 {
        return fmt.Errorf("no users to process")
    }
    
    for _, user := range users {
        fmt.Println(user.String())
    }
    
    return nil
}

// getResult 返回多个值
func getResult() (int, error) {
    return calculateScore(100), nil
}

关键格式规则:

  1. 命名规范:

    • 公开标识符:大驼峰(User, FullName()
    • 私有标识符:小驼峰(firstName, calculateScore()
    • 不使用下划线(除非测试文件或常量组)
  2. 方法接收器:

    • 单字母或缩写,小写(u *User
    • 不使用selfthis
  3. 空格规则:

    • 操作符前后加空格:i := 0
    • 逗号后加空格:func NewUser(id int, firstName, lastName string)
    • 控制结构后加空格:for i := 0; i < n; i++
  4. 缩进:

    • 使用制表符(tab),不是空格
    • 可通过gofmt自动格式化
  5. 错误处理:

    • 错误作为最后一个返回值
    • 立即检查错误
  6. 接口命名:

    • 单个方法接口:接口名+erStringer
    • 多个方法:描述性名称

运行gofmt -w yourfile.go可自动格式化代码。

回到顶部