Könnte bei einer potenziellen Null-PTR-Dereferenzierung in Go ein Kompilierungsfehler auftreten?

WBOY
Freigeben: 2024-02-08 21:50:21
nach vorne
788 Leute haben es durchsucht

在 Go 中,我可能会遇到潜在的 null ptr 取消引用的编译错误吗?

In der Go-Sprache gibt es keine potenziellen Fehler bei der Kompilierung der Nullzeiger-Dereferenzierung. Dies liegt daran, dass die Go-Sprache das Problem von Nullzeigern von vornherein vermeidet. Wenn Sie eine Variable deklarieren, wird sie standardmäßig auf einen Nullwert und nicht auf einen Nullzeiger initialisiert. Gleichzeitig bietet die Go-Sprache auch einen umfassenden Mechanismus zur Fehlerbehandlung, z. B. die Verwendung mehrerer Rückgabewerte zur Rückgabe von Fehlerinformationen und die Verwendung von „Defer“ und „Panic/Recover“ zur Behandlung von Ausnahmen. Diese Funktionen ermöglichen es der Go-Sprache, potenzielle Nullzeigerfehler während der Kompilierungsphase zu erkennen und eine sicherere und zuverlässigere Programmierumgebung bereitzustellen. Daher treten in der Go-Sprache keine Kompilierungsfehler auf, die der „Null-PTR-Dereferenzierung“ ähneln.

Frageninhalt

Ein Kollege hat null ptr in go dereferenziert.

Ich schlage vor, dass er tut, was ich tue – wenn ich in anderen Sprachen arbeite, neige ich dazu, die Warnstufe zu erhöhen und Warnungen in Fehler umzuwandeln. c# zum Beispiel, was bedeutet, dass ich diesen Code nicht kompilieren kann:

private static string bad_deref(object? object)
{
    return object.tostring();
}
Nach dem Login kopieren

Weil ich es verstehe

x.cs(y,z): [CS8602] Dereference of a possibly null reference.
Nach dem Login kopieren

Um es klar zu sagen: Das ist ziemlich gut.

Aber er sagte mir, dass es für Go keine Warnstufe gibt, und beim Googeln schien er Recht zu haben.

Wie kann man dieses Problem in Go lösen? Sind wir wieder beim alten C-Ratschlag „Gute Programmierer machen keine Fehler“ und wenn man nicht mit perfekten Leuten arbeitet, kommt es manchmal zu Null-PTR-Dereferenzierungen?

Problemumgehung

Das ist richtig: Sie können keinen Compilerfehler verursachen, indem Sie einen Zeiger dereferenzieren, ohne den nil-Fall zu berücksichtigen. Das liegt daran, dass die Sprachspezifikation dies zulässt. Dagegen kann man nichts machen.

Sie können in jeder Sprache falschen/falschen Code schreiben. Die Möglichkeit, Fehler frühzeitig zu erkennen oder zu mildern, besteht darin, Tests in fast jeder Sprache zu schreiben.

Go verfügt über ein großartiges goTest-Framework, das in das -Tool selbst integriert ist. Das sollten Sie unbedingt nutzen. Schreiben Sie Tests unterwegs. Go-Tests sollten regelmäßig durchgeführt werden, sie laufen automatisch während CI/CD und vor Veröffentlichungen. Die meisten IDEs führen auch gespeicherte Tests automatisch aus.

Ein weiterer Trick, den Sie verwenden können: Wenn nil 指针没有意义,请编写一个使用非指针类型的 API。当然这有其缺点(有时指针是必须的);如果使用指针更有意义,请使用它,但检查 nil 值,并正确处理它们(例如返回 error,如果有意义则恐慌等)。还要编写测试来使用 nil Zeiger keinen Sinn ergeben, schreiben Sie eine API, die Nicht-Zeigertypen verwendet. Natürlich hat dies seine Nachteile (manchmal sind Zeiger notwendig); wenn die Verwendung eines Zeigers sinnvoller ist, verwenden Sie ihn, aber prüfen Sie, ob

Werte vorhanden sind, und behandeln Sie diese ordnungsgemäß (z. B. error zurückgeben oder Panik, wenn dies der Fall ist). macht Sinn, warten). Schreiben Sie auch Tests zum Testen mit 🎜 Zeigerwerten. 🎜

Das obige ist der detaillierte Inhalt vonKönnte bei einer potenziellen Null-PTR-Dereferenzierung in Go ein Kompilierungsfehler auftreten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
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