Go language part 1

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2013/10/10(木) 12:04:51.78
Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。
2016/01/25(月) 01:16:17.48ID:MxjMVzG6
>>487
バージョンは1.5
コードは俺のが遅いのかまともに書いてる人のでも遅いのかが気になってるだけだから載せるまでもないかなと思ってる
2016/01/25(月) 01:48:00.41ID:11Jcfjfr
$ ruby --version
ruby 2.2.3p173 (2015-08-18) [i386-linux-gnu]
$ time { ruby -e 'require "prime";print Prime.take(10000)' > /dev/null; }
real 0m0.405s
user 0m0.400s
sys 0m0.008s

↓このコードをローカルにコピーして、

http://play.golang.org/p/XXiTIpRBAu

const N = 104740 に変更してビルド・実行。

$ go version
go version devel +4f40182 Sat Jan 23 01:28:06 2016 +0000 linux/386
$ go build prime.go
$ time { ./prime > /dev/null; }
real 0m0.064s
user 0m0.048s
sys 0m0.016s
2016/01/25(月) 02:28:15.33ID:MxjMVzG6
>>489 thx
それぐらいの桁数だと自分の環境でもgoのコードのが速いんだけど、桁数増えると圧倒的に負けるようになる
というかgoが時間かかりすぎる
104700000が素数かどうかの判定の時点ですでに負けてる
$ go version
go version go1.5.1 darwin/amd64
$ time ./prime
(結果略)
0.38s user 0.01s system 98% cpu 0.395 total

$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]
$ time tuby -e 'require "prime"; p 104700000.prime?'
(結果略)
0.13s user 0.09s system 86% cpu 0.254 total

goコード: http://play.golang.org/p/1y7lrBML1-
2016/01/25(月) 08:54:26.29ID:11Jcfjfr
そんなに遅いかな?

x86_64 環境で Prime.take(10000000) をやってみたんだけど(10^7)、

$ ruby --version
ruby 2.2.3p173 (2015-08-18) [x86_64-linux-gnu]
$ go version
go version devel +970ce1c Sun Jan 24 16:07:30 2016 +0000 linux/amd64

ruby: 0m25.204s
golang: 0m5.902s

となった。prime? メソッドについては後で ruby のソースコードを見てみる
2016/01/25(月) 09:30:52.61ID:11Jcfjfr
ここは、

for i := 3; float64(i) < math.Sqrt(float64(n)); i += 2 {
flg = true
for _, j := range primes {
if int64(i) % j == 0 { flg = false }
}
if flg == true { primes = append(primes, int64(i)) }
}

こうすべきなんじゃ?

for i := 3; float64(i) < math.Sqrt(float64(n)); i += 2 {
flg = true
for _, j := range primes {
if n%j == 0 { return false } // 追加
if int64(i)%j == 0 { flg = false }
:

そりゃ n までの素数を全部計算してからチェックしたら遅いわな
2016/01/27(水) 00:44:58.41ID:YbPGx/2n
>>492
よく考えたらprimeかどうかだけならそのifないと圧倒的に効率悪かったな
助かったサンクス
2016/01/27(水) 10:03:42.93ID:PS/Qpp4W
>>493 はフィボナッチでも劇遅糞プログラミングしそう
2016/01/27(水) 11:55:10.02ID:ChRzt0VQ
>>493
それで結果はどうなったの?rubyより早くなった?
2016/01/27(水) 21:15:12.05ID:hT8Bs+OE
>>495
素数: 1853028778786433 について試してみた
$ time ruby -e 'require "prime"; puts 1853028778786433.prime?'
4.61s user 0.08s system 99% cpu 4.700 total
golang の方は有意な時間で判定できなかった。
逆に小さな約数を持つ場合だと golang のが早かったりする。
一体どうやったらこんなに速くなるんだ・・・
2016/01/27(水) 21:33:03.27ID:hT8Bs+OE
と思って prime.rb を参考に改良した
$ time ./prime
1853028778786433 is prime!./prime4 0.18s user 0.01s system 98% cpu 0.189 total
いい感じ!アドバイスくれた人サンクスでした
コード: http://play.golang.org/p/-8oZ5IaC60
2016/01/27(水) 23:10:29.76ID:qL6rtn4g
どれだけ高度なコンパイラを使おうとアルゴリズムがダメならインタプリタに負けるって事がはっきりわかんだね
2016/01/30(土) 13:13:18.17ID:dxvhMaRr
http://play.golang.org/p/WgXW-WWQsX
2016/01/30(土) 14:11:30.69ID:VBtK9+ST
>>499
細かいところだがサンクス
ちなみにどれぐらい速度変わった?
今出先で調べられないんで気になる
2016/01/30(土) 18:06:51.65ID:dxvhMaRr
ごめん、はやくなってなかったorz
2016/02/03(水) 01:00:13.99ID:RekMB9Ax
goは言語仕様が絞られて素敵だけど、
いざ使うとなるとやっぱりメタプログラミングに弱いのが辛い。
リフレクションも使いづらいし、ジェネリクスがほしい。
せめてelxirのマクロみたいな機能でもほしい。
2016/02/03(水) 01:10:28.85ID:sGnqiCrl
groovy でも使っとけ
2016/02/03(水) 19:27:02.90ID:8oEH7nQt
     ,_---~~~~~----._    
 _,,_,*^____   _____``*g*\"*,
/ __/ /'   ^. /   \ ^@q  f
[ @f | @))  | | @))  l 0 _/ 
\`/  \~____ / __ \_____/  \ 
 |      _l__l_      I 
 }     [______]      I 
 ]      | | |      |  お年寄り向け言語に文句言うな
 ]       ~ ~       | 
 |              | 
  |              |
2016/02/04(木) 08:13:31.10ID:MUd/RGoB
go は c の代替って感じだからな。
2016/02/04(木) 17:21:48.10ID:ob+62gtm
>>504
plan9おじさん
2016/02/04(木) 19:16:26.71ID:qHo6spb8
go buildで最適化オプションないよね。

他言語の最適化おプチョンって何してるかわからんけど(デバッグ機能とか削ってんの?)、
実はgoってもう少し早くなるんじゃないかと思うんだが。
2016/02/04(木) 20:22:00.20ID:7gWb47bj
gccgo でも使えばいいんじゃない
2016/02/06(土) 15:12:23.11ID:+oaiB5r1
gccgo はversion古すぎてむしろ遅い
510デフォルトの名無しさん
垢版 |
2016/02/18(木) 07:25:41.93ID:R9/9Yxv0
go 1.6 age
ttps://blog.golang.org/go1.6
511デフォルトの名無しさん
垢版 |
2016/02/18(木) 17:06:46.52ID:45GMtAZP
1.6は少し難産だったかな。
2016/02/25(木) 14:07:18.05ID:1iIBqXg3
Goってサンプルコード見た感じ
プロトタイプベースの動的型付けでJavaScriptみたいに見えるけど
ぜんぜん違う?
2016/02/25(木) 18:19:46.58ID:7HmTbcPG
うん、全然違う。
2016/02/26(金) 02:02:53.28ID:xrOnn7Vq
>>511
一番すごい変更はvendoringかな。
コンパイル速度も速いままだし。

あと開発環境はvisualStudioCodeのgoサポートが一番いい気がするんだけどどう?
debugが一応スタックトレースくらいは見れるから
code readlingしやすくなったかも
2016/02/27(土) 10:39:29.98ID:HPxqSVef
>>514
なれるとvim。
2016/02/27(土) 13:19:34.48ID:yMp5JRD4
俺もVimだな
2016/02/27(土) 13:25:33.79ID:kW+aRgio
>>516
vimは環境構築がよくわからなくて使いこなせない。
一から構築するとしてどこみりゃいいの?
2016/02/27(土) 14:19:56.77ID:HPxqSVef
>>517
ttps://github.com/fatih/vim-go
2016/03/01(火) 01:00:37.90ID:29/rUB4E
for r := range "よろしく" {
fmt.Printf("<%c>¥n",r)
}

と、書くと実際にはrに入るのはindexなので期待通りに動きません
goにおいて多値を帰す場合は受け取り側もその数分用意しなくてはいけない
のが仕様のはずですが、
これは組み込みの機能なので対象外の動作です。
せめてrにはvalueが入るのが基本動作なら良かったんですが
このような挙動なのにはなにか理由があるんでしょうか?
教えて下さい
2016/03/01(火) 07:46:36.94ID:6qCWzYt3
文字列がインデックス付きデータだからでしょ。

_, r := range "よろしく"

では駄目なの?
2016/03/02(水) 02:02:01.07ID:O+5v5XDS
>>520

いえ、聞きたいのは
rangeの機能が通常のGoとしての関数の仕様と
異なる動作にしたのはどんな理由があってのことなのかと。

関数がエラーを含んだ多値を返すことを考慮して受け取り側は常に何個の返り値が返るか
意識することが必須ですが、
rangeは2つめの返り値を'_'で受取る必要が
なくても唯一動くことが許されていますよね
2016/03/02(水) 02:36:27.86ID:KGp7/CHI
そもそもfor文なんだからインデックスだけ使う場合はそういう表記でも違和感なくね?と思うんですが
2016/03/02(水) 07:53:32.49ID:4uoCKH4m
>>521
インデックスは一つ目だぞ
2016/03/02(水) 07:57:52.01ID:WtpIOuzZ
>>521
型アサーションも第二返り値を付けると失敗時に panic せずに失敗したことを真偽値で返すし、
開発者はそうすることで利便性が上回ると判断したんでしょ。
2016/03/02(水) 17:47:47.86ID:O+5v5XDS
>>524
あっ型アサーションもそういう挙動だったですね。
失念してました。
でもrangeで多値返却の省略可能な構文はメリットが思いつかなくないですか?
2016/03/02(水) 19:29:42.93ID:LM//BLJD
>>525
型アサーションだけでなく comma OK 構文全部だね。

>rangeで多値返却の省略可能な構文はメリットが思いつかなくないですか
型アサーションの挙動を見るに、省略してると言うより返り値の数によって別の処理を呼び出してる感じだけど、
まあ、パターンを覚えてしまえば余計なもの書かなくて済んで楽だよ。
2016/03/06(日) 23:04:28.69ID:b6Djrwpa
Goで使われたものでよく使ってるものとか面白いものとかないですか?
俺がよく使うのはghqです。

ghq : Manage remote repository clones

とりあえず試しにgit cloneするのに便利。後で迷わないし。
pecoと組み合わせで使っています
528デフォルトの名無しさん
垢版 |
2016/03/08(火) 07:20:41.16ID:UEJ8DCRQ
仕事で使う使い捨てツールはgoで書いてるよ
rubyとかで書くと処理遅いから。
2016/03/08(火) 11:28:08.83ID:MTUVFWu6
マッハの高速
2016/03/08(火) 11:30:57.60ID:MTUVFWu6
ruby 2.2おそいのか。ハァー
2016/03/08(火) 11:33:23.15ID:MTUVFWu6
【アニメ】 マッハGoGoGo_OP - YouTube
https://www.youtube.com/watch?v=cPR45cBkRq4
532デフォルトの名無しさん
垢版 |
2016/03/11(金) 22:39:08.10ID:nLZDtom/
http://www.amazon.co.jp/gp/aw/d/4621300253/
2016/03/12(土) 12:14:25.10ID:SnyNHJuk
日本語版でたのか。原著出てから4か月ちょっとなので結構はやかったね。
http://www.informit.com/store/go-programming-language-9780134190440
2016/03/12(土) 14:29:02.35ID:BDXKc72j
http://postd.cc/why-go-is-not-good/
こういう不利な点があっても使われる理由ってなんだと思う?
2016/03/12(土) 14:48:41.88ID:SnyNHJuk
よく言われるのは、サーバーサイドでシングルバイナリのデプロイが楽とか。
unix上では、etcdやdockerコマンドみたいなところで使われてるよね。
GCもどんどん進化してるから、データストア的な大量メモリを扱うデーモンにも使えるようになってきてる。
2016/03/12(土) 20:34:31.86ID:DTB2KgOx
それTheGoProgrammingLanguageの翻訳だよね?
2016/03/12(土) 21:00:42.17ID:+ss4n7rx
早とちりして発売されたのかとおもったら、6/15予定だった。
538デフォルトの名無しさん
垢版 |
2016/03/15(火) 22:07:51.01ID:vgWvBE4N
4月にも初心者向けの本出るのね
2016/03/16(水) 10:59:19.14ID:Tb17X3fe
だれかaltGo作ってくんないかな。
Goのエコシステムは最高だから、あとはもっとメタプログラミング強くしてほしい。
ジェネリクス付けて。

とTypeScript触りながら思いました。
2016/03/19(土) 02:08:18.93ID:lSlighbA
cからc++みたいに、go templateになりそう。
2016/04/05(火) 21:09:51.29ID:5i0FcrUo
原書 2015/11/5
http://www.amazon.co.jp/dp/0134190440/
翻訳 2016/6/15
http://www.amazon.co.jp/dp/4621300253/

原書カスタマレビューの「神話本の著者」はおおげさすぎるだろ

What a surprise to see the author of the mythic ≪ The C Programming Language ≫ come back for a new language
2016/04/05(火) 22:39:31.14ID:gPD3pwmd
まあカーニハンはかなりのビッグネームだし
2016/04/05(火) 22:44:14.08ID:mDmXAcnH
goってあんまり言語仕様が変化しないイメージだから
本は作りやすそう。
goの今後の予定ってドコに書いてるんです?
2016/04/06(水) 15:19:43.14ID:9UltHY9g
まあ、紀元前の本みたいなところはあるからね。
2016/04/06(水) 15:27:24.96ID:L63lM2I2
>>539
Ruby でも使ってればいいんじゃない
2016/04/13(水) 14:39:12.21ID:ndZ6lh6D
>>545
rubyは下位互換性を捨てながらマイナーバージョンアップしてないか?
たまにcocoapodsが死んだりするんだが。
goで書き直してほしい。コマンドラインツールこそgoで書いてほしい
2016/04/20(水) 23:50:51.74ID:ZQBKVnsi
>>539
c++から馬鹿をたくさん召還するだけだな。
いらん。
548デフォルトの名無しさん
垢版 |
2016/05/01(日) 15:24:29.85ID:tKi6j9CT
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています

言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?

Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al

ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw


The Covenant Project
概要

Covenantは、純粋P2Pのファイル共有ソフトです

目的

インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します

特徴

Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)

接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
2016/05/11(水) 11:14:37.67ID:sA9FQTwa
goのいい記事あったら教えてくれませんか
GolangのGCを追う
http://deeeet.com/writing/2016/05/08/gogc-2016/
上記は良かったGo1.6以降のGCの調子が良さ気。だけどSTWを体感するようなものをつくッテはいないのでなんとも
550デフォルトの名無しさん
垢版 |
2016/05/11(水) 16:06:51.62ID:eKmG0PfI
GoでWindows GUIアプリ作った猛者はおりますか?
2016/05/11(水) 22:35:30.19ID:024Ag8VN
http://golang.jp/pkg/exp-draw-x11
x serverあればどこでも動く
2016/05/12(木) 06:10:52.87ID:S2EnPjPz
>>550
WALKを使えばそれなりのものは作れるよ
2016/05/12(木) 15:55:56.59ID:wiVsZFfr
>> 550
Qt系の go-qml を使って普通に書いていますよ。
go-qml のインストールがすこし大変だけど
詳しい手順は以下の投稿したので参考にしてください。

https://groups.google.com/forum/#!topic/go-qml/S5Vho-XtQyo
2016/06/01(水) 11:32:56.19ID:sax7yxVA
Go言語先週から学習し始めたけど、何か変な言語だな
JavaScriptのようにいまいち不完全な言語に思えてしまう
突然意図しない挙動が発生したりで、なかなか基幹システムでは使いにくいのかな?
Javaのようなガッチリ感がない気がするので

でもシンプルさなど良い面もあるけれど
2016/06/01(水) 15:06:00.18ID:559HNr1m
誰もGo言語を基幹システム作るのに使おうとは思わんよ
銀の弾丸がないことを理解していない人間が評価という行為をするのは難しい
2016/06/01(水) 15:43:26.33ID:c7aWQBRE
銀の玉ってマ板でよく目にするけど元ネタ何なん
2016/06/01(水) 15:46:05.83ID:kIamMPov
人月の神話
2016/06/01(水) 16:05:38.28ID:c7aWQBRE
マジレスついた
ありがとう
2016/06/01(水) 18:48:22.39ID:2G+PcsXp
>>555
残念ながら、世界中の国家の機関になりそうなシステムをGoで書いてるんだな、今
2016/06/01(水) 19:23:38.40ID:559HNr1m
多分、基幹システムの認識がずれている
2016/06/01(水) 19:24:47.53ID:+8tVRjk4
どうでもいいが 555 と 559HNr1m で 5 が 5個入ってるな
2016/06/01(水) 19:26:34.98ID:559HNr1m
555をファイズと読んでしまった俺の認識も多分間違っている
2016/06/01(水) 20:15:06.92ID:0Dfr5L+i
国家の機関になりそうなシステムってものすごいフレーズだな
2016/06/01(水) 22:56:48.57ID:tjGnKxey
LLやってる人からすると、バイナリをgdb使ってデバッグするのは教えてもらわないとなかなか難しいかも。
phpやrubyやってても普段からIDEでデバッガ使ってればそんなに違いはないんだけどね。
2016/06/02(木) 00:19:36.30ID:M2BPbwci
既出かもだけど、俺コレには震えた

http://qiita.com/mattn/items/b7889e3c036b408ae8bd
2016/06/02(木) 04:24:28.34ID:cXOBdHTr
>>554
その意図しない挙動という部分を具体的に出してもらいたい。
大概そういうのは言語のせいじゃなくて自分のせい。というのを
長い年月で繰り返して学習するもんだけども
2016/06/02(木) 09:51:15.12ID:KfXFMNM2
>>566
そういうことも考えずに書いてるから突っ込まれてんじゃないの?
2016/06/02(木) 10:03:29.88ID:sFcAoyCt
func later() func(string) string {
...
return func(g string) string {
...
}
}
ごめん、このクロージャの最初の部分のlater() func(string) stringってどういう意味?
関数名がlater 戻り値がstringは分かるけど、func(string)がなんでこんな場所に書かれてるのかな、と
2016/06/02(木) 10:16:38.46ID:mKtftCeF
laterの返り値がstringを引数にとってstringを返り値とする関数という意味では?
2016/06/02(木) 12:02:45.10ID:sFcAoyCt
う〜ん、難しい...
2016/06/02(木) 13:52:28.11ID:cXOBdHTr
>>570
cの宣言構文より見やすいはずなんだけどね

http://qiita.com/m0a/items/2b03b189d746ae231756
この辺読むとか
2016/06/02(木) 15:52:21.01ID:sFcAoyCt
>>569
あぁ、なるほど
ようやく今理解した

func later() [func(string) string] {
[]は見やすいようにわざと書いたけど、こういう事だね

関数laterは引数は取らずに、
返り値として「stringを引数に取り、stringを返り値として返す」
2016/06/02(木) 16:09:51.23ID:sFcAoyCt
あれ、ちょっと待って

https://ideone.com/i9EfQl

later()は引数取らないけれど、
f := later()
f("apple")
どっからstoreに"apple"なんか文字列引数が渡されてるの?
こういう型の場合、ローカル変数(ここではstore)にコンストラクタのような働きが起って自動的に引数がセットされるって事?
2016/06/02(木) 16:14:42.71ID:sFcAoyCt
連投ごめん
f := late()
によって、fはlater()の返り値の関数を取得してるんだね
だから、f("apple")には上の無名関数func(string) stringが呼び出されて"apple"が引数とされているってことか
ごめん、分かった
2016/06/03(金) 17:56:32.51ID:BR7tIPAt
http://mattn.kaoriya.net/software/lang/go/20131112132831.htm

これの最初のコードの最後の部分、
<-workerquit
は何をしてるの?

特に変数に代入することもないし

func (g *G) ClearMsg() {
for len(g.task) > 0 {
<- g.task
}
}
も同じ事してるけど
チャネルを開放してるのかな、とも思ったけど、明示的にcloseしなくていいのかな、と
またはnilや空文字などにするとか
2016/06/03(金) 19:00:57.59ID:qwZkBXwi
終了待ちじゃない?
http://ashitani.jp/golangtips/tips_goroutine.html#
2016/06/04(土) 20:36:19.02ID:OVOooqIv
windows版のbuildmodeはexeしかできないの?
もしできるならスクリプト言語のrequireみたいに動的な読み込みとかできる?
さらにもしできたとしてunload的な名前空間の削除は?
2016/06/06(月) 11:35:10.38ID:4GD0zoa3
>>576
遅くなったけど返答ありがと

そうなんだ
終了待ちとかあるんだ
普通にやることなければその場でkillのように終了させたほうがいい気もするけど、Goは一気にまとめて終了させるってことなのかな?
2016/06/06(月) 13:30:02.95ID:u3gzbyWM
>>578
終了待ちのところをコメントアウトして実行してみると分かると思うけど、終了待ちしないとgoroutineを回し切る前にmainが先に終わってしまう
2016/06/07(火) 20:01:20.35ID:UCJwx0XG
>>579
ありがとう
2016/06/08(水) 00:14:44.49ID:sUO1i6Sl
https://ideone.com/SqM9XQ
インターフェースを実装して利用しようとしたんだけど、ShowMessage()が動かなくて
どこをどう変えればいい?
582581
垢版 |
2016/06/08(水) 00:28:26.77ID:sUO1i6Sl
あぁ、ごめん
fmt.Println(mes.ShowMessage())にすればいいんだね
2016/06/08(水) 12:03:24.49ID:E58O1JXH
https://ideone.com/ZPQ1ib

SetProfile()にて、構造体Profileのフィールド値を動的に変えたいんだけど、
どのように書き換えればいい?
2016/06/08(水) 13:40:28.97ID:6nwZJnu3
you 変数は必要ないんじゃ?

//you := make(map[string]string)

//you["Your_name"] = scanner.Text()
me.Your_name = scanner.Text()

//you["Your_gender"] = scanner.Text()
me.Your_gender = scanner.Text()

//me.SetProfile(you)
2016/06/08(水) 14:51:56.44ID:E58O1JXH
>>584
ほんとだ、ありがと
俺バカだなぁ

しかし、もし上記のような場合って処理できるのかな?
for k, v := range arr {
switch k{
case
2016/06/08(水) 15:28:46.54ID:E58O1JXH
switch k{ case 'Your_name': p.Your_name = v; } } のような処理は考えうるけど、
Pythonでいうsetattr(self, k, v)のようなこと出来ないのかなと思ったり
2016/06/08(水) 16:47:30.19ID:6nwZJnu3
んー、reflection を使えば良いんじゃないかな

func (p *Profile) SetProfile(arr map[string]string) {
for k, v := range arr {
key := reflect.ValueOf(p).Elem().FieldByName(k)
if key.IsValid() {
key.SetString(v)
}
}
}
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況