Gehen Sie Sprachnotizen
Anfängernotizen, bitte verzeihen Sie mir etwaige Fehler und werden durch die Vertiefung des Lernens bereichert und aktualisiert
Eigenschaften
Prägnant, schnell, sicher
Parallele, interessante Open-Source-
Speicherverwaltung, Array-Sicherheit, schnelle Kompilierung
Haupteigenschaften
Automatische Speicherbereinigung
Reichhaltigere integrierte Typen
Funktion Mehrere Rückgabewerte
Fehlerbehandlung
Anonyme Funktionen und Schließungen
Typen und Schnittstellen
Gleichzeitige Programmierung
Reflection
Language Interaktivität
Sprachgebrauch
Eine Systemprogrammiersprache, die in riesigen zentralen Servern verwendet wird, die mit Webservern, Speicherclustern oder ähnlichen Zwecken ausgestattet sind.
Bietet massive parallele Unterstützung und eignet sich für die Entwicklung von Spieleservern
Programm ausführen
Grundlegende Zusammensetzung des Programms
package main //包声明
import "fmt" //引入包
func main() {
//函数
// 注释 /* 第一个简单的程序 */
fmt.Println("Hello, World!")
//变量
//语句 & 表达式
}
Beachten Sie, dass '{' keine einzelne Zeile sein darf
Es gibt zwei Möglichkeiten, das Programm auszuführen
- Führen Sie filename.go aus
- go build
filename.go generiert den Dateinamen der Binärdatei ./filename
Über die Tasche
Der Dateiname steht nicht in direktem Zusammenhang mit dem Paketnamen, und der Dateiname und der Paketname müssen nicht identisch sein.
Der Ordnername steht nicht in direktem Zusammenhang mit dem Paketnamen und muss nicht konsistent sein.
Die Dateien im selben Ordner können nur einen Paketnamen haben, andernfalls wird der Kompilierungsfehler gemeldet.
Art der Daten
Boolescher Typ
richtig oder falsch:
var b bool = true;
Nummerntyp
Integer-Typ int und Gleitkomma-Typ float32, float64
Zeichenfolgentyp
Go-Zeichenfolge ist eine Zeichenfolge der
Go-Sprache, die durch ein einzelnes Byte verbunden ist. Die UTF-8-Codierung wird verwendet, um Unicode-Text zu identifizieren.
Abgeleiteter Typ
- Zeigertyp (Zeiger)
- Array-Typ
- Strukturierter Typ (Struktur)
- Kanaltyp
- Funktionsart
- Scheibentyp
- Schnittstellentyp (Schnittstelle)
- Kartentyp
Grammatik
Variable deklarieren
Variablennamen in der Sprache Go bestehen aus Buchstaben, Zahlen und Unterstrichen. Das erste Zeichen darf keine Zahl sein.
Die allgemeine Form der Deklaration von Variablen ist die Verwendung des Schlüsselworts var:
war Bezeichner Typ
Einfaches Beispiel
var a int // Wenn es nicht initialisiert wird, ist es der Wert Null, der Wert bool Null ist falsch, der String ist ein leerer String
var b int = 32
var c, d int // mehrere Variablen deklarieren
var str1 string = “str”
e: = 10 // Wenn var weggelassen wird, muss die Variable neu deklariert werden und kann nur im Funktionskörper erscheinen
Multivariate Deklaration
Mehrere Variablen desselben Typs, nicht globale Variablen
var vname1, vname2, vname3 Typ
vname1, vname2, vname3 = v1, v2, v3
Ähnlich wie bei Python muss der deklarierte Typ nicht angezeigt werden, sondern wird automatisch abgeleitet
var vname1, vname2, vname3 = v1, v2, v3
Variablen, die auf der linken Seite von: = angezeigt werden, sollten nicht deklariert worden sein, da dies sonst zu Kompilierungsfehlern führt
vname1, vname2, vname3: = v1, v2, v3
Diese Art des Faktorisierens von Schlüsselwörtern wird im Allgemeinen verwendet, um globale Variablen zu deklarieren
var (
vname1 v_type1
vname2 v_type2
)
Werttyp und Referenztyp
Alle Basistypen wie int, float, bool und string sind Werttypen. Variablen, die diese Typen verwenden, verweisen direkt auf den im Speicher gespeicherten Wert.
Verwenden Sie das Gleichheitszeichen =, um den Wert einer Variablen einer anderen Variablen zuzuweisen, z. B.: J = i Tatsächlich wird der Wert von i in den Speicher kopiert
(er kann als tiefe Kopie verstanden werden).
Eine Referenztypvariable r1 speichert die Speicheradresse (Nummer), an der sich der Wert von r1 befindet, oder die Position des ersten Wortes in der
Speicheradresse. Diese Speicheradresse wird als Zeiger bezeichnet, und dieser Zeiger wird tatsächlich in einem anderen Wert gespeichert im
Wenn die Zuweisungsanweisung r2 = r1 verwendet wird, wird nur die Referenz (Adresse) kopiert.
Wenn der Wert von r1 geändert wird, verweisen alle Verweise auf diesen Wert auf den geänderten Inhalt
(kann als flache Kopie verstanden werden).
Sie können die Werte zweier Variablen direkt wie bei Python austauschen:
a, b = b, a
Leere Kennung
Der leere Bezeichner _ wird auch zum Verwerfen von Werten verwendet. Beispielsweise wird der Wert 5 verworfen in: _, b = 5, 7.
_ Ist eigentlich eine schreibgeschützte Variable und ihr Wert kann nicht erhalten werden. Dies liegt daran, dass alle deklarierten Variablen in der Sprache Go verwendet werden müssen. Manchmal ist es jedoch nicht erforderlich, alle von einer Funktion erhaltenen Rückgabewerte zu verwenden.
sowie:
package main
import "fmt"
func main() {
_,numb,strs := numbers() //只获取函数返回值的后两个
fmt.Println(numb,strs)
}
//一个可以返回多个值的函数
func numbers()(int,int,string){
a , b , c := 1 , 2 , "str"
return a,b,c
}
Die endgültige Ausgabe ist 2 str
Die parallele Zuweisung wird auch verwendet, wenn eine Funktion mehrere Rückgabewerte zurückgibt. Beispielsweise werden val und error err durch gleichzeitiges Aufrufen von Func1 erhalten: val, err = Func1 (var1).
Konstante
Konstante Definition
Das Definitionsformat von Konstanten:
const bezeichner [typ] = wert
[Typ] kann weggelassen werden, der Compiler leitet automatisch die
explizite Typdefinition ab: const b string = "abc" die
implizite Typdefinition: const b = "abc"
Jota
iota, eine spezielle Konstante, kann als Konstante betrachtet werden, die vom Compiler geändert werden kann.
iota wird auf 0 zurückgesetzt, wenn das Schlüsselwort const angezeigt wird (vor der ersten Zeile innerhalb von const), und jede neue Zeile der Konstantendeklaration in const zählt iota (iota kann als Zeilenindex im const-Anweisungsblock verstanden werden).
const (
a = iota
b = iota
c = iota
)
Das erste Jota ist gleich 0. Immer wenn Iota in einer neuen Zeile verwendet wird, wird sein Wert automatisch um 1 erhöht, sodass a = 0, b = 1, c = 2 wie folgt abgekürzt werden kann:
const (
a = iota
b
c
)
Beispiele:
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //独立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢复计数
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
// 0 1 2 ha ha 100 100 7 8
}
Beispiel für eine Verschiebung nach links:
package main
import "fmt"
const (
i=1<<iota
j=3<<iota
k
l
)
func main() {
fmt.Println(i,j,k,l)
// 1 6 12 24
}
iota bedeutet, automatisch 1 von 0 zu addieren, also i = 1 << 0, j = 3 << 1 (<< bedeutet Verschiebung nach links), dh: i = 1, j = 6, das ist kein Problem, der Schlüssel liegt in k und l, k = 3 << 2, l = 3 << 3 aus dem Ausgabeergebnis.
Einfach ausgedrückt:
i = 1: um 0 Bits nach links verschieben und unverändert als 1 bleiben;
j = 3: um 1 Bit nach links verschieben und binär 110 werden, was 6 ist;
k = 3: um 2 Bits nach links verschieben und werden binär 1100, was 12 ist;
l = 3: Verschiebung um 3 Bits nach links, es wird 11000 in binär, dh 24.
注 : << n == * (2 ^ n)。
Operator
Ähnlich wie C ++ (möglicherweise sind alle Sprachen ähnlich):
Bitweiser Operator
Aufgabenverwalter
Andere Betreiber
Bedingte Anweisungen
Zusätzlich zu if, if ... else, wenn verschachtelt und gewechselt wird, gibt es eine select
select-Anweisung, die einer switch-Anweisung ähnelt, aber select führt einen ausführbaren Fall nach dem Zufallsprinzip aus. Wenn kein Fall ausgeführt werden muss, wird er blockiert, bis ein Fall ausgeführt werden muss.
Go hat keinen ternären Operator
Schleifenanweisung
für, für verschachtelte
Kontrolle: brechen, fortfahren, gehen