言語メモに移動
ビギナーノート、間違いはご容赦ください。学習が深まるにつれて充実し、更新されます。
特徴
簡潔、高速、安全
並列、興味深い、オープンソース
メモリ管理、アレイセキュリティ、高速コンパイル
主な特徴
自動ガベージコレクション
より豊富な組み込み型
関数の複数の戻り値
エラー処理
匿名関数とクロージャ
タイプとインターフェイス
並行プログラミング
リフレクション
言語の対話性
言語の使用法
Webサーバー、ストレージクラスター、または同様の目的を備えた巨大な中央サーバーで使用されるシステムプログラミング言語。
大規模な並列サポートを提供し、ゲームサーバーの開発に適しています。
プログラムを実行する
プログラムの基本構成
package main //包声明
import "fmt" //引入包
func main() {
//函数
// 注释 /* 第一个简单的程序 */
fmt.Println("Hello, World!")
//变量
//语句 & 表达式
}
'{'は1行にすることはできません。
プログラムを実行する方法は2つあります
- filename.goを実行します
- go
buildfilename.goはバイナリファイルfilename./filenameを生成します
バッグについて
ファイル名はパッケージ名に直接関係しておらず、ファイル名とパッケージ名は同じである必要はありません。
フォルダ名はパッケージ名に直接関連しておらず、一貫している必要はありません。
同じフォルダー内のファイルには、パッケージ名を1つだけ含めることができます。そうしないと、コンパイルエラーが報告されます。
データの種類
ブール型
正しいか間違っているか:
var b bool = true;
番号タイプ
整数型intおよび浮動小数点型float32、float64
文字列型
Go文字列は、1バイトで接続された
Go言語の文字列です。UTF-8エンコーディングは、Unicodeテキストを識別するために使用されます。
派生型
- ポインタ型(ポインタ)
- 配列型
- 構造体型(構造体)
- チャネルタイプ
- 関数タイプ
- スライスタイプ
- インターフェイスタイプ(インターフェイス)
- マップタイプ
文法
変数を宣言する
Go言語の変数名は、文字、数字、およびアンダースコアで構成されます。最初の文字を数字にすることはできません。
変数を宣言する一般的な形式は、varキーワードを使用することです。
識別子タイプでした
簡単な例
var a int //初期化されていない場合はゼロ値、boolゼロ値はfalse、stringは空の文字列
var b int = 32
var c、d int //複数の変数を宣言
varstr1 string =“ str”
e:= 10 // varを省略した場合、変数は新しく宣言する必要があり、関数本体にのみ表示できます
多変量宣言
同じタイプの複数の変数、非グローバル変数
var vname1、vname2、vname3タイプ
vname1、vname2、vname3 = v1、v2、v3
Pythonと同じように、宣言された型を表示する必要はなく、自動的に推測します
var vname1、vname2、vname3 = v1、v2、v3
:=の左側に表示される変数は、宣言されるべきではありません。宣言されていない場合、コンパイルエラーが発生します。
vname1、vname2、vname3:= v1、v2、v3
キーワードを因数分解するこの方法は、一般的にグローバル変数を宣言するために使用されます
var (
vname1 v_type1
vname2 v_type2
)
値型と参照型
int、float、bool、stringなどの基本的な型はすべて値型です。これらの型を使用する変数は、メモリに格納されている値を直接指します。
等号=を使用して、ある変数の値を次のように別の変数に割り当てます。i実際、iの値はメモリにコピーされます
(ディープコピーとして理解できます)
参照型変数r1は、r1の値が配置されているメモリアドレス(数値)、または
メモリアドレスの最初のワードの位置を格納します。このメモリアドレスはポインタと呼ばれ、このポインタは実際には別の値に格納されます。に
代入文r2 = r1を使用すると、参照(アドレス)のみがコピーされます。
r1の値が変更された場合、この値へのすべての参照は変更されたコンテンツを指します
(浅いコピーとして理解できます)
Pythonのように2つの変数の値を直接交換できます:
a、b = b、a
空白の識別子
空白の識別子_は、値を破棄するためにも使用されます。たとえば、値5は、_、b = 5、7で破棄されます。
_実際には書き込み専用変数であり、その値を取得することはできません。これは、宣言されたすべての変数をGo言語で使用する必要があるためですが、関数から取得したすべての戻り値を使用する必要がない場合もあります。
といった:
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
}
最終出力は2strです
関数が複数の戻り値を返す場合にも、並列割り当てが使用されます。たとえば、valとerror errは、Func1を同時に呼び出すことによって取得されます:val、err = Func1(var1)。
絶え間ない
一定の定義
定数の定義形式:
const識別子[タイプ] =値
[Type]は省略できます。コンパイラは、
明示的な型定義を自動的に推測します。constb string = "abc"
暗黙的な型定義:const b = "abc"
iota
特別な定数であるiotaは、コンパイラーが変更できる定数と見なすことができます。
constキーワードが表示されると(const内の最初の行の前)、iotaは0にリセットされ、constの定数宣言のすべての新しい行はiotaをカウントします(iotaはconstステートメントブロックの行インデックスとして理解できます)。
const (
a = iota
b = iota
c = iota
)
最初のiotaは0です。iotaが新しい行で使用されると、その値は自動的に1ずつ増加します。したがって、a = 0、b = 1、c = 2は次のように省略できます。
const (
a = iota
b
c
)
例:
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
}
左シフトの例:
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は、0から1を自動的に追加することを意味するため、i = 1 << 0、j = 3 << 1(<<は左にシフトすることを意味します)、つまり、i = 1、j = 6、これは問題ありません、キーkとlにある、出力結果からk = 3 << 2、l = 3 << 3。
単純に述べた:
i = 1:左に0ビットシフトし、1のまま変更しない;
j = 3:左に1ビットシフトしてバイナリ110、つまり6になる;
k = 3:左に2ビットシフトして次のようになるバイナリ1100、つまり12;
l = 3:左に3ビットシフトすると、バイナリでは11000、つまり24になります。
適合:<< n == *(2 ^ n)。
オペレーター
C ++に似ています(おそらくすべての言語が似ています):
ビット演算子
代入演算子
その他の演算子
条件文
if、if ... else、ネストしてswitchの場合、switch
ステートメントに似たselect selectステートメントがありますが、selectは実行可能なケースをランダムに実行します。実行するケースがない場合は、実行するケースがあるまでブロックされます。
Goには三項演算子がありません
ループステートメント
for、ネストされた
コントロールの場合:break、continue、goto