Wie kann eine Funktion in Go, CamelCase oder Semi-CamelCase benannt werden?


79

Ich möchte eine Funktion in Go schreiben, um ein Dokument in eine Sammlung in einer MongoDB-Datenbank einzufügen. Welche Art der Benennung der Funktion ist besser?

  • writeToMongoDB oder
  • WriteToMongoD?

Das zweite ist CamelCase, während ich jemanden gesehen habe, der den Stil des ersten verwendet, daher bin ich mir nicht sicher, welches besser geeignet ist. Vielen Dank.


2
Sie haben verschiedene Verwendungszwecke: golang.org/ref/spec#Exported_identifiers
JimB

Vielen Dank. Im Programm des anderen in Datei A wird die Funktion zunächst benannt, und ein anderes Programm in Datei B ruft die Funktion aus Datei A auf. Sowohl Datei A als auch Datei B befinden sich im selben Verzeichnis. Laut dem Link scheint es, dass die Funktion auf die zweite Weise definiert werden muss, um vom Programm in einer anderen Datei verwendet zu werden, richtig?
Tim

Das ist richtig, wenn der Name des Pakets von Datei A lautet packageA, kann Datei B über packageA.WriteToMongoD( Paket A ist als Qualifizierer erforderlich) auf die Funktion zugreifen.
Tanmay Garg

Hilft dies bei der Beantwortung Ihrer Frage? stackoverflow.com/a/64300628/12817546 .
Tom L

Antworten:


115

Syntax

In Go ist dies keine Frage des Stils, sondern der Syntax.

Exportierte Namen (dh Bezeichner, die aus einem anderen Paket als dem, in dem sie definiert sind, verwendet werden können) beginnen mit einem Großbuchstaben. Wenn Ihre Methode Teil Ihrer öffentlichen API ist, sollte sie wie folgt geschrieben werden:

WriteToDB

Wenn es sich jedoch um eine interne Hilfsmethode handelt, sollte Folgendes geschrieben werden:

writeToDB

Der Vorteil der es auf diese Weise tun Keywords über mit exportedness (zu definieren extern, publicusw.) ist , dass es ein Teil des Namens , sicher machen , die überall eine Kennung verwendet wird , kann Ihnen sagen , wenn es exportiert wird oder nicht , ohne dort zu finden, die wurde definiert (um zu sehen, ob die Definition ein Schlüsselwort enthält).

Siehe auch: Exportierte Kennungen aus der Spezifikation.

i18n

Da Go UTF-8-codiert ist und alle Unicode-Zeichen mit der Buchstaben- oder Zahleneigenschaft in Bezeichnernamen unterstützt, können einige Personen in Gebietsschemas, die kein Fallkonzept haben, Probleme beim Erstellen exportierter Methoden haben (die Standardeinstellung ist nicht exportiert). In diesem Fall (Wortspiel beabsichtigt) wird den Bezeichnern häufig ein Präfix vorangestellt X, um die Exportiertheit anzuzeigen. Zum Beispiel:X日本語

Siehe auch: Was ist mit Unicode-Kennungen los? aus den FAQ.

Stil

Was den allgemeinen Stil betrifft, ist es immer, Kamelkoffer zu verwenden (mit Ausnahme des ersten Buchstabens, wie bereits erwähnt). Dies umfasst Konstanten, Funktionen und andere Bezeichner. So könnte beispielsweise eine Liste von (exportierten) Konstanten folgendermaßen aussehen:

const (
    StateConnected = iota
    StateError
    StateDone

    internalStateMask = 0x2 
)

Darüber hinaus werden Abkürzungen immer mit demselben Fall geschrieben, sodass Sie eine der folgenden Angaben schreiben würden:

dbWrite
writeDB

anstelle von writeDboder DbWrite.


Tolle Antwort +1. Der bevorzugte Go-Begriff ist MixedCaps oder MixedCaps, nicht CamelCase. Siehe golang.org/doc/effective_go.html#mixed-caps .
Tom L

27

In Go ist es üblich, gemischte Kappen zu verwenden. Aus den Dokumenten: https://golang.org/doc/effective_go.html#mixed-caps

Schließlich besteht die Konvention in Go darin, MixedCaps oder MixedCaps anstelle von Unterstrichen zum Schreiben von Mehrwortnamen zu verwenden.

Beachten Sie, dass Namen auf Dateiebene, die mit Großbuchstaben beginnen, auf Paketebene exportiert werden: https://golang.org/doc/effective_go.html#Getters

Es ist auch üblich, Akronyme auf alle Großbuchstaben zu schreiben. Also unten ist in Ordnung:

writeToMongoDB // unexported, only visible within the package

oder

WriteToMongoDB // exported

Und nicht:

writeToMongoDb

Ich habe gerade Golang gelernt und war tagelang dabei. Endlich gelöst!
AzyCrw4282

18

Namen

Namen sind in Go genauso wichtig wie in jeder anderen Sprache. Sie haben sogar eine semantische Wirkung: Die Sichtbarkeit eines Namens außerhalb eines Pakets hängt davon ab, ob sein erstes Zeichen in Großbuchstaben geschrieben ist . Es lohnt sich daher, ein wenig über Namenskonventionen in Go-Programmen zu sprechen.

Paketnamen

Wenn ein Paket importiert wird, wird der Paketname zum Accessor für den Inhalt. Nach

"Bytes" importieren Das importierende Paket kann über Bytes sprechen. Es ist hilfreich, wenn jeder, der das Paket verwendet, denselben Namen verwenden kann, um auf seinen Inhalt zu verweisen. Dies bedeutet, dass der Paketname gut sein sollte: kurz, prägnant, anregend. Konventionell erhalten Pakete Einzelwortnamen in Kleinbuchstaben. Es sollten keine Unterstriche oder gemischten Kappen erforderlich sein. Err auf der Seite der Kürze, da jeder, der Ihr Paket verwendet, diesen Namen eingibt. Und mach dir keine Sorgen über Kollisionen von vornherein. Der Paketname ist nur der Standardname für Importe. Es muss nicht für den gesamten Quellcode eindeutig sein, und im seltenen Fall einer Kollision kann das importierende Paket einen anderen Namen für die lokale Verwendung auswählen. In jedem Fall ist Verwirrung selten, da der Dateiname beim Import genau bestimmt, welches Paket verwendet wird.

Eine andere Konvention ist, dass der Paketname der Basisname seines Quellverzeichnisses ist; Das Paket in src / encoding / base64 wird als "encoding / base64" importiert, hat jedoch den Namen base64, nicht encoding_base64 und nicht encodingBase64.

Der Importeur eines Pakets verwendet den Namen, um auf seinen Inhalt zu verweisen, sodass exportierte Namen im Paket diese Tatsache verwenden können, um Stottern zu vermeiden. (Verwenden Sie nicht die import. Notation, die Tests vereinfachen kann, die außerhalb des zu testenden Pakets ausgeführt werden müssen, aber ansonsten vermieden werden sollten.) Der gepufferte Lesertyp im bufio-Paket heißt beispielsweise Reader, nicht BufReader, weil Benutzer sehen es als bufio.Reader, was ein klarer, prägnanter Name ist. Da importierte Entitäten immer mit ihrem Paketnamen adressiert werden, steht bufio.Reader außerdem nicht in Konflikt mit io.Reader. In ähnlicher Weise wird die Funktion zum Erstellen neuer Instanzen von ring.Ring - dies ist die Definition eines Konstruktors in Go - normalerweise als NewRing bezeichnet. Da Ring jedoch der einzige vom Paket exportierte Typ ist und das Paket ring heißt, wird dies als Ring bezeichnet ' s heißt nur Neu, was Clients des Pakets als ring.New sehen. Verwenden Sie die Paketstruktur, um gute Namen auszuwählen.

Ein weiteres kurzes Beispiel ist einmal. Once.Do (Setup) liest sich gut und würde durch einmaliges Schreiben nicht verbessert. DoOrWaitUntilDone (Setup). Lange Namen machen die Dinge nicht automatisch lesbarer. Ein hilfreicher Dokumentkommentar kann oft wertvoller sein als ein extra langer Name .

Getters

Go bietet keine automatische Unterstützung für Getter und Setter. Es ist nichts Falsches daran, Getter und Setter selbst bereitzustellen, und es ist oft angebracht, dies zu tun, aber es ist weder idiomatisch noch notwendig, Get in den Namen des Getters zu setzen. Wenn Sie ein Feld mit dem Namen owner (Kleinbuchstaben, nicht exportiert) haben, sollte die Getter-Methode Owner (Großbuchstaben, exportiert) und nicht GetOwner heißen . Die Verwendung von Großbuchstaben für den Export bietet den Haken, um das Feld von der Methode zu unterscheiden. Eine Setter-Funktion wird bei Bedarf wahrscheinlich SetOwner genannt . Beide Namen lesen sich in der Praxis gut:

owner := obj.Owner()
if owner != user {
    obj.SetOwner(user)
}

Schnittstellennamen

Vereinbarungsgemäß wird ein Verfahren Schnittstellen nach dem Methodennamen und ein -en Suffix oder ähnliche Modifikation genannt , ein Mittel Substantiv zu konstruieren: Leser, Schriftsteller, Formatter, CloseNotifier etc .

Es gibt eine Reihe solcher Namen und es ist produktiv, sie und die von ihnen erfassten Funktionsnamen zu berücksichtigen. Lesen, Schreiben, Schließen, Flush, String usw. haben kanonische Signaturen und Bedeutungen. Um Verwirrung zu vermeiden, geben Sie Ihrer Methode keinen dieser Namen, es sei denn, sie hat dieselbe Signatur und Bedeutung. Wenn Ihr Typ hingegen eine Methode mit derselben Bedeutung wie eine Methode für einen bekannten Typ implementiert, geben Sie ihm denselben Namen und dieselbe Signatur. Rufen Sie Ihre String-Konverter-Methode String not ToString auf .

MixedCaps

Schließlich besteht die Konvention in Go darin, MixedCaps oder MixedCaps anstelle von Unterstrichen zum Schreiben von Mehrwortnamen zu verwenden .

ref: Effektiv gehen


12

In Golang wird jede Variable (oder Funktion) mit einem Bezeichner, der mit einem Großbuchstaben beginnt (z. B. CamelCase), für alle anderen Pakete in Ihrem Programm öffentlich (zugänglich) gemacht, während diejenigen, die mit einem Kleinbuchstaben beginnen (Beispiel) , camelCase) ist für kein Paket zugänglich, außer für das, in dem es deklariert wird.

Sie sollten CamelCase verwenden, wenn Sie die Variable (oder Funktion) in einem anderen Paket verwenden möchten, oder Sie können sicher bei camelCase bleiben.


1
Tolle Antwort +1. Der bevorzugte Go-Begriff ist MixedCaps oder MixedCaps, nicht CamelCase. Siehe golang.org/doc/effective_go.html#mixed-caps .
Tom L
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.