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はフォーマットにこだわっており、関数の最初の{必ず関数体と一緒にいなければならない.フォーマットを制御できるパッケージは以下の通りです.
  • gofmt-wコマンドを使用してgoファイルを標準化
  • golintで修正アドバイス
  • godocで文書を生成
  • 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とは異なり、文字列は単一引用符では使用できません.逆引用符`を使用する場合は、エスケープする必要はありません.
  • reflectパケットを使用してデータ型、reflectを表示する.TypeOf()
  • strconvパッケージを使用するタイプ変換、strconv.ParseBool(), strconv.FormatBool…

  • 2.2配列/スライス/辞書

  • 配列、固定サイズ、一般使用:var xx[2]string;xx := []int{1,2,3,4};xx := [6]int{1,2,3,4}
  • スライス、サイズはヒントのみ、随時追加可能:var xx=make([]string,2)xx=append(xx,value)
  • 配列とスライスコピー、使用:copy(to,from)
  • 辞書、make(map…)、複雑なデータ構造はすべてmakeキーワードxx:=make(map[string]int)deleteで配列要素を削除する:detele(xx,key)
  • 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.制御文

  • 条件文:if x{}else{}で、else ifを続けられる
  • ループ文1,古典forループ:for i:=0;i<10;i++{}
  • ループ文2 rangeを使うとpythonのenumerateに似ています:
  • numbers := []int{1,2,3,4}
    for i,n := range numbers{
        fmt.Println(n)
    }
    
  • while文がなくforで代用
  • for {}
    
  • defer:関数の実行が完了するとdefer文が実行され、ネットワーク接続のシャットダウンやファイルのシャットダウンなどの作業に役立ちます.

  • 5.読み書き/テスト/ログ/例外/ステーションの構築

  • ファイルの読み書き:io/ioutilを使用しています.注意:読み書きbufferをキャッシュします.Bytesは文字を処理しstringの+とappendメソッドを直接使用するのが速い(benchmarkテストを使用可能).
  • json:encoding/jsonパッケージでjsonフィールドを処理
  • 正規表現:regexpパッケージ
  • 異常処理:errorsを使用し、そのインタフェース定義:type error interface{Error()string}fmt.Errorfがエラーをフォーマット出力する
  • ログ:log、logを使用する.Printf、log.Fatal….通常は標準出力に直接印刷し、プログラム外で処理します.標準入力0;標準出力1;標準エラー2
  • コマンドラインパラメータ取得:range osを使用.Argsはすべてのパラメータを取得します.あるいはflagを使います.String(パラメータ名、デフォルト値、プロンプト)定義、flagを使用します.Parse()解析は、*パラメータ名を使用して値を取得します.
  • テスト:testingを使用します.ここを参考にしてください.いくつかのキー:(1)xx_を使用test.go名前付きテストファイル;(2)import「testing」を導入する.(3)テスト関数はTestで始まる.2種類のテストがあり、tはユニットテストを表し、bは基準テストを表す.-benchを使用してベンチマークテストを実行し、-coverを使用してオーバーライド率をレポートします.
  • ステーション建設:net/httpパッケージ使用、以下例:
  • 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.同時およびチャネル

  • 関数の前にgoを1つ加えるとコンカレントがトリガーされ、一般的にチャネルchanとともに実行される.チャネル定義方法:c:=make(chan string).チャネルがパラメータである場合:
  • チャネル受信メッセージ:c
  • 高度な使い方:select case文で最初に到達した文を実行でき、実行後すぐにブロックを解除する.timeを使う.After設定タイムアウト、形式:
  • //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()