go言語の要旨
14093 ワード
1.インストール
1.1本体ソフトウェア
macでbrew install goを使用してインストールします.また、Go 1.11以降、go moduleパッケージ依存管理ツールが公式にサポートされていることがわかります(https://www.cnblogs.com/sage-blog/p/10640947.html)が追加され、GOPROXY環境変数が追加されました.ソースコードをダウンロードすると、この環境変数で設定されたプロキシアドレスが、以前のコードライブラリから直接ダウンロードされなくなります.goproxy.ioというオープンソースプロジェクトは私たちが望んでいることを実現してくれました.このプロジェクトでは、開発者が独自のGOPROXYエージェントサービスをワンタッチで構築できます.また、共通のエージェントサービスも提供されていますhttps://goproxy.ioこの環境変数を設定するだけで、壁のソースパッケージを正常にダウンロードできます.# Go Modules
export GO111MODULE=on
# GOPROXY
export GOPROXY=https://goproxy.io
1.2 jupyterとのインタラクション
参照https://github.com/gopherdata/gophernotes、macでのインストールコマンドはenv GO111MODULE=on go get github.com/gopherdata/gophernotes
mkdir -p ~/Library/Jupyter/kernels/gophernotes
cd ~/Library/Jupyter/kernels/gophernotes
cp "$(go env GOPATH)"/pkg/mod/github.com/gopherdata/[email protected]/kernel/* "."
chmod +w ./kernel.json # in case copied kernel.json has no write permission
sed "s|gophernotes|$(go env GOPATH)/bin/gophernotes|" < kernel.json.in > kernel.json
インストールが完了したら、jupyter notebookを開くとgoコアが追加されます.
1.3プログラミング仕様
pythonと同様に、Goはフォーマットにこだわっており、関数の最初の{必ず関数体と一緒にいなければならない.フォーマットを制御できるパッケージは以下の通りです.
# Go Modules
export GO111MODULE=on
# GOPROXY
export GOPROXY=https://goproxy.io
env GO111MODULE=on go get github.com/gopherdata/gophernotes
mkdir -p ~/Library/Jupyter/kernels/gophernotes
cd ~/Library/Jupyter/kernels/gophernotes
cp "$(go env GOPATH)"/pkg/mod/github.com/gopherdata/[email protected]/kernel/* "."
chmod +w ./kernel.json # in case copied kernel.json has no write permission
sed "s|gophernotes|$(go env GOPATH)/bin/gophernotes|" < kernel.json.in > kernel.json
1.4運転
go getを使用してgithubのパッケージをインストールします.-Dはダウンロードのみでインストールしないことを示します.go installを使用してsrcのソースファイルを$GOBINフォルダにインストールします.ソースファイルはgo buildコンパイル、go runを使用して実行されます.直接go run XXも可能です.go運転、あまり便利ではありません.
2.データ型
2.1基本タイプ
Goは静的言語で、データ型はbool、string、int、float 32、float 64、[](配列)を含む.Goの変数宣言後、デフォルトは「ゼロ値」に初期化されます.注意pythonとは異なり、文字列は単一引用符では使用できません.逆引用符`を使用する場合は、エスケープする必要はありません.
2.2配列/スライス/辞書
2.3定数/変数、宣言/付与、役割ドメイン
定数をconstで宣言します.変数を定義する方法:
var s string
var s string = "hello"
var s = "hello" //
s := "hello" // + var , 。
ブロックを使用して役割ドメインを示し、{}を使用します.ファイル自体はブロックです.外部ブロックは内部ブロックにアクセスできます.Goはpackage mainのmain関数からデフォルトで行われます.
2.4構造体
定義:type xx struct{key 1 string,key 2 int}使用:m:=xx{key 1:value 1 key 2:value 2}またはm:=xx{value 1,value 2}構造体を後の方法と組み合わせてクラスをシミュレートできます.
3.関数とインタフェース
3.1ポインタ
Javaと大同小異:
3.2関数
func XX( ) ( ){
return
}
入力ボックスでは、任意の数の変数を...で表すことができます.
Goでは、関数名を変数として前に置くことができます.
XX:=func ( ) ( ){
return
}
すなわちfunc(入力フォーマット)(出力フォーマット)をデータ型として転送することができ、後に()を付けるとjavaのインライン関数によく似た関数変数を1回実行することができる.
3.3方法
方法は関数によく似ていますが、受信者が1人増えただけです.このように定義するのは,オブジェクト向けのクラスをシミュレートするためにtypeとメソッドを用いてクラスをシミュレートできるためである.メソッド定義:func(m*Movie)summary(xxint)string{}呼び出し:m:=Movie{...}m.summary()
3.4インタフェース
インタフェース定義:type XX interface{PowerOn()string}は、インタフェース名、実装する方法などを定義します.そして関数にはimplementキーワードがないので、インタフェースを実装するときにimplementが誰なのか分からないので、コメントして説明したほうがいいです.
4.制御文
numbers := []int{1,2,3,4}
for i,n := range numbers{
fmt.Println(n)
}
for { , }
5.読み書き/テスト/ログ/例外/ステーションの構築
package main
import "net/http"
func hello(w http.ResponseWriter, r *http.Request){
w.Write([]byte("Hello world"))
}
func main(){
http.HandleFunc("/",hello)
http.ListenAndServe(":8000",nil)
}
6.同時およびチャネル
//select
select {
case chan1:
// chan1 , case
case chan2 1:
// chan2 , case
case time.After(5*time.Second):
// , default 。 default
次に例を示します
func showfunc(c chan string){
t := time.NewTicker(time.Second*2)
for {
c "function finished"
t.C
}
}
func main(){
c:=make(chan string)
stop:=make(chan bool)
go showfunc(c)
go func() {time.Sleep(time.Second*4);stop true}() //
fmt.Println("start immediately")
for {
select{
case stop:
return
case msg := c:
fmt.Println(msg)
}
}
}
main()