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)
	}
}