ホームページ  >  記事  >  バックエンド開発  >  Go 言語のコーディング標準の一部

Go 言語のコーディング標準の一部

Go语言进阶学习
Go语言进阶学习転載
2023-07-24 17:45:241172ブラウズ

各言語には独自のコーディング標準があります。その言語の命名標準を学ぶと、作成するコードが読みやすくなり、低レベルのエラーが発生しにくくなります。

個人的なコーディング習慣とインターネット上のいくつかの記事に基づいて、この記事では誰もが使用できるコーディング標準をまとめました。これらは主流のソリューションである可能性がありますが、公式のものではありません。最初にこれを述べておきます。

1. ファイルの名前付け

  1. Windows プラットフォームではファイル名の大文字と小文字が区別されないため、ファイル名は次のように指定する必要があります。常に小文字を使用してください

  2. 異なる単語を区切るにはアンダースコアを使用し、キャメルケースの名前付けは使用しないでください

  3. テスト ファイルの場合は、 _test を使用できます。go

  4. で終わります。ファイルにプラットフォームの特性がある場合は、utils_ などの filename_platform.go で名前を付ける必要があります。 windows.go、utils_linux.go、利用可能 プラットフォームには、windows、unix、posix、plan9、darwin、bsd、linux、freebsd、nacl、netbsd、openbsd、solaris、dragonfly、bsd、notbsd、android、stubs

    が含まれます。
  5. 通常、アプリケーションのメイン エントリは main.go にするか、アプリケーションの名前をすべて小文字にする必要があります。たとえば、MyBlog への入り口は myblog.go

2 になります。 ##現在、インターネット上では、

という記述には主に 2 つのスタイルがあることがわかります。1 つ目は、appVersion

# などのキャメル ケースの命名方法です。
  1. ##2 番目のタイプは、すべて大文字を使用し、単語を区切るのにアンダースコアを使用します (APP_VERSION

  2. これより優れたものはありません)個人的には、主に一目で変数と区別できるため、2 番目のスタイルを使用することを好みます。 複数の変数を定義する場合は、括弧を使用して変数を整理してください。

    const (
      APP_VERSION = "0.1.0"
      CONF_PATH = "/etc/xx.conf"
    )
3. 変数の命名

定数とは異なり、変数の命名は開発者間で一貫性があり、統一して使用する必要がありますキャメル ケースの名前付け

比較的単純な環境 (オブジェクトの数が少なく、ターゲットが強力である) では、単語全体を 1 文字に省略できます。たとえば、次のようになります。あなたはとして<li style="font-size: inherit;color: inherit;line-height: inherit;margin: 0px;padding: 0px;margin-bottom: 0.5em;"><p style='color: inherit;line-height: inherit;padding: 0px;margin: 1.5em 0px;font-size: 15px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;'>若该变量为 bool 类型,则名称应以 <code style="font-size: inherit;line-height: inherit;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0px 2px;color: rgb(233, 105, 0);background: rgb(248, 248, 248);">Has, Is, CanAllow 开头。例如:isExist ,hasConflict 。

  • 其他一般情况下首单词全小写,其后各单词首字母大写。例如:numShips 和 startDate 。

  • 若变量中有特有名词(以下列出),且变量为私有,则首单词还是使用全小写,如 apiClient

  • 若变量中有特有名词(以下列出),但变量不是私有,那首单词就要变成全大写。例如:APIClientURLString

  • 这里列举了一些常见的特有名词:

    // A GonicMapper that contains a list of common initialisms taken from golang/lint
    var LintGonicMapper = GonicMapper{
        "API":   true,
        "ASCII": true,
        "CPU":   true,
        "CSS":   true,
        "DNS":   true,
        "EOF":   true,
        "GUID":  true,
        "HTML":  true,
        "HTTP":  true,
        "HTTPS": true,
        "ID":    true,
        "IP":    true,
        "JSON":  true,
        "LHS":   true,
        "QPS":   true,
        "RAM":   true,
        "RHS":   true,
        "RPC":   true,
        "SLA":   true,
        "SMTP":  true,
        "SSH":   true,
        "TLS":   true,
        "TTL":   true,
        "UI":    true,
        "UID":   true,
        "UUID":  true,
        "URI":   true,
        "URL":   true,
        "UTF8":  true,
        "VM":    true,
        "XML":   true,
        "XSRF":  true,
        "XSS":   true,
    }

    4. 函数命名

    1. 函数名还是使用 驼峰命名法

    2. 但是有一点需要注意,在 Golang 中是用大小写来控制函数的可见性,因此当你需要在包外访问,请使用 大写字母开头

    3. 当你不需要在包外访问,请使用小写字母开头

    另外,函数内部的参数的排列顺序也有几点原则

    1. 参数的重要程度越高,应排在越前面

    2. 简单的类型应优先复杂类型

    3. 尽可能将同种类型的参数放在相邻位置,则只需写一次类型

    5. 接口命名

    使用驼峰命名法,可以用 type alias 来定义大写开头的 type  给包外访问。

    type helloWorld interface {
        func Hello();
    }
    
    type SayHello helloWorld

    当你的接口只有一个函数时,接口名通常会以 er 为后缀

    type Reader interface {
        Read(p []byte) (n int, err error)
    }

    5. 注释规范

    注释分为

    5.1 包注释

    1. 位于 package 之前,如果一个包有多个文件,只需要在一个文件中编写即可

    2. 如果你想在每个文件中的头部加上注释,需要在版权注释和 Package前面加一个空行,否则版权注释会作为Package的注释。

    // Copyright 2009 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    package net
    1. 如果是特别复杂的包,可单独创建 doc.go 文件说明

    5.2 代码注释

    用于解释代码逻辑,可以有两种写法

    单行注释使用 // ,多行注释使用 /* comment */

    // 单行注释
    
    /*
    多
    行
    注
    释
    */

    另外,对于代码注释还有一些更加苛刻的要求,这个看个人了,摘自网络:

    • 所有导出对象都需要注释说明其用途;非导出对象根据情况进行注释。

    • 如果对象可数且无明确指定数量的情况下,一律使用单数形式和一般进行时描述;否则使用复数形式。

    • 包、函数、方法和类型的注释说明都是一个完整的句子。

    • 句子类型的注释首字母均需大写;短语类型的注释首字母需小写。

    • 注释的单行长度不能超过 80 个字符。

    • 类型的定义一般都以单数形式描述:

      // Request represents a request to run a command.  type Request struct { ...
    • 如果为接口,则一般以以下形式描述:

      // FileInfo is the interface that describes a file and is returned by Stat and Lstat.
      type FileInfo interface { ...
    • 函数与方法的注释需以函数或方法的名称作为开头:

      // Post returns *BeegoHttpRequest with POST method.
    • 如果一句话不足以说明全部问题,则可换行继续进行更加细致的描述:

      // Copy copies file from source to target path.
      // It returns false and error when error occurs in underlying function calls.
    • 若函数或方法为判断类型(返回值主要为 bool 类型),则以 8a11bc632ea32a57b3e3693c7987c420 returns true if 开头:

      // HasPrefix returns true if name has any string in given slice as prefix.
      func HasPrefix(name string, prefixes []string) bool { ...

    5.3 特别注释

    • TODO:提醒维护人员此部分代码待完成

    • FIXME:提醒维护人员此处有BUG待修复

    • NOTE:维护人员要关注的一些问题说明

    6. 包的导入

    单行的包导入

    import "fmt"

    多个包导入,请使用 () 来组织

    import (
      "fmt"
      "os"
    )

    另外根据包的来源,对排版还有一定的要求

    1. 标准库排最前面,第三方包次之、项目内的其它包和当前包的子包排最后,每种分类以一空行分隔。

    2. 尽量不要使用相对路径来导入包。

    import (
        "fmt"
        "html/template"
        "net/http"
        "os"
    
        "github.com/codegangsta/cli"
        "gopkg.in/macaron.v1"
    
        "github.com/gogits/git"
        "github.com/gogits/gfm"
    
        "github.com/gogits/gogs/routers"
        "github.com/gogits/gogs/routers/repo"
        "github.com/gogits/gogs/routers/user"
    )

    7. 善用 gofmt

    除了命名规范外,Go 还有很多格式上的规范,比如

    1. 使用 tab 进行缩进

    2. 一行最长不要超过 80 个字符

    因此在格式上的问题,你大部分都可以放心交由 gofmt 帮你调整。关于 gofmt 的文章还在写,应该这两天就会更新。你可以过两天再来看看。

    以上がGo 言語のコーディング標準の一部の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はGo语言进阶学习で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。