X



Go language part 2
■ このスレッドは過去ログ倉庫に格納されています
0017デフォルトの名無しさん
垢版 |
2017/11/12(日) 10:39:35.54ID:q/8e/fjb
もう「味見」は終わった様だし、やっぱり go は使わなくてもいいんじゃないかな
0018デフォルトの名無しさん
垢版 |
2017/11/12(日) 11:07:28.87ID:miP6tQAF
>>17
いやまだ終わってないんだなこれがw
道草食いまくってるからだが。

ただ、GoはWebには不向きというか、新規機能追加等で変更を迫られた場合、
PHP/JavaScript等と比べて3-5倍のコード変更が必要になりそうだ。
そしてこの、変更時のコード量がCと比べてほぼ同量だ。だから開発効率はかなり悪い。
パッケージが揃っているからとっつきやすいだけで、
(ライブラリを熟知している)バリバリのC++使いにとっては魅力はほぼ無いだろう。
とはいえ、「とっつきやすいC」という存在価値があるのかもしれない。
というか、C++は取っつきにくすぎる。あれは完全に暴走してる。Linusが毛嫌いしているのも分かる。

とはいえ、Goでプロトタイピングするのは辛いのは分かった。
というか、はっきり言ってろくな言語がないなこれについては。
JavaScriptは非同期のおかげでかつてのgoto文プログラムみたいな構造になってしまうし、
PHPは言語仕様が糞過ぎて思わぬところでバグって引っかかりまくるし。
RubyもPythonも前方宣言必須のゴミ言語だし。
同期JavaScript(マルチスレッドだよ!)が出れば一人勝ちじゃないのかな、と思うが、
あいつらの非同期はもはや宗教だし。
0019デフォルトの名無しさん
垢版 |
2017/11/12(日) 11:10:17.27ID:mnpiucg8
長文だらけで追い切れんけど

愚、言語がヘボでカラム分からんとDB操作が出来ません
賢、いやいや、アサーションでこう書けば出来るじゃん?
愚、他言語だとこんなので出来るんだけど
賢、じゃ好きなので書けよ、どうぞどうぞ

まとめるとこんな感じ?
0020
垢版 |
2017/11/12(日) 12:03:16.36ID:2U0xoSHY
>>16
ちょっときれいに書くテクニック、が他の言語と違うだけだよ。可変長引数に参照のスライスを渡す、とか、
取り敢えず受けて.(type)でswitchしてcaseに型書いて処理するとか。

ジェネリックに関しては、あれば良いなと思う事もあるが、実際やってみたらrangeで事足りたり、
chanにとにかく突っ込んで、空selectとcase xxx<-xxxchでさらに事足りたりと、便利な読み方はある。
システムコールのselectで複数のファイルハンドル待つ感じ。

>>18
多分ウェブに関して言えば、ちゃんとしてればPHPの工数の4番の1くらいになると思うよ。
ちなみに、JavaScriptでマルチスレッドマルチコアは、クライアントならWebWorkerやら、nodeなサーバならclusterとか色々ある。
0021
垢版 |
2017/11/12(日) 12:10:41.95ID:2U0xoSHY
そもそも、クエリの結果イコール構造体にならない事の方が多いでしょ。
構造体の入れたいフィールド(と読み捨てるカラムを放り込む値)の参照を持ったinterfaceのスライス投げるのが一番手早い。
入れたいフィールドのカラムを集めてinterfaceのスライスを返す関数用意しときゃ済むじゃん、ゼロクリアは保証されてるんだから。
0023デフォルトの名無しさん
垢版 |
2017/11/12(日) 13:50:03.49ID:EHhowjYE
構造体を自動生成するとして中身のわからん構造体をどうやって使うんだ?
0024デフォルトの名無しさん
垢版 |
2017/11/12(日) 13:57:51.09ID:EHhowjYE
結局リスレクション使った遅いもんになるだけでしょ
過度の抽象化は害しかないって偉い人が言ってた
0025
垢版 |
2017/11/12(日) 14:26:56.37ID:dH1+f21j
>>22
>>2
hogeって構造体があって、そのxxを取りたいなら、
のargsの、欲しいカラムの場所に&hoge.xを入れるだけ。
構造体を自動精製するんじゃなくて。

リフレクションとアサーションは違うし、そもそもそこまで遅くないぞ。
0026デフォルトの名無しさん
垢版 |
2017/11/12(日) 15:10:02.64ID:miP6tQAF
つーか、これ、構造体のメンバ名を都合3回書く必要があるじゃねーかよ!
度を超したクソッぷりにビビる。つーか、お前らマゾなのか?

1回目:type struct 内 ← うーん、まあ静的言語なら仕方ないか
2回目:rows.Scan 内 ← 速度の為なら仕方ないか、、、
3回目:メンバ名は大文字で始めてjsonタグをいちいち書け ← 死ね

PHPやJavaScriptでは1回も書かなくていいんだぜ!
さすがにこれには切れたよマジで。
https://qiita.com/vvakame/items/6719b3c90dfaa8220e44
0028
垢版 |
2017/11/12(日) 15:22:14.00ID:dH1+f21j
>>26
Scanには書かんで良いだろ。何読んでんだよ。

Jsonなら、*interface{}で受けて、map[string]interfaceで値とりゃフィールド名出てくんの一回だろ
だから、>>9で、RDBのように行と列が分離してねえんだよって言ってんじゃん。

しかし2chで知りたいことがあればdisれというのはホントだな。
0029
垢版 |
2017/11/12(日) 15:25:33.81ID:NnV+WxW3
これで、Cをやってたからついてける、お前はGCの動くタイミングが、とよく言えるな。
Scanの実装見て喋ってんのかなぁ。
0030
垢版 |
2017/11/12(日) 15:31:37.75ID:dH1+f21j
dynamicとかnewtonsoft.JsonのJObjectで受けないC#でもクラスのフィールドに属性つけなきゃならんし、こいつが何を問題にしてるかわからん。
cやcppで書いたらライブラリ使ってももっと地獄じゃん。

動的言語しかやった事無いから辛いと言ってるだけに見える。
0031デフォルトの名無しさん
垢版 |
2017/11/12(日) 18:57:59.72ID:miP6tQAF
前スレ>>977

まさか3回も書かされるとは思っていなかったから今更ながらxoを試した。
が、これもちょっと冗長だな。
標準で go generate がついている時点で、公式も糞っぷりを認めてる。
ASTとか完全に屋上屋を架してる。
ろくな解がない。

構造体メンバを1回書くところまでは許すとして、
Scanは構造体を受けろ、JSONはlowerCamelスイッチをつけろ、ってとこだね。
0033
垢版 |
2017/11/12(日) 19:12:41.31ID:I2Yxw4dL
新参を足蹴にするような真似はしたくないが、
3回も書いたのは自分だろ…。
0034
垢版 |
2017/11/12(日) 19:18:34.25ID:I2Yxw4dL
可変長引数を受ける関数には、...でスライスを渡せる。
構造体渡したら構造体の(カラム名と同じ(!))メンバに入れてくれる事を望んでるんだろうが、
型がハマらなかったらとか、そもそもクエリでasで別名つけてるかもとか、キャストしたけどasで同名つけてる、とか、クエリ側が勝手な事するリスクを全部解決して構造体に入れる手段を考えてから考えれば良いのに。
まぁmap[string]interfaceが落としどころじゃねえの?フワフワ適当なクエリ投げたいなら。

クエリ自体もGoに書かせたいなら、最早SQLと繋げる意味なかろうて。
0036デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:30:43.54ID:miP6tQAF
>>32
構造体で受けるだけならそうだね。
ただ、毎回リフレクションはかなり厳しいから、うまくキャッシュしてくれるかどうか。
refrectを見る限りシグニチャは発行してくれないっぽいし。
ポインタ演算を禁止しているから、CみたいにOffsetofの結果を配列でキャッシュできないのも残念な所だね。
使うときは速度/ソース確認必要といったところか。

今回は速度の味見だし、とりあえずベタで書いた。
ただ2回書きまでは覚悟してたが、3回とはね、、、
0037
垢版 |
2017/11/12(日) 19:34:45.85ID:I2Yxw4dL
>>36
まあ俺が煽るから無視してるんだろうが、
煽り抜きでとりあえず>>2>>25やってみたら?
ベタ書きよりはましだと思うが。
なんかそれでダメな点があればまた教えて欲しい。
0038デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:37:07.63ID:miP6tQAF
>>35
さすがにGo歴1週間もないのに投げないよ。背景等もよくわからんし。
てか、同意するなら誰か投げてどうぞ。

てか、Go信者はこの言語のどこに惹かれてるんだ?
特に目立ったメリットはないような。
0039デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:37:19.23ID:EpH8iSoP
>>31
むしろ標準ライブラリにASTついてるのって魅力じゃないんかな。
goはコード生成してなんぼなんじゃないの
0040
垢版 |
2017/11/12(日) 19:37:36.02ID:I2Yxw4dL
ただの別名も指定せんクエリなら、構造体渡して、参照がセットされた([]interface{})返す関数だけでいけると思うが、なんかいかんのかな。
0041デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:44:29.82ID:miP6tQAF
>>37
日本語でおk

おまえには日本語が通じず、話が空回りするから無視してる。
map/リフレクションを使わない理由は俺は既に>>6で言っているし、
それはむしろ一般論だから、他の人もそれをふまえて話をしている。
おまえだけ空回りしてるんだよ。そしてそれが荒らし行為なんだよ。

煽るとか、そういう表面的な行為は大した問題ではないんだよ。
おまえは馬鹿だからそれも分からない。マジで死ね。
0042
垢版 |
2017/11/12(日) 19:46:37.12ID:I2Yxw4dL
>>41
マップでもリフレクションでもないんだが。
0043デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:47:24.84ID:EpH8iSoP
>>38
俺的に気に入ってる点。

* 構文規約が言語側で確定してるから誰のgoコードでも見やすい。
* コードの管理周り。 正直他の言語でもコード管理は真似してる(ghqをつかって)
* 標準ライブラリが学習教材になってる感じ。
* goaがある。

正直一番最初に使いたい理由になったgoroutineは一番最初に触って以降触ってないな。

色々欠点もあるけど、なんかコード生成によるメタプログラミングを体得すれば解決する問題かも。と思っていてAST周りを学習中
0044
垢版 |
2017/11/12(日) 19:47:27.64ID:I2Yxw4dL
なんで、リフレクションとアサーションと言葉が違うかわかる?
0045デフォルトの名無しさん
垢版 |
2017/11/12(日) 19:47:57.59ID:miP6tQAF
>>39
いや、正直、そういう文化なのかな?とちょっと思ってました。
てかなに?今時の若者はASTとかでさくっとコード生成しちゃうもんなの?
俺はlexとかbisonとかは触らずにきてるんだけどさ。
0046
垢版 |
2017/11/12(日) 19:52:21.47ID:I2Yxw4dL
かつ、interfaceが指す先の型がScanner実装してたらそれで勝手にやってくれんじゃないかなぁ、これは勘違いかもしれんが。

まぁ、やりもせず、パフォーマンス計測もせず、思い込みで「これはリフレクションである」と言われても困るわ。

空回りしてんの俺か?
0047デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:00:44.01ID:q/8e/fjb
>>38
> てか、Go信者はこの言語のどこに惹かれてるんだ?
> 特に目立ったメリットはないような。

ある種のシミュレーションプログラムを作るのに goroutine + channel
で割合と簡単に書けちゃって、32 core 使って並列化したら実行時間が
1/25 程度に抑えられて…といった経験からかな。
0048
垢版 |
2017/11/12(日) 20:04:43.25ID:I2Yxw4dL
ちゃんと言うと、Goのinterfaceはメモリ上に型情報をそもそも持ってるから、リフレクションせんでもほぼノーコストでアサーションできる、はず。
https://research.swtch.com/interfaces
0049デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:06:46.98ID:miP6tQAF
>>43
go fmtとか、パッケージ管理/ディレクトリ構造が言語に密着とか、確かにいい割り切りっぷりではある。
しかし他挙げてくれた点も、Go言語自体ではなくて、エコシステムの話だよな?
いやもちろんエコシステムも重要なんだが。

gorutineはパンダだろ。その意見(最初だけしか使ってない)は割とよく見るよ。

> コード生成によるメタプログラミング
まあCのマクロやC++のテンプレートよりはましかも。ソースが直接見えるという点で。
0050
垢版 |
2017/11/12(日) 20:08:42.80ID:I2Yxw4dL
goroutineはAPIサーバ書いたり、システム内でメッセージ投げ合うたぐいの物書いたらめちゃくちゃ便利だけどな。
用途次第だろ。
0051デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:09:45.01ID:EpH8iSoP
>>45
そんな恐ろしいもんじゃなくGoコードを構造体に変換できるから
改変がし易いってだけじゃないかな。
正規表現で変更とかよりよっぽど安心できる。
0052デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:10:17.01ID:miP6tQAF
>>47
goroutine+channelがはまったケースか。
それなら分かるとして、ただ、そもそもこれがはまるケースがほぼないよな?
0053
垢版 |
2017/11/12(日) 20:11:26.99ID:I2Yxw4dL
>>51
ハイジェニックなマクロ展開とか書きやすいしね。
0054
垢版 |
2017/11/12(日) 20:17:42.78ID:I2Yxw4dL
前スレ974で良いところ行ってたのに、突然のシッタカでグダグダ言う上に読解力に欠けてて、しかもリフレクションだと決めつけてて、
人の話も聞かんと、言葉が理解できないならコードは読むだろうと解説代わり書いて、
Cがわかるなら.sに落として眺めるだろうという期待も裏切り、
何やってるかまったくわからん。
0055デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:19:14.44ID:miP6tQAF
>>51
> 正規表現で変更とかよりよっぽど安心できる。
確かに。自前よりは公式解釈済みの構文木をもらえた方が100倍いい。
しかしそれ、渡されましても、、、ってのが普通だと思うが。
てか、これ見せてる言語ってこれまであったっけ?
最近はflycheckみたいなリントも流行ってるみたいだし、見せる方向なのか?
0056デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:19:33.62ID:EpH8iSoP
>>49
俺にとってgorutineはたしかにパンダだったな。
構文規約が言語側で確定って割と言語仕様よりなんじゃないの。
Go言語の言語仕様は物足りさは感じつつってのはある。

interfaceがGoにおけるキモなんだけど機能不足感があって
関数の引数がなんでも受け入れokな interface{} 型になるとかなり残念になる。

多分interfaceにプロパティをokにしたり
type interfceC =interfaceA | intrefaceB
(interfaceCはinterfaceA か intrefaceBどちらかを満たす 直和型ってやつ)
みたいな定義をokにしたり、シンタックスシュガーだけど
type interfceC =interfaceA & intrefaceB
みたいな定義もokにしたら幸せというかジェネリクスに進化できる気がする
0059
垢版 |
2017/11/12(日) 20:24:47.34ID:I2Yxw4dL
人の話きかねえからな。
0060デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:26:12.38ID:EpH8iSoP
何か得意分野があるってだけでその言語は魅力的じゃないの?
rustとか言語ヲタじゃないと触ろうってならないし。

goはCLIツールを作るためのライブラリも揃ってるし
ツール作る系でもおすすめ
0061
垢版 |
2017/11/12(日) 20:35:12.41ID:I2Yxw4dL
他の人もそれを踏まえて、って誰も勘違いしてなくねえか?
呆れるやつ、ASTいじりはいいぞ、気に入ってる点、諸々。

語るに落ちられてバカさらされて、なんでこんな言われなならんのだ。
0062デフォルトの名無しさん
垢版 |
2017/11/12(日) 20:47:41.28ID:miP6tQAF
>>57
まじかよ!JavaScriptならevalできるし無限増殖できるぜ!って思ったけど、
俺が思ってたASTのフォーマットとものすごく違ってた。
これ完全に文字ベースだよな。
もうちょっとファンクションベースなものを期待してた。
メトリックスをASTから抜いたツールもあるようだが、これ相当死ねるだろ。
http://azu.github.io/slide/JSojisan/#7
まああくまでパースした直後のデータで、だからこそすべての用途に使えるってことなんでしょうな。
ただ、ここからコード生成も相当死ねると思うが。
0063
垢版 |
2017/11/12(日) 20:50:00.50ID:I2Yxw4dL
見えないフリしてないで>>48を百回ぐらい読んでこいよ。
そして長文で語れよ。
0064
垢版 |
2017/11/12(日) 20:51:23.21ID:I2Yxw4dL
空回りしてて荒らしでそれもわからないバカなのは誰なのか、どうすりゃいいか>>41読んで考えろ。
0065デフォルトの名無しさん
垢版 |
2017/11/12(日) 21:02:31.33ID:miP6tQAF
>>56
interfaceのプロパティってのは何に使うんだ?

俺は一応、Goのインタフェースシステム「実装してたらその型として使える」はありだと思っている。
平べったいダックタイピングというか、C++のtemplateを野良で転がしているのに近い。
貧弱かどうかって所まではまだ味見できてないから分からない。

直和や直積(でいいのか?)は別名でテンプレート書け、って文化なんだろ多分。
割とベタが好きな言語なんだと思うよGoは。
0066
垢版 |
2017/11/12(日) 21:05:16.25ID:I2Yxw4dL
虚しくなるわ。悪かったな。interfaceの実装知ってて。
0067
垢版 |
2017/11/12(日) 21:10:33.63ID:I2Yxw4dL
>>62
escodegenがこれ食うからいいんだよ
0069デフォルトの名無しさん
垢版 |
2017/11/12(日) 21:30:04.35ID:LJndNP2M
とにかく汎用ライブラリを作ろうとするなり触ろうとするとinterface{}型が登場するのは機能不足によるものだからもっと頑張れ。

と言いたい。コード生成で頑張るべきなんだろう。

goaはコード生成に頼りまくりのおかげでinterface{}型に出くわすことがなくて幸せ。
0070
垢版 |
2017/11/12(日) 21:35:31.60ID:I2Yxw4dL
>>69
interface型は宣言がそうなだけで、実際には型持ってるから、そこまで嫌わんでも良いんじゃないの?
default書くのをサボらなければそうそう死なん。
0071デフォルトの名無しさん
垢版 |
2017/11/12(日) 22:15:33.55ID:EpH8iSoP
>>70
んなこと言ったら動的言語だって内部的には型を持ってるよ。
問題はintereface{}型が関数パラメータに使われた場合、
Printlnみたいになんでも受け入れ可能って意味ならいいんだけど、
実際にはGoの表現力が不足していて仕方なくってパターンが多い。
0072
垢版 |
2017/11/12(日) 22:41:17.16ID:I2Yxw4dL
>>71
動的言語の良いところを取るべくして、ただのvoid*には無い機能をもたせてるんよ。
表現力が足りないと言うより、ではなくて、本来は型にアサーションするんじゃなくて、別の任意のinterfaceにアサーションして便利に使おうね、って感じの思想。
だから、printf渡すだけでも、%sで渡すとStringerとして扱われたり、%+vで中身が見れたり玉虫色の解釈が出来るようになってる。
何でも受け入れ可能だから形無しinterfaceではなくて、こいつの型は提示せんがフォーマット文字列の通りに扱えよ、という意味であの引数。

だから、interfaceは明示的に実装しなくても、満たす関数があれば自動的に実装されるようになってる。
俺が今こうinterfaceを宣言して、そうするとこの構造体には自動的に実装されてるはずだから、俺は与えられた引数を宣言したinterfaceとして扱うってアサーションがかけれる。逆に言えば、俺に処理してほしけりゃこれを実装しとけ、って発想。
後出しジャンケンみたいなジェネリクス。
0073
垢版 |
2017/11/12(日) 23:03:45.88ID:I2Yxw4dL
話題()のScanの中で、convertAssignってのが呼ばれてるんだけど、こいつがまさに、Scannerとして扱えればScannerに任せるようになってる。
[]interface{}として渡してて、その1つの指す先が「構造体の要素一つ」であっても、
その要素がScannerを実装してればそれに処理を任せてる。
「構造体の要素一つ」をプリミティブな型で宣言せんと、ちゃんとtype IDColumn int等と宣言して、IDColumnとして構造体の要素を宣言しとけば、IDColumnにScanner実装しとけば[]interface{}の中にその参照突っ込んでもそれが呼ばれる。

type IDColumn int
type xxxRow struct {
  ID IDColumn
}
で、
v:=xxxRow{}
って作って、
>>2のargsを例に上げるとargs[0]=&v.ID
ってして、Scanに(args...)で渡した時、0カラム名はIDColumnのScanで処理されて、v.IDに入る。

APIが足りてないとか大嘘。
0074デフォルトの名無しさん
垢版 |
2017/11/12(日) 23:11:21.09ID:EwcJ+uHe
長くて読んでないけど静的言語を使いたいものとしては極力コンパイル時に解決したい。interface{}に頼ると実行時エラーが発生する可能性が増えてエラー処理の記述量がふくらむから嫌いなの。

それだけ。
0075
垢版 |
2017/11/12(日) 23:18:58.92ID:I2Yxw4dL
そりゃまあ、便利さとリスクの天秤でしか無いわな。
あとからStringerにして、そいつの中で実行時に死にうるコード書いたら、全くソース変えてない部分で実行時エラーになるんだし。

実質sprintfなんか使えないコードになってしまう。
0076
垢版 |
2017/11/12(日) 23:25:50.08ID:I2Yxw4dL
まぁ、interface受けてるのにアサーションしてないとか、default書いてないのが一番悪い。
defaultはエラー処理じゃなくて正常系。
0078デフォルトの名無しさん
垢版 |
2017/11/13(月) 12:06:00.11ID:NWIlj649
親切な人が多いけど、ウンコが混じってもコミュニティの役にはたたんよ?
リーナスも言ってるでしょ、基本的には去ってもらうこと、これが最も良い解決策。

向上心が有るなら別だが、基本が納得出来ないなら「どうぞ、どうぞ」が一番良い
0079
垢版 |
2017/11/13(月) 12:18:42.55ID:GqWd1fLV
>>77
デメリットと言うより、必要悪だろ。
一切キャストしないCも書けるが

このスライド出す時点でナンセンス。
PHPの変数は暗黙的変換で無残なことになる、数や名前や型の不一致はそれこそ、毎度構造体を作る事によって引き起こされる。
val,ok := アサーション
でokが見れるという点で殆ど対応できる。
Bugクラスが未定義、と言うところもおかしいわな。
interfaceを実装してればそれがなんであれそのinterfaceとして扱えるように、ライブラリ書くだけだろ。

ただの型チェックの防御的プログラミングとは違う。
interfaceとのチェックと、interfaceに任せる事での、そのロジック内での処理と切り離した、interfaceへの責任転嫁に近いが、
interfaceをいかに正しく定義、実装するか自体が問題であって、型は無くて良いよねって言ってるわけじゃない。
0080
垢版 |
2017/11/13(月) 12:22:19.44ID:GqWd1fLV
オブジェクト指向だと考えるのが一番いかんな。
ToString()を全ての型が実装してる、と言う発想じゃなくて、
プリミティブはあくまでプリミティブ、Stringerならば、Stringerとして処理できる、という逆の発送。
0081
垢版 |
2017/11/13(月) 16:18:30.89ID:GqWd1fLV
よーく読んだら、このスライドで話してることが(責務の分担(interfaceとinterfaceへのアサーション)、
 疑いがあるならば即落とすべき(panic)、
 mixedでのリターン(標準)、
 クラスが未定義の場合何をするか(defaultでの無視))
と、全くGoのinterfaceでの設計意図と矛盾しないことぐらいわかるだろうにな。
世知辛いわ。
0082デフォルトの名無しさん
垢版 |
2017/11/13(月) 19:04:12.10ID:1Zt7pra1
>>81
の言ってることが全く理解できないのは俺だけかな?なんだろういくら話してもすれ違い感が半端ない。

誰か翻訳して!
0083
垢版 |
2017/11/13(月) 21:00:03.61ID:JTJTMoOK
>>82
お前が、interface{}を、なんでも渡せるvoid *的な物として考えてるから理解できんのだろうな。
0084
垢版 |
2017/11/13(月) 21:06:35.59ID:JTJTMoOK
コンパイル時に誤りに気づきたいのは、要は、動作させるまで正常に動くことが保証できないのがいかんのでしょ。
あとからファイル足して、既存コードの動きまで変わる(シグニチャがあってればinterfaceが実装される)言語で、何言ってんだってレベルの話。
どう動作させても最悪、処理対象外データとしてスルーするようにdefault書くのと同じようなもんで。

本気で適当にgeneratorで作った得体のしれないものを関数に渡してるような奴でもあるまいし。

すれ違い感半端ないのわ俺だわ。
何か俺が書いたこと間違ってる?
0085
垢版 |
2017/11/13(月) 21:12:35.14ID:JTJTMoOK
どう動作させても最悪、処理対象外データとしてスルーするようにdefaultに書いておくのと同じようなもんで、形チェックに通るか通らんなんか、ポインタがある時点でどのみち同じようなもんで、と書こうとしたら大事なところ抜けたわ。ごめん。
0086
垢版 |
2017/11/13(月) 21:28:25.68ID:JTJTMoOK
なぁ、俺が持ってるGoの知識は古いのか?

1.8まではソース大体読んでたが。そんなに読み違えてる?

ソース読んで、設計思想まで理解したやつが「黙れ」って言うならもう黙るわ。
今まで俺が書いてたような内容は標準ライブラリがほぼそのまんまの事してる内容ばっかだよ。
fmt.Printfだけでも一読の価値はあるんだが。

もう好き勝手書いてろと思えてきた。
0087デフォルトの名無しさん
垢版 |
2017/11/13(月) 21:55:59.07ID:jvc+6Y1L
これ、virtual持ってないよな?ジェネリックなんてまるでやる気ないだろ。
OOPが暴走気味でデザパタ廚のようなゴミを再生産しているのは事実として、virtualなしはいかんだろ。
それに対しての
> 多分interfaceにプロパティをokにしたり (>>62)
なら全くもって同意だ。というか、JavaScriptはこれができて便利すぎる。
むしろあれがC++に入らないのが不思議だ。
継承や委譲をこねくり回してデザインパターン(キリッするよりは、
JavaScriptのようにメソッドも第一級オブジェクトにしてしまって、簡単にvtblを手組できるようにした方が、
「見りゃ分かるだろ」的なソースを作りやすい。多重継承も楽勝で対応できる。
Goは多分行き過ぎたOOPの反省でinterfaceが1階層しかなく、この点はいいが、
せっかく第一級オブジェクトな関数をメソッドに代入できない点が糞だ。
これはinterfaceをプロパティバッグにしてしまえば解決できる。(62の指摘はこれだと認識している)
動的対応がいやなら再代入禁止で2パスコンパイル
(インタフェース解決+オブジェクトコード生成)にすれば対応可能だ。
Goの作者はよほどOOPが嫌いか、ジェネリックなんて不要と思っているのだろう。
Goのinterfaceは静的ダックタイピングのためのものであって、記述コードを減らすためのものではない。
俺はこの点は全く気に入らないね。というかコードを減らす努力がGoには全く見あたらない。
おそらくそれがここ20年のソフトウェア産業の努力の方向だったというのに。
0089デフォルトの名無しさん
垢版 |
2017/11/13(月) 21:59:25.48ID:jvc+6Y1L
ちなみに味見の結果は出た。PHP比で15%速かった。結論としてはGoは糞だ。

PHPが糞なのは事実として、のさばるのには理由がある。
GoではPHPを殺せないし、今回のようなWebアプリ(掲示板)ならPHPの方がましだね。
PHP/JavaScriptなら数行で書ける処理を、(前スレ978参照)
型のおかげでベタに3回書くかリフレクション等こねくり回して20-30行書くかが必要で、
それで15%しか変わらないのなら全く割に合わない。
5台クラスタを6台クラスタにすれば済む話でしかなく、物理で殴れ、になる。
しかもPHPは毎回起動/停止するので、メモリリークとか
おかしなリクエストを食わされて落とされた場合のことを考える必要がない。うまくできてる。
(これについてはgoroutineで対応できるが)
そもそもWebアプリなんて型がないとつれーわって規模にもならないし。

ただし単品ではそこそこ速い。今回はSQLiteに引っかかるのでそれが見えないが、
Nodeのデータから推定した結果、Node比-40%、JSON.stringify部分だけなら倍速出ている。
ただしこれならC#やJavaと同程度、C++よりは確実に遅いといったところか。

生産性は悪い。コードを集約する方法が用意されてない。

結果、C++/C#/Java使いがわざわざ乗り換える訴求力はない。速度も生産性も利点がない。
ただしこれらの言語は本当に肥大化しすぎていて、新規に始めるのはかなり辛い。
これらの言語を全く知らないWeb系がコンパイラ系言語を始めるとっかかりとしてはちょうどよく、
その辺が受けている理由か。

言語自体にパワフルさはない。C++にWeb系ライブラリが出そろえば簡単に殺されてもおかしくない。
とはいえ、言語としては確実にJavaより出来のいいC#が完全にJavaより出遅れているし、
これまた糞だと言われているPythonがはびこっているし、
言語の成否は言語自体の出来よりはそれを使う人がいるかどうかが問題であり、
Web系向けの「軽量コンパイラ言語」は確かにないので、離陸できればうまくいくのかもしれん。
とはいえ、Web系は声がでかいだけで、実際のプログラマ人口はJavaの方が圧倒的に多いのも事実だし、
関数型()みたいにポシャっても全く不思議ではないけど。
0090
垢版 |
2017/11/13(月) 22:02:50.75ID:JTJTMoOK
そうですか、ではそのように他の言語をお使いくださいな。
0091
垢版 |
2017/11/13(月) 22:17:05.12ID:JTJTMoOK
一歩引いて、ハサミを買ってきた奴が、
「これカッターナイフみたい使えねえじゃん!クソカッターかよ!クソだ!
 え?挟んで使う?馬鹿じゃねえの?俺はこれが切りたいから刃を立ててるの!
 刃物で挟むとかちょっと違うオペレーションじゃん?それって効率悪いし、危ないだろ、考えろよ。
 こんなもの、カッターナイフのかわりには成りはしないね!
 断然カッターナイフだわ。ほんとクソ」
ってドヤ顔するのを見るのもちょっと面白いな。
0092
垢版 |
2017/11/13(月) 22:18:20.70ID:JTJTMoOK
馬鹿とハサミは使いようだが、馬鹿にハサミは使えないもんなんだなあ。
0093デフォルトの名無しさん
垢版 |
2017/11/14(火) 00:25:35.42ID:XnMPPPKZ
>>87
56だけどまぁ分かる。今TypeScriptでジェネリクス使いまくってるけど
やはり静的言語に自由度を求めるとジェネリクスがほしい。

でもGoの言語設計ってコード生成しようぜって匂いを感じる。
パッケージ内に生成したコードを置けば自作の型にいくらでも機械的にメソッド追加できる。シンプルな構文でこういう自由度を確保してるのは良く出来てる感ある。

問題はコード生成するコードを書くのが大変ってことなんだよねw
コード生成するコードを書くための仕組みがもっと簡単になればかなり使い勝手が良くなる。

実際ジェネリクス自体コード生成するためのコードをショートカットした技術って感じがする。だからちょっと複雑なことをしようとすると難しかったりする。
コード生成するためのコードは素朴な分そういう頭がこんがらがる感じはないかなと。
0094
垢版 |
2017/11/14(火) 00:39:55.32ID:7wTk437K
なんでジェネリクスが使えるか、型引数がジェネリクス関数の中で行う処理で必要な演算子やらメソッド呼び出しを実装してるか、だろ。
だったら、そもそもinterface受ければいいだけじゃん。>>56でやりたいであろう直積も和も、interface側ではなくて、構造体側がどう実装するかでしかないし、
それも各構造体で両方実装するとか、各構造体を埋め込んだ構造体書くだけじゃん。

それは、型のないinterfaceで受けるべきじゃなくて、パブリックな「型のあるinterfaceで受ける関数に」から、プライベートな「型のないinterfaceを受けるが中でアサーションしてる関数に渡して」やるだけじゃねえの?

その設計が面倒なら、ジェネレーターで組み合わせ爆発起こして遊ぶべきなんだろうが、
実際は型付きinterfaceで事足りないか?それ。
0095デフォルトの名無しさん
垢版 |
2017/11/14(火) 02:34:26.33ID:ik7ti+/q
>>93
> でもGoの言語設計ってコード生成しようぜって匂いを感じる。
俺にはその嗅覚はないが、状況証拠からするとこれはその通りだ。公式ブログ(URL後掲)もあるし。
標準コマンドに go generate とか、最初からASTを見せる気満々とか、iota とか、ちょっと行っちまってる。
そしてパッケージ内に階層がなく、 cat >> で全ていける。コード生成に障害が何もない。
首謀者は一般のプロダクトプログラマではなく、
サポート側のプログラマ(Perlでlinter等の作成とか)だったのかもしれんね。

C++のテンプレートはちょっと行き過ぎてしまっていて、余計に見にくくなってる。
例えば、形式的な無駄関数呼び出しがありまくったりする。
しかしそれらはコンパイラが最適化で抜いてくれるので、彼らはそれでよしとしている。
C++erの最優先はオブジェクトコードであって、ソースコードではないんだな。
無駄に回りくどくなったソースを見せられても困るんだが。

しかし考えてみれば、テンプレートなんて所詮はコピペだから、機械的に吐き出すのは極めて簡単だ。
人間がゴリゴリテンプレートを書くのではなく、
自動コード生成前提で、そのために基本ベタ書き、ってのは逆転の発想だがありだろう。
いや正確に言うと、Cのマクロの基本はコピペ的使い方だから回帰か?
とはいえCのマクロもC++のテンプレートも濫用が過ぎてるのは事実だ。
ベタなコードを自動生成してしまえ、ってのはありだろう。
0096デフォルトの名無しさん
垢版 |
2017/11/14(火) 02:35:07.63ID:ik7ti+/q
go generateは以下を見る限り追記だけかな?
https://blog.golang.org/generate
https://techblog.haroid.io/go-generate/
https://qiita.com/vvakame/items/6719b3c90dfaa8220e44
これはちょっと回りくどい。go fmt が上書きなんだから、go generate も上書きでいい。
具体的に欲しいのは、MarshalJSONではなく、構造体にJSONタグを追記する機能なのだから。
つまり、
type myStruct struct {
SomeProp int
}

type myStruct struct {
SomeProp int `json:"someProp"`
}
に上書き、だ。上書きが怖いのならビルドディレクトリを分ければいいだけでね。

> コード生成するコードを書くための仕組みがもっと簡単になればかなり使い勝手が良くなる。
俺は go generate が別パッケージを呼び出すのが気に入らないね。
とはいえ、自動生成用のコードなんてその場に埋め込まれても困るのも事実だが。
しかしjsonの部分は明らかに糞なんだし、公式で以下のとか用意しとけよなマジで。

元ソース
type myStruct struct { //go:maintain jsonTag -type=lowerCamel
SomeProp int
}
を、
type myStruct struct { //go:maintain jsonTag -type=lowerCamel
SomeProp int `json:"someProp"`
}
にビルドの度に自動的に maintain する、とか。
0097
垢版 |
2017/11/14(火) 08:17:29.04ID:j+l8jijk
上書きしない理由は、本来想定された用途がinterfaceを実装すべくレシーバをもった関数を生やすためだろ。
同一パッケージなら別ファイルで良いんだから。

こりゃ、2にもジェネリクス入るか微妙だな。
欲しい欲しいて声が挙がっても、要らんだろと言われ続けてるのがなんでかわかったわ。
既存機能すら理解してない奴らが欲しいって言ってるのか9割なんだろうな。
0098
垢版 |
2017/11/14(火) 08:19:24.88ID:j+l8jijk
そもそも、「ジェネレータ」なんだから、既存のものを上書きするものでないのは自明だろ。
新しいソースをジェネレートすんだよ。
0100
垢版 |
2017/11/15(水) 23:31:53.99ID:UrGbNKGm
>>99
純然たる日本人だよ、たどれる範囲では。
日本語が解りにくいみたいなそういう言いがかりはナンセンス。
そもそも解りにくい日本語を喋れるのは日本人だけだ。
解りにくい○語を話せるのはネイティブ○語話者だけと大きくも言える。

韓国人が日本語の語順が不安定な部分使ってニュアンス出したりとか、逆にきちんと定義されてる言葉の使い分け使って煽れる訳ねえじゃん。
その結果例え解りにくいものになったとしても、あとから学んだ言葉が不得手な場合の解りにくさとは全く違う読みにくさが生まれる。

英語少々喋れても、口喧嘩はできなかったり嫌味が言えないのと同じようなもん。
0101デフォルトの名無しさん
垢版 |
2017/11/15(水) 23:48:19.81ID:JIFjS5yg
>>100
> 解りにくい○語を話せるのはネイティブ○語話者だけと大きくも言える。
そんなわけねえだろドアホ

韓国人はマジで死ね
0102
垢版 |
2017/11/16(木) 00:49:28.81ID:2XWbEkjP
>>101
理屈が通じないなんて、まさかそんな日本人、現代人離れした感覚持ってるとは思わなんだ。
説明には充分注意を払わないといかんな。
0104デフォルトの名無しさん
垢版 |
2017/11/16(木) 15:56:24.67ID:ptVZN4ur
>>96
go generate自体はただのコマンド実行なんだから
上書きするコマンドを実行させちゃえばいいと思う。
作法としてNGってことなんかな。
0105デフォルトの名無しさん
垢版 |
2017/11/16(木) 16:29:37.83ID:daoo5ECa
windowsで開発していると
goで作成した実行ファイルを実行するたびにアンチウイルスソフトのAVGが起動して
スキャンを始めます
goがコンパイルしたプログラムをスキャン対象外にする
なんてことは出来なそうですし、スキャンをオフにするしかないのでしょうか?
0108デフォルトの名無しさん
垢版 |
2017/11/16(木) 23:43:33.13ID:qlqEZ53b
>>103
23:00- からのIDの話とか、やっぱり筋が悪いと思うぞ。
・IDが大文字じゃないとダメだからタグをつけよう!(Go信者)
・IDが大文字じゃないといけないのがダメだろ。それでソース変更とか頭おかしい(C派)
Linusが嫌っているのはこういったどうでもいいことに余計に手間がかかることであって。

これはGoの仕様が糞だから発生した手間でしかない。
IDが大文字になったら見やすくなり、バグが減るのか?そんなわけない。
ここで必要なのは、lintのwarningを抑止するコメント、 //golint: ignore case `Id` 等であって、
余計なタグを増やすスクリプトではない。
ここら辺の「全部ベタ書きで個別指定しろ」という点がGoの思想の糞な所だ。
次はこれらによって個別に記述されたタグの整合性をチェックするスクリプトが必要になり、以降無限ループだね。
そうではなく、1箇所にしか書かないから不整合が発生し得ない、というのがOAOOなりDRYだというのに。

Goは人間がソースコードをメンテすると仮定してない。それでついてこれる奴が多いかどうかだね。
俺は無理だと思うが。

関数型が急速にポシャった感があるのは、馬鹿しかいなかったからだと思っている。
Goもそんな感じがする。C++についていけない馬鹿しかいない感が酷い。
上記だって目の付け所が反対だ。
linterをフォークして余計な手間が必要ないようにコメント拡張を加え、どちらが支持されるか勝負するのがまっとうだろ。
プログラマとして未熟な奴がGoを支持してる感が酷い。
C++も一応スマポを使えばGC的なプログラミングは行える。
(俺はあれは糞だと思うし、普通にGC言語使えよ馬鹿なのか?としか思わないが)

というか、Goは完全にスタートポイントがCで、C++/C#/Javaじゃないね。
だからC++等がやらかしたことを再現している。歴史に学ばず、経験に学ぼうとしている。
多分Goはポシャる。
今必要なのは肥大化しすぎてデザパタ厨のような「目的と手段を履き違えた馬鹿」を生み出したOOPを整理することであって、
はっきり言ってこの「大文字な構造体メンバにタグをつける」スクリプトなんて既にGo厨化してる。
やることを「減らす」スクリプトを書かなければいけないのに、「増やす」スクリプト書いてどうするんだよ、というね。
0109
垢版 |
2017/11/17(金) 00:01:51.83ID:8APR9LzB
また斜め上の事言ってんのか。
0110デフォルトの名無しさん
垢版 |
2017/11/17(金) 00:20:20.06ID:r4qIw16A
96にあるようにjson用に構造体にタグを機械的に打つツールは既にあるよ。

もちろんそういうことを知らなきゃ、
冗長なコードを手打ちする羽目になるけど、
知らなきゃ苦労するのはどの言語だって同じだし。

俺はむしろgoの構文のシンプルさって人間が修正するだけじゃなく、機械が処理するためでもあるんだなって感動したけど。
0111デフォルトの名無しさん
垢版 |
2017/11/17(金) 00:28:42.55ID:r4qIw16A
>>108
あ、id の話か。
どうだろうね。IDでもidでもIdでも良いとしたら、つまりプロジェクトとして構文規約を作ろうってことになるよね。

それを始まりとして、プロジェクトによってコードの書き方が違うという分断化が起きる。
0112デフォルトの名無しさん
垢版 |
2017/11/17(金) 00:37:38.60ID:Vk6VJm9w
>>110
Goの言語仕様が糞でなければ、そんなことは最初からする必要が無い。
Go信者にはこの観点がまるでない。
100歩譲って、jsonのEncode関数にスイッチがあってもいい。
しかしそれもないだろ。

Goの仕様なんてかなり糞で、こんなのを教科書にしてたら勘違いすると思うぞ。(>>43)
いちいちやってることが回りくどすぎる。K&Rと正反対だ。
(ただしK&Rはこれまたさっぱりしすぎているが)

とはいえ、ここは合意を形成する必要はない。
俺はGoは糞だと思うし、今後使うことは多分ないだろう。
君がGoに賭けるのはもちろん自由だし、そうすればいい。
0113
垢版 |
2017/11/17(金) 00:44:31.04ID:fbp8aPNo
>>112
なら黙って去れよ。つかえねえなぁ。

そもそも、単語単位で命名規則決まってるからlint簡単だし宗教戦争起きないようにしてるんじゃねえか。
go runしか走らして無いんじゃねえの?
0114デフォルトの名無しさん
垢版 |
2017/11/17(金) 01:05:30.05ID:r4qIw16A
>>112
所詮はツールだから宗教戦争にしかならないのも確か。
vim vs emacs的な。

ちなみに一番理想的だと思ってる言語は何なのか知りたい。

俺自身はgoの言語仕様に欠点があるのは認めるよ。
でも、どの言語もコモディ化で割と似たような言語仕様になる中、独自性があって、素敵だとも思う。
何か言語設計者に信念を感じるんだよね。
ジェネリクスが熱心に要望されてる中、
未だに入れないのも何かもっと新しい手法を編み出そうとしてるんじゃないかと妄想してる。

phpなんか、片っ端から言語仕様足しまくってるし。動的言語のくせにinterface入れてみたりとか。


でも確かに最初に触る言語をgoにするのは危険かも知れない。
0115デフォルトの名無しさん
垢版 |
2017/11/17(金) 01:23:31.18ID:r4qIw16A
あとgoはast周りが充実してるってことは究極自分の理想言語を作ってgoのエコシステムを乗っ取るって手もあるよね。

rubyの作者が作ろうとしてるstreemって言語もgoをベースに作ろうとしてると聞いたし
0117デフォルトの名無しさん
垢版 |
2017/11/17(金) 09:32:12.45ID:5O5sG5Ab
Goの欠点と言えば、一度使い込むと他の言語で書きたく無くなる事だな
と言うか他をリーディングする時点でストレスを感じるようになる
Goならこう書いてこの辺りを並列したい、と読みながらGo脳になっちゃう
■ このスレッドは過去ログ倉庫に格納されています

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