Go言語いじる
C言語わからないけどLLだけじゃなくてネイティブなものに触れておくべきだと思ったので
Goプログラミング言語のチュートリアル - Google's Go Guide
実践Go言語 - Google's Go Guide
Google Go登場の背景 - @IT
GoはPythonより遅い!というベンチマーク結果、どこで読んだか忘れたが、完成度が高くないGoのライブラリで泥臭く書いたアルゴリズムと、Pythonのmultiproccessingモジュールなどで超最適化して比較したらそりゃPythonは早いわ、という話だったらしい
初期の実行速度は散々だったらしいが、最近ではそれも解決されつつあるらしく、でもまあ色々バギーだからそこらへんどうにかしてね!みたいな感じ
あとでエストスネテスの篩かいてベンチとる。とりあえず基本文法覚えるのに適当に書いてみた。
なんか日本語変数とか使えた。
package main import ( "os" "time" "fmt" ) //const宣言 const eol= "\n" //構造体 type T struct { a, b int } //関数定義 func p(s string){ os.Stdout.WriteString(s+eol) } //return func sum(a []int) int { // intを返す s := 0 for i := 0; i < len(a); i++ { s += a[i] } return s } //複数の返り値 func swap(a int,b int) (int,int) { // intを返す return b,a } //switch case func shouldEven(c int) bool { switch c % 10 { case 0, 2, 4, 6, 8: return true } return false } //goroutine func goch (g func (int ) int) chan int { ch := make(chan int); go func (){ for i := 0; ; i++ { //無限ループ ch <-g(i); //受け取った関数をgoroutine内で実行 } }(); return ch; } //package main なら自動的に呼ばれる func main() { start := time.Nanoseconds() //代入 greeding := "Hello" //内部仕様がUTF-8なので日本語の変数が使える 日本語 :="日本語\n" print(日本語) //ポインタ var o *string = &greeding // ポインタの参照 p("ポインタ *o "+(*o)) *o = "ciao" p("greeding:"+greeding ) //配列 var arrint [3]int // 配列のスライス fmt.Printf("sum([]int{1,2,3}) == %d\n", sum([]int{1,2,3})) // fmt.Printf("%d\n", sum(&[...]int{1,2,3})) //でもいい [...]は配列長をコンパイラが測る //Map型 m := map[string]int{"one":1 , "two":2} fmt.Printf("map: %d\n",m["one"]) // 構造体 t := new(T) t.a = 3 // if 文 if t.b == 0 { fmt.Printf("t.a == %d\n",t.a) } // for 文 for i:=0 ; i<len(arrint); i++ { p((*o)) greeding = greeding+"o" arrint[i] = i*i+1 } // range pythonの for n,i in enumerate(arrint)のようなものか for n, i := range arrint { fmt.Printf("arr[%d] = %d \n",n,i) } fmt.Printf("sum(&arrint) == %d \n", sum(&arrint)) // 複数代入 arrint[len(arrint)-1],arrint[0] = arrint[0],arrint[len(arrint)-1] // arrint[len(arrint)-1],arrint[0] = swap(arrint[0],arrint[len(arrint)-1]) for i := range arrint{ fmt.Printf("[%d]:%d \n",i,arrint[i]) } //goroutine g1 :=func(i int) int{ even := i*2; fmt.Printf ("[e:%d]",even); //偶数のプリント return even }; stream1 := goch(g1); g2 := func(i int) int{ odd := i*2+1; fmt.Printf ("[o:%d]",odd); //奇数のプリント return odd }; stream2 :=goch(g2); for i:=0; i <= 20;i++ { println(<-stream1,"\t",<-stream2); //goroutineから返された値をプリント }; // ExecTime if shouldEven(12002002){ fmt.Printf("ExecTime: %d%s", (time.Nanoseconds() - start),eol) } }