Eine kurze Analyse der Implementierung der Aufzählung in Golang (mit Code)

青灯夜游
Freigeben: 2022-02-04 09:00:31
nach vorne
5477 Leute haben es durchsucht

Wie implementiert man die Aufzählung in Golang? Der folgende Artikel stellt Ihnen die Methode zur Implementierung der Aufzählung in Golang vor. Ich hoffe, er wird Ihnen hilfreich sein!

Eine kurze Analyse der Implementierung der Aufzählung in Golang (mit Code)

Im Bereich der Programmierung werden Aufzählungen zur Darstellung von Typen verwendet, die nur eine begrenzte Anzahl fester Werte enthalten. Sie werden in der Regel in der Entwicklung verwendet, um Fehlercodes oder Zustandsmaschinen zu identifizieren. Nehmen Sie als Beispiel die Zustandsmaschine eines Entitätsobjekts. Sie entspricht normalerweise dem Feldwert, der den Zustand des entsprechenden Datensatzes dieses Objekts in der Datenbank identifiziert. [Verwandte Empfehlung: Go-Video-Tutorial]

Als Sie zum ersten Mal mit dem Erlernen des Programmierens begonnen haben, müssen Sie Code geschrieben oder zumindest gesehen haben, der magische Zahlen direkt verwendet, um Urteile zu fällen. Was ist eine magische Zahl? Wenn Sie beispielsweise einen Artikel oben anheften möchten, müssen Sie zunächst feststellen, ob der Artikel veröffentlicht wurde.

if (article.state == 2) {
   // state 2 代表文章已发布
}
Nach dem Login kopieren

Wenn unser Code keine Kommentare enthält oder der Code unseres Projekts voller dieser magischen Zahlenurteile ist, werden Sie dann Kopfschmerzen haben?

Später lernte ich, diese Statuswerte als Konstanten zu definieren, und entwickelte außerdem eine Methode zur Bestimmung des Status des Objekts, um diese Logik separat zu kapseln.

public class ArticleState {
    
    public static final int Draft = 1; //草稿
    
    public static final int Published = 2; //发布
    
    public static final int Deleted = 3; // 已删除
}

public  Boolean checkArticleState(int state) {
    
    ...
    
}
Nach dem Login kopieren

Diese Verwendung ist definitiv viel besser als die direkte Verwendung magischer Zahlen, um im Programm Urteile zu fällen. Zumindest wird es Ihnen keine Kopfschmerzen bereiten oder fluchen.

Der große Bruder, der mich später dorthin brachte, sagte jedoch, dass diese Methode auch Mängel aufweist. Die obige checkArticleState-Methode wird verwendet, um den Artikelstatus zu überprüfen. Sie soll den Aufrufer eine der drei statischen Konstanten von ArticleState übergeben lassen. Es gibt jedoch keine Typbeschränkung, daher ist die Übergabe eines beliebigen int-Werts auch syntaktisch zulässig und der Compiler gibt keine Warnungen aus. Es ist sinnvoller, eine Aufzählung zu verwenden.

em~! Ich kann mich nicht erinnern, dass der Lehrer während des Semesters, als ich im College Java unterrichtete, darüber gesprochen hat. Ist das ein weiterer Wissenspunkt, den ich beim Spielen auf meinem Handy im Unterricht verpasst habe? Nach der Verwendung der Aufzählung lautet unser Java-Code also:

// 使用enum而非class声明
public enum ArticleState {
	
    //要在enum里创建所有的枚举对象
    Draft(1, "草稿");
    Published(2, "已发布");
    Deleted(3, "已删除")
      
    // 自定义属性
    private int code;

    private String text;
  
    // 构造方法必须是private的
    ArticleState(int code, String text) {
        this.code = id;
        this.text = name;
    }
}

public  Boolean checkArticleState(ArticleState state) {
    
    ...
    
}
Nach dem Login kopieren

Auf diese Weise können wir uns auf den Aufzählungstyp des formalen Parameters verlassen, um unzulässige Zustandswerte herauszufiltern Wenn die Kompilierung fehlschlägt, werden Sie vom Compiler beim Schreiben des Codes sofort dazu aufgefordert.

Wenn Sie noch nie Java verwendet haben, machen Sie sich keine Sorgen, ich habe die wichtigsten grammatikalischen Punkte mit Kommentaren markiert und jeder sollte es verstehen können.

In den letzten zwei Jahren habe ich Go hauptsächlich für Projekte verwendet. Ich habe festgestellt, dass in Go ähnliche Probleme aufgetreten sind, aber Go keine Aufzählungstypen bereitstellt. Es wird definitiv nicht funktionieren, wenn Sie weiterhin Konstanten vom Typ int verwenden. Beispiel:

 const (
     Draft int = 1
     Published = 2
     Deleted   = 3
 )

 const (
     Summer int = 1
     Autumn     = 2
     Winter     = 3
     Spring     = 4
 )

 func main() {
     // 输出 true, 不会有任何编译错误
     fmt.Println(Autumn == Draft)
 }
Nach dem Login kopieren

Zum Beispiel sind oben zwei Sätze von Konstanten vom Typ int definiert, einer repräsentiert den Status des Artikels und der andere repräsentiert die vier Jahreszeiten. Beim Vergleich des Artikelstatus mit den Staffeln treten auf diese Weise keine Kompilierungsfehler auf.

Die Antwort finden Sie im Code der integrierten Bibliotheken von Go oder in einigen Open-Source-Bibliotheken, die wir alle kennen. Wenn Sie sich beispielsweise ansehen, wie gRPC-Fehlercodes in google.golang.org/grpc/codes definiert sind, können Sie verstehen, wie die Aufzählung korrekt implementiert wird.

Wir können int als Basistyp verwenden, um einen Alias-Typ zu erstellen.

type Season int

const (
	Summer Season = 1
	Autumn        = 2
	Winter        = 3
	Spring        = 4
)
Nach dem Login kopieren

Natürlich verwendet Go häufig Iota, wenn er kontinuierliche konstante Werte definiert, sodass die obige Definition weiter vereinfacht werden kann.

type Season int

const (
	Summer Season = iota + 1
	Autumn
	Winter
	Spring
)

type ArticleState int

const (
  Draft int = iota + 1
  Published
  Deleted  
)

func checkArticleState(state ArticleState) bool {
	// ... 
}

 func main() {
   // 两个操作数类型不匹配,编译错误
   fmt.Println(Autumn == Draft)
	// 参数类型不匹配,但是因为 ArticleState 底层的类型是 int 所以传递 int 的时候会发生隐式类型转换,所以不会报错
   checkArticleState(100)
 }
Nach dem Login kopieren

Obwohl die zugrunde liegenden Typen dieser Statuswerte alle int-Werte sind, führt der Vergleich von Aufzählungswerten zweier nicht verwandter Typen jetzt zu Kompilierungsfehlern, da jetzt überall dort, wo wir Statuswerte verwenden, Typbeschränkungen gelten.

Allerdings ist der Parametertyp der Funktion checkArticleState auf ArticleState gesetzt, da der zugrunde liegende Typ von ArticleState int ist. Daher führt die Übergabe von int-Typparametern beim Aufruf von checkArticleState zu einer impliziten Typkonvertierung und nicht zu einem Kompilierungsfehler. Wenn Sie dieses Problem lösen möchten, können Sie den Typ nur neu definieren, um dies zu erreichen auf StackOverflow:

https://stackoverflow.com/questions/50826100/how-to-disable-implicit-type-conversion-for-constants

Weitere Kenntnisse zum Thema Programmierung finden Sie unter:

Programmiervideo
! !

Das obige ist der detaillierte Inhalt vonEine kurze Analyse der Implementierung der Aufzählung in Golang (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage