Heim > Backend-Entwicklung > Golang > Wie können wir in Go zwischen explizit festgelegten und standardmäßig initialisierten Strukturfeldern unterscheiden?

Wie können wir in Go zwischen explizit festgelegten und standardmäßig initialisierten Strukturfeldern unterscheiden?

Patricia Arquette
Freigeben: 2024-12-18 15:00:18
Original
502 Leute haben es durchsucht

How Can We Distinguish Between Explicitly Set and Default-Initialized Struct Fields in Go?

Standardwerte für Strukturfelder

Go initialisiert Strukturfelder mit Standardwerten basierend auf ihrem Datentyp. Ganzzahlige Felder werden beispielsweise auf 0 initialisiert. Dieser Standardwert kann jedoch manchmal ein gültiger Wert sein, was es schwierig macht, zwischen Feldern zu unterscheiden, die nicht explizit festgelegt wurden, und solchen, die standardmäßig initialisiert wurden.

Beispiel:

type test struct {
    testIntOne int
    testIntTwo int
}

func main() {
    s := test{testIntOne: 0} // Initializes testIntOne to 0

    // How can we determine whether testIntOne has been set explicitly or initialized to 0?
}
Nach dem Login kopieren

Unfähigkeit zu unterscheiden Werte

Leider verfügt Go über keine integrierte Möglichkeit, zwischen nicht initialisierten Feldern und Feldern zu unterscheiden, die auf einen Standardwert initialisiert wurden.

Lösungen:

Um dieses Problem zu lösen, ziehen Sie mehrere Alternativen in Betracht Ansätze:

1. Verwendung von Zeigern

Zeiger haben einen Nullwert Null, der sich von 0 unterscheidet. Durch die Initialisierung von Zeigerfeldern können wir leicht überprüfen, ob sie gesetzt wurden.

type test struct {
    testIntOne *int
    testIntTwo *int
}

func main() {
    s := test{testIntOne: new(int)} // new() возвращает указатель, инициализированный до нуля

    fmt.Println("testIntOne set:", s.testIntOne != nil) // Выведет true, так как testIntOne инициализирован
    fmt.Println("testIntTwo set:", s.testIntTwo != nil) // Выведет false, так как testIntTwo не инициализирован
}
Nach dem Login kopieren

2 . Verwenden von Methoden

Sie können auch Methoden verwenden, um die Initialisierung von Feldern zu steuern. In diesem Fall können wir verfolgen, ob ein Flag gesetzt wurde, das angibt, ob das Feld manuell initialisiert wurde.

type test struct {
    testIntOne int
    testIntTwo int

    oneSet, twoSet bool // Флаги для отслеживания инициализации
}

func (t *test) SetOne(i int) {
    t.testIntOne, t.oneSet = i, true // Установка поля и флага
}

func (t *test) SetTwo(i int) {
    t.testIntTwo, t.twoSet = i, true // Установка поля и флага
}

func main() {
    s := test{}
    s.SetOne(0) // Вызов метода для инициализации

    fmt.Println("testIntOne set:", s.oneSet) // Выведет true
    fmt.Println("testIntTwo set:", s.twoSet) // Выведет false
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie können wir in Go zwischen explizit festgelegten und standardmäßig initialisierten Strukturfeldern unterscheiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage