go言語ノート


varは変数、typeはタイプを表します

type person struct {
name string
age int
}
var P person//Pは今personタイプの変数です
P.name="Astaxie"//Pのname属性に"Astaxie"を付与.
P.age=25//変数Pに「25」を付与するage属性
fmt.Printf(「The person's name is%s」,P.name)/Pのname属性へのアクセス
このようなPの宣言の使用に加えて、2つの宣言の使用方法がある.初期化値P:=person{"Tom",25}2を順に与える.field:valueで初期化することで、任意の順序でP:=person{age:24,name:"Tom"}

array

arrayは配列であり、その定義方法は以下の通りである.
var arr [n]type
配列は、a:=[3]int{1,2,3}//長さ3のint配列b:=[10]int{1,2,3}//長さ10のint配列を宣言するために使用できます.最初の3つの要素は1,2,3に初期化され、その他のデフォルトは0です.
c := [...]int{4,5,6}//長さを省略して`...`のように、Goは自動的に要素の個数によって長さを計算します
長さも配列タイプの一部であるため、[3]intと[4]intは異なるタイプであり、配列も長さを変えることはできない.配列間の付与は値の付与であり、すなわち、1つの配列をパラメータとして関数に渡すと、そのポインタではなく、その配列のコピーが伝達される.指を使うなら
針、では後述のsliceタイプを使う必要があります.

slice


sliceは本当の意味での動的配列ではなく、参照タイプです.sliceは常に最下位のarrayを指しており、sliceの声明も
arrayと同じですが、長さは必要ありません.
slice(スライス)は参照タイプなので、参照が要素の値を変更すると、他のすべての参照が値を変更します.
append関数は、sliceが参照する配列の内容を変更し、同じ配列を参照する他のsliceに影響します. 

map


定義方法:
1. //  map
var m1 map[string]string
//  make nil map,nil map 
m1 = make(map[string]string)
//  map 
m1["a"] = "aa"
m1["b"] = "bb"

2. //  
m2 := make(map[string]string)
//  
m2["a"] = "aa"
m2["b"] = "bb"

3. //   +  
m3 := map[string]string{
	"a": "aa",
	"b": "bb",
}

次の操作を行います.
// ==========================================
//  
if v, ok := m1["a"]; ok {
	fmt.Println(v)
} else {
	fmt.Println("Key Not Found")
}

//  map
for k, v := range m1 {
	fmt.Println(k, v)
}

mapも参照タイプであり、2つのmapが同時に1つの下位層を指す場合、1つは変化し、もう1つはそれに応じて変化する.
m := make(map[string]string)m["Hello"] = "Bonjour"m1 := m
m 1[「Hello」=「Salut」//現在m[「hello」]の値はSalut

make、new操作


makeは、組み込みタイプ(map、slice、channel)のメモリ割り当てに使用されます.newは様々なタイプのメモリ分割に使用されます

値と針を伝える

呼び出された関数にパラメータ値を渡すと、実際にはこの値のcopyが渡され、呼び出された関数でパラメータ値を変更すると、
呼び出し関数の対応する実パラメータは、数値の変化がcopyにのみ作用するため、何も変化しません.
ポインタにはどんなメリットがありますか?1ポインタは、複数の関数が同じオブジェクトを操作できるようにします.2ポインタは軽量級(8 bytes)で、メモリアドレスだけで、ボリュームの大きい構造体をポインタで伝えることができます.パラメータ値で渡すと、copyのたびに比較的多くのシステムオーバーヘッド(メモリと時間)がかかります.大きな構造体を伝えるときは、ポインタを使うのが賢明です.3 Go言語ではstring,slice,mapの3種類の実装メカニズムがポインタに似ているので,アドレスを取って渡すのではなく,直接伝えることができる.
針.(注:関数がsliceの長さを変更する必要がある場合は、アドレス転送ポインタを取る必要があります)

import


いくつかの特殊なimportは、多くの初心者を困惑させています.次に、いったいどういうことなのかを説明します.
1.ポイント操作
パッケージをインポートする方法を見ることがあります
import(
. "fmt"
)
この点の操作の意味は、このパケットをインポートした後、このパケットの関数を呼び出すときに、プレフィックスのパケット名を省略することができます.つまり、前に調整することができます.
使用するfmt.Println(「hello world」)は省略可能にPrintln(「hello world」)と書く.
2.別名アクション
別名操作はその名の通り、私たちが覚えやすい名前にパッケージを命名することができます.
import(
f "fmt"
)
別名操作ではパケット関数を呼び出すと接頭辞が私たちの接頭辞、すなわちf.Println(「hello world」)になります.
3. _操作
この操作は多くの人に難解なオペレータですが、次のimportを見てください.
import (
"database/sql"
_ "github.com/ziutek/mymysql/godrv"
)
_操作は、パッケージ内の関数を直接使用するのではなく、パッケージ内のinit関数を呼び出すためにパッケージを導入します.

interface変数格納タイプ


Interfaceの変数には任意のタイプの数値を格納できることを知っています(このタイプはinterfaceを実現しています).では、この変数に実際に保存されているオブジェクトのタイプをどのように逆方向に知るのでしょうか.現在よく使われている方法は2つあります.
Comma-ok断言

goroutine


runtime.Gosched()は,CPUにタイムスライスを他の人に譲ってもらい,次のいずれかの時点でgoroutineの実行を再開することを示す.
デフォルトでは、スケジューラは単一スレッドのみを使用します.つまり、同時実行のみが実現されます.マルチコアプロセッサの並列性を発揮するには,我々のプログラムに表示される呼び出しruntimeが必要である.GOMAXPROCS(n)は、スケジューラに複数のスレッドを同時に使用するように伝えます.GOMAXPROCSは、論理コードを同時に実行するシステムスレッドの最大数を設定し、前の設定を返します.n<1の場合、現在の設定は変更されません.その後、Goの新しいバージョンでスケジュールが改善されると、これは削除されます.

channel


デフォルトでは、channelの受信および送信データは、他端が準備されていない限りブロックされます.これにより、Goroutines同期は、明示的なlockを必要とせずにより簡単になります.ブロックとは、つまり読み出し(value:=

runtime goroutine


runtimeパッケージにはgoroutineを処理する関数がいくつかあります.
Goexitは現在実行されているgoroutineを終了しますが、defer関数はGoschedを呼び出し続け、現在のgoroutineの実行権限を譲り、スケジューラは他の待機しているタスクの実行を手配し、次のいずれかの時点でその場所から実行を再開します.NumCPU返却CPUコア数NumGoroutine実行中およびキュー中のタスク総数GOMAXPROCS実行可能なCPUコア数を設定する
一般的に作成されているhttpサーバとは異なり、Goは高同時性と高パフォーマンスを実現するために、connの読み書きイベントを処理するためにgoroutinesを使用しています.
このリクエストは独立したままで、互いにブロックされず、ネットワークイベントに効率的に応答できます.これはGoの効率的な保証です.
クッキーには時間の制限があり、ライフサイクルによって2つに分けられます.セッションクッキーと持続クッキーです.有効期限を設定しない場合は、このクッキーのライフサイクルは作成からブラウザの閉じるまでであり、ブラウザウィンドウを閉じるだけでクッキーは消えます.このライフサイクルをブラウズセッション期間とするクッキーをセッションクッキーと呼ぶ.セッションクッキーは、一般的にハードディスク(HDD)に保存されず、メモリに保存されます.有効期限(setMaxAge(60606024))が設定されている場合、ブラウザはクッキーをハードディスクに保存し、閉じてから再度ブラウザを開きます.これらのクッキーは設定された有効期限を超えるまで有効です.ハードディスク(HDD)に格納されたクッキーは、2つのIEウィンドウなど、異なるブラウザプロセス間で共有できます.
口.メモリに保存されているクッキーについては、ブラウザによって処理方法が異なります.
Go設定cookieGo言語ではnet/httpパッケージのSetCookieによって設定されます.
http.SetCookie(w ResponseWriter, cookie *Cookie)