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? }
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 не инициализирован }
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 }
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!