今回のGo言語は、コマンドラインで上限数値の入力を実現してみました。
初心者が故に戸惑いポイントは、コマンドラインからの受け取った値は、文字列の型になってしまい、数値に変換しなければいけないのだが、GO言語のライブラリをそれに合ったものに切り替えなければいけないのが少しめんどくさかった。
インタプリタ言語に慣れすぎたせいなのか?
改めてC言語をもっとやりこんでからGOをした方がいいのかもしれないね。
ソースコード
package main
import (
"fmt"
"os"
"strconv"
)
func getPrimeNumber(num int) int{
flg := 0
for i:=2; i<num-1; i++ {
if (num % i == 0){
flg = i
break
}
}
return flg
}
func main(){
max , _ := strconv.Atoi(os.Args[1])
nums := []int{}
for i:=2; i<=max; i++{
res := getPrimeNumber(i)
if (res == 0){
nums = append(nums , i)
}
}
fmt.Println(nums)
}
実行
$ time go run prime_number.go 100
[2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]
real 0m0.208s
user 0m0.119s
sys 0m0.067s
負荷計測(非コンパイル)
100 : 0.208s
1000 : 0.211s
10000 : 0.279s
100000 : 4.077s
1000000 : 5m24.402s
コンパイルした版
$ go build prime_number.go
$ ./prime_number 100
100 : 0.008s
1000 : 0.010s
10000 : 0.066s
100000 : 3.784s
1000000 : 5m24.712s
コンパイルしても全然速くない!!!
C言語の方が速い!!!
とりあえず、こんな事がわかりました。
実験した環境はMacBookPro2016latorです。
core i7なので、そんなに悪くないんだけどな・・・
言わずもがな、言語の限界でしょうね。
解説
コマンドラインからの値の受け取り
”111”という文字列を受け取れる。※この際111は数値なのだが、文字列で受け取られる事を忘れると型エラーが出るので要注意
$ go run hoge.go 111
import "os"
os.Args[1]
> 111 (string)
文字列から数値に型変換
strconvをimportして、Atoi関数で変換できるが、受け取り側の”_”は、nilを入れ込む器が必要なので、忘れないように。
※入れないとエラーになります。
import "strconv"
hoge , _ := strconv.Atoi(*文字列*)
変数の型を確認する
reflectライブラリで型を確認することができます。
import "reflect"
refrect.TypeOf(*変数*)
配列操作まとめ
# 整数のみの配列定義
num := []int{}
# 文字列のみの配列定義
str := []string{}
# 型の混合定義
value := []interface{}
# 配列の追加
num := []int{1 , 10}
num = append(num , 100);
> [1 , 10 , 100]
# 要素数を数える
len(num)
# 配列のデータをクリアする
num = nil
リンク
色々なプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿