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

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

リリース: 2023-07-24 17:45:24
転載
1219 人が閲覧しました

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

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

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><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 类型),则以 <name> 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 までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート