Go language part 2
■ このスレッドは過去ログ倉庫に格納されています
かつ、interfaceが指す先の型がScanner実装してたらそれで勝手にやってくれんじゃないかなぁ、これは勘違いかもしれんが。 まぁ、やりもせず、パフォーマンス計測もせず、思い込みで「これはリフレクションである」と言われても困るわ。 空回りしてんの俺か? >>38 > てか、Go信者はこの言語のどこに惹かれてるんだ? > 特に目立ったメリットはないような。 ある種のシミュレーションプログラムを作るのに goroutine + channel で割合と簡単に書けちゃって、32 core 使って並列化したら実行時間が 1/25 程度に抑えられて…といった経験からかな。 ちゃんと言うと、Goのinterfaceはメモリ上に型情報をそもそも持ってるから、リフレクションせんでもほぼノーコストでアサーションできる、はず。 https://research.swtch.com/interfaces >>43 go fmtとか、パッケージ管理/ディレクトリ構造が言語に密着とか、確かにいい割り切りっぷりではある。 しかし他挙げてくれた点も、Go言語自体ではなくて、エコシステムの話だよな? いやもちろんエコシステムも重要なんだが。 gorutineはパンダだろ。その意見(最初だけしか使ってない)は割とよく見るよ。 > コード生成によるメタプログラミング まあCのマクロやC++のテンプレートよりはましかも。ソースが直接見えるという点で。 goroutineはAPIサーバ書いたり、システム内でメッセージ投げ合うたぐいの物書いたらめちゃくちゃ便利だけどな。 用途次第だろ。 >>45 そんな恐ろしいもんじゃなくGoコードを構造体に変換できるから 改変がし易いってだけじゃないかな。 正規表現で変更とかよりよっぽど安心できる。 >>47 goroutine+channelがはまったケースか。 それなら分かるとして、ただ、そもそもこれがはまるケースがほぼないよな? >>51 ハイジェニックなマクロ展開とか書きやすいしね。 前スレ974で良いところ行ってたのに、突然のシッタカでグダグダ言う上に読解力に欠けてて、しかもリフレクションだと決めつけてて、 人の話も聞かんと、言葉が理解できないならコードは読むだろうと解説代わり書いて、 Cがわかるなら.sに落として眺めるだろうという期待も裏切り、 何やってるかまったくわからん。 >>51 > 正規表現で変更とかよりよっぽど安心できる。 確かに。自前よりは公式解釈済みの構文木をもらえた方が100倍いい。 しかしそれ、渡されましても、、、ってのが普通だと思うが。 てか、これ見せてる言語ってこれまであったっけ? 最近はflycheckみたいなリントも流行ってるみたいだし、見せる方向なのか? >>49 俺にとってgorutineはたしかにパンダだったな。 構文規約が言語側で確定って割と言語仕様よりなんじゃないの。 Go言語の言語仕様は物足りさは感じつつってのはある。 interfaceがGoにおけるキモなんだけど機能不足感があって 関数の引数がなんでも受け入れokな interface{} 型になるとかなり残念になる。 多分interfaceにプロパティをokにしたり type interfceC =interfaceA | intrefaceB (interfaceCはinterfaceA か intrefaceBどちらかを満たす 直和型ってやつ) みたいな定義をokにしたり、シンタックスシュガーだけど type interfceC =interfaceA & intrefaceB みたいな定義もokにしたら幸せというかジェネリクスに進化できる気がする >>52 はまる、はまらないで言ったらやっぱり……いや、もう何も言わないよw 何か得意分野があるってだけでその言語は魅力的じゃないの? rustとか言語ヲタじゃないと触ろうってならないし。 goはCLIツールを作るためのライブラリも揃ってるし ツール作る系でもおすすめ 他の人もそれを踏まえて、って誰も勘違いしてなくねえか? 呆れるやつ、ASTいじりはいいぞ、気に入ってる点、諸々。 語るに落ちられてバカさらされて、なんでこんな言われなならんのだ。 >>57 まじかよ!JavaScriptならevalできるし無限増殖できるぜ!って思ったけど、 俺が思ってたASTのフォーマットとものすごく違ってた。 これ完全に文字ベースだよな。 もうちょっとファンクションベースなものを期待してた。 メトリックスをASTから抜いたツールもあるようだが、これ相当死ねるだろ。 http://azu.github.io/slide/JSojisan/#7 まああくまでパースした直後のデータで、だからこそすべての用途に使えるってことなんでしょうな。 ただ、ここからコード生成も相当死ねると思うが。 見えないフリしてないで>>48 を百回ぐらい読んでこいよ。 そして長文で語れよ。 空回りしてて荒らしでそれもわからないバカなのは誰なのか、どうすりゃいいか>>41 読んで考えろ。 >>56 interfaceのプロパティってのは何に使うんだ? 俺は一応、Goのインタフェースシステム「実装してたらその型として使える」はありだと思っている。 平べったいダックタイピングというか、C++のtemplateを野良で転がしているのに近い。 貧弱かどうかって所まではまだ味見できてないから分からない。 直和や直積(でいいのか?)は別名でテンプレート書け、って文化なんだろ多分。 割とベタが好きな言語なんだと思うよGoは。 虚しくなるわ。悪かったな。interfaceの実装知ってて。 >>62 escodegenがこれ食うからいいんだよ >>65 の訂正 × 別名でテンプレート書け ○ 別名でインタフェース書け とにかく汎用ライブラリを作ろうとするなり触ろうとするとinterface{}型が登場するのは機能不足によるものだからもっと頑張れ。 と言いたい。コード生成で頑張るべきなんだろう。 goaはコード生成に頼りまくりのおかげでinterface{}型に出くわすことがなくて幸せ。 >>69 interface型は宣言がそうなだけで、実際には型持ってるから、そこまで嫌わんでも良いんじゃないの? default書くのをサボらなければそうそう死なん。 >>70 んなこと言ったら動的言語だって内部的には型を持ってるよ。 問題はintereface{}型が関数パラメータに使われた場合、 Printlnみたいになんでも受け入れ可能って意味ならいいんだけど、 実際にはGoの表現力が不足していて仕方なくってパターンが多い。 >>71 動的言語の良いところを取るべくして、ただのvoid*には無い機能をもたせてるんよ。 表現力が足りないと言うより、ではなくて、本来は型にアサーションするんじゃなくて、別の任意のinterfaceにアサーションして便利に使おうね、って感じの思想。 だから、printf渡すだけでも、%sで渡すとStringerとして扱われたり、%+vで中身が見れたり玉虫色の解釈が出来るようになってる。 何でも受け入れ可能だから形無しinterfaceではなくて、こいつの型は提示せんがフォーマット文字列の通りに扱えよ、という意味であの引数。 だから、interfaceは明示的に実装しなくても、満たす関数があれば自動的に実装されるようになってる。 俺が今こうinterfaceを宣言して、そうするとこの構造体には自動的に実装されてるはずだから、俺は与えられた引数を宣言したinterfaceとして扱うってアサーションがかけれる。逆に言えば、俺に処理してほしけりゃこれを実装しとけ、って発想。 後出しジャンケンみたいなジェネリクス。 話題()の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が足りてないとか大嘘。 長くて読んでないけど静的言語を使いたいものとしては極力コンパイル時に解決したい。interface{}に頼ると実行時エラーが発生する可能性が増えてエラー処理の記述量がふくらむから嫌いなの。 それだけ。 そりゃまあ、便利さとリスクの天秤でしか無いわな。 あとからStringerにして、そいつの中で実行時に死にうるコード書いたら、全くソース変えてない部分で実行時エラーになるんだし。 実質sprintfなんか使えないコードになってしまう。 まぁ、interface受けてるのにアサーションしてないとか、default書いてないのが一番悪い。 defaultはエラー処理じゃなくて正常系。 親切な人が多いけど、ウンコが混じってもコミュニティの役にはたたんよ? リーナスも言ってるでしょ、基本的には去ってもらうこと、これが最も良い解決策。 向上心が有るなら別だが、基本が納得出来ないなら「どうぞ、どうぞ」が一番良い >>77 デメリットと言うより、必要悪だろ。 一切キャストしないCも書けるが このスライド出す時点でナンセンス。 PHPの変数は暗黙的変換で無残なことになる、数や名前や型の不一致はそれこそ、毎度構造体を作る事によって引き起こされる。 val,ok := アサーション でokが見れるという点で殆ど対応できる。 Bugクラスが未定義、と言うところもおかしいわな。 interfaceを実装してればそれがなんであれそのinterfaceとして扱えるように、ライブラリ書くだけだろ。 ただの型チェックの防御的プログラミングとは違う。 interfaceとのチェックと、interfaceに任せる事での、そのロジック内での処理と切り離した、interfaceへの責任転嫁に近いが、 interfaceをいかに正しく定義、実装するか自体が問題であって、型は無くて良いよねって言ってるわけじゃない。 オブジェクト指向だと考えるのが一番いかんな。 ToString()を全ての型が実装してる、と言う発想じゃなくて、 プリミティブはあくまでプリミティブ、Stringerならば、Stringerとして処理できる、という逆の発送。 よーく読んだら、このスライドで話してることが(責務の分担(interfaceとinterfaceへのアサーション)、 疑いがあるならば即落とすべき(panic)、 mixedでのリターン(標準)、 クラスが未定義の場合何をするか(defaultでの無視)) と、全くGoのinterfaceでの設計意図と矛盾しないことぐらいわかるだろうにな。 世知辛いわ。 >>81 の言ってることが全く理解できないのは俺だけかな?なんだろういくら話してもすれ違い感が半端ない。 誰か翻訳して! >>82 お前が、interface{}を、なんでも渡せるvoid *的な物として考えてるから理解できんのだろうな。 コンパイル時に誤りに気づきたいのは、要は、動作させるまで正常に動くことが保証できないのがいかんのでしょ。 あとからファイル足して、既存コードの動きまで変わる(シグニチャがあってればinterfaceが実装される)言語で、何言ってんだってレベルの話。 どう動作させても最悪、処理対象外データとしてスルーするようにdefault書くのと同じようなもんで。 本気で適当にgeneratorで作った得体のしれないものを関数に渡してるような奴でもあるまいし。 すれ違い感半端ないのわ俺だわ。 何か俺が書いたこと間違ってる? どう動作させても最悪、処理対象外データとしてスルーするようにdefaultに書いておくのと同じようなもんで、形チェックに通るか通らんなんか、ポインタがある時点でどのみち同じようなもんで、と書こうとしたら大事なところ抜けたわ。ごめん。 なぁ、俺が持ってるGoの知識は古いのか? 1.8まではソース大体読んでたが。そんなに読み違えてる? ソース読んで、設計思想まで理解したやつが「黙れ」って言うならもう黙るわ。 今まで俺が書いてたような内容は標準ライブラリがほぼそのまんまの事してる内容ばっかだよ。 fmt.Printfだけでも一読の価値はあるんだが。 もう好き勝手書いてろと思えてきた。 これ、virtual持ってないよな?ジェネリックなんてまるでやる気ないだろ。 OOPが暴走気味でデザパタ廚のようなゴミを再生産しているのは事実として、virtualなしはいかんだろ。 それに対しての > 多分interfaceにプロパティをokにしたり (>>62 ) なら全くもって同意だ。というか、JavaScriptはこれができて便利すぎる。 むしろあれがC++に入らないのが不思議だ。 継承や委譲をこねくり回してデザインパターン(キリッするよりは、 JavaScriptのようにメソッドも第一級オブジェクトにしてしまって、簡単にvtblを手組できるようにした方が、 「見りゃ分かるだろ」的なソースを作りやすい。多重継承も楽勝で対応できる。 Goは多分行き過ぎたOOPの反省でinterfaceが1階層しかなく、この点はいいが、 せっかく第一級オブジェクトな関数をメソッドに代入できない点が糞だ。 これはinterfaceをプロパティバッグにしてしまえば解決できる。(62の指摘はこれだと認識している) 動的対応がいやなら再代入禁止で2パスコンパイル (インタフェース解決+オブジェクトコード生成)にすれば対応可能だ。 Goの作者はよほどOOPが嫌いか、ジェネリックなんて不要と思っているのだろう。 Goのinterfaceは静的ダックタイピングのためのものであって、記述コードを減らすためのものではない。 俺はこの点は全く気に入らないね。というかコードを減らす努力がGoには全く見あたらない。 おそらくそれがここ20年のソフトウェア産業の努力の方向だったというのに。 すまぬ、安価間違えた >>87 内安価は62ではなく>>56 ちなみに味見の結果は出た。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の方が圧倒的に多いのも事実だし、 関数型()みたいにポシャっても全く不思議ではないけど。 そうですか、ではそのように他の言語をお使いくださいな。 一歩引いて、ハサミを買ってきた奴が、 「これカッターナイフみたい使えねえじゃん!クソカッターかよ!クソだ! え?挟んで使う?馬鹿じゃねえの?俺はこれが切りたいから刃を立ててるの! 刃物で挟むとかちょっと違うオペレーションじゃん?それって効率悪いし、危ないだろ、考えろよ。 こんなもの、カッターナイフのかわりには成りはしないね! 断然カッターナイフだわ。ほんとクソ」 ってドヤ顔するのを見るのもちょっと面白いな。 馬鹿とハサミは使いようだが、馬鹿にハサミは使えないもんなんだなあ。 >>87 56だけどまぁ分かる。今TypeScriptでジェネリクス使いまくってるけど やはり静的言語に自由度を求めるとジェネリクスがほしい。 でもGoの言語設計ってコード生成しようぜって匂いを感じる。 パッケージ内に生成したコードを置けば自作の型にいくらでも機械的にメソッド追加できる。シンプルな構文でこういう自由度を確保してるのは良く出来てる感ある。 問題はコード生成するコードを書くのが大変ってことなんだよねw コード生成するコードを書くための仕組みがもっと簡単になればかなり使い勝手が良くなる。 実際ジェネリクス自体コード生成するためのコードをショートカットした技術って感じがする。だからちょっと複雑なことをしようとすると難しかったりする。 コード生成するためのコードは素朴な分そういう頭がこんがらがる感じはないかなと。 なんでジェネリクスが使えるか、型引数がジェネリクス関数の中で行う処理で必要な演算子やらメソッド呼び出しを実装してるか、だろ。 だったら、そもそもinterface受ければいいだけじゃん。>>56 でやりたいであろう直積も和も、interface側ではなくて、構造体側がどう実装するかでしかないし、 それも各構造体で両方実装するとか、各構造体を埋め込んだ構造体書くだけじゃん。 それは、型のないinterfaceで受けるべきじゃなくて、パブリックな「型のあるinterfaceで受ける関数に」から、プライベートな「型のないinterfaceを受けるが中でアサーションしてる関数に渡して」やるだけじゃねえの? その設計が面倒なら、ジェネレーターで組み合わせ爆発起こして遊ぶべきなんだろうが、 実際は型付きinterfaceで事足りないか?それ。 >>93 > でもGoの言語設計ってコード生成しようぜって匂いを感じる。 俺にはその嗅覚はないが、状況証拠からするとこれはその通りだ。公式ブログ(URL後掲)もあるし。 標準コマンドに go generate とか、最初からASTを見せる気満々とか、iota とか、ちょっと行っちまってる。 そしてパッケージ内に階層がなく、 cat >> で全ていける。コード生成に障害が何もない。 首謀者は一般のプロダクトプログラマではなく、 サポート側のプログラマ(Perlでlinter等の作成とか)だったのかもしれんね。 C++のテンプレートはちょっと行き過ぎてしまっていて、余計に見にくくなってる。 例えば、形式的な無駄関数呼び出しがありまくったりする。 しかしそれらはコンパイラが最適化で抜いてくれるので、彼らはそれでよしとしている。 C++erの最優先はオブジェクトコードであって、ソースコードではないんだな。 無駄に回りくどくなったソースを見せられても困るんだが。 しかし考えてみれば、テンプレートなんて所詮はコピペだから、機械的に吐き出すのは極めて簡単だ。 人間がゴリゴリテンプレートを書くのではなく、 自動コード生成前提で、そのために基本ベタ書き、ってのは逆転の発想だがありだろう。 いや正確に言うと、Cのマクロの基本はコピペ的使い方だから回帰か? とはいえCのマクロもC++のテンプレートも濫用が過ぎてるのは事実だ。 ベタなコードを自動生成してしまえ、ってのはありだろう。 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 する、とか。 上書きしない理由は、本来想定された用途がinterfaceを実装すべくレシーバをもった関数を生やすためだろ。 同一パッケージなら別ファイルで良いんだから。 こりゃ、2にもジェネリクス入るか微妙だな。 欲しい欲しいて声が挙がっても、要らんだろと言われ続けてるのがなんでかわかったわ。 既存機能すら理解してない奴らが欲しいって言ってるのか9割なんだろうな。 そもそも、「ジェネレータ」なんだから、既存のものを上書きするものでないのは自明だろ。 新しいソースをジェネレートすんだよ。 >>99 純然たる日本人だよ、たどれる範囲では。 日本語が解りにくいみたいなそういう言いがかりはナンセンス。 そもそも解りにくい日本語を喋れるのは日本人だけだ。 解りにくい○語を話せるのはネイティブ○語話者だけと大きくも言える。 韓国人が日本語の語順が不安定な部分使ってニュアンス出したりとか、逆にきちんと定義されてる言葉の使い分け使って煽れる訳ねえじゃん。 その結果例え解りにくいものになったとしても、あとから学んだ言葉が不得手な場合の解りにくさとは全く違う読みにくさが生まれる。 英語少々喋れても、口喧嘩はできなかったり嫌味が言えないのと同じようなもん。 >>100 > 解りにくい○語を話せるのはネイティブ○語話者だけと大きくも言える。 そんなわけねえだろドアホ 韓国人はマジで死ね >>101 理屈が通じないなんて、まさかそんな日本人、現代人離れした感覚持ってるとは思わなんだ。 説明には充分注意を払わないといかんな。 ASTの話題にちょうどいい動画見つけた。 エディタの壁を越えるGoの開発ツールの文化と作成法 https://www.youtube.com/watch?v=j57mMsJP37Y >>96 go generate自体はただのコマンド実行なんだから 上書きするコマンドを実行させちゃえばいいと思う。 作法としてNGってことなんかな。 windowsで開発していると goで作成した実行ファイルを実行するたびにアンチウイルスソフトのAVGが起動して スキャンを始めます goがコンパイルしたプログラムをスキャン対象外にする なんてことは出来なそうですし、スキャンをオフにするしかないのでしょうか? >>105 gopath以下を検索対象外すればいいのでは? >>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厨化してる。 やることを「減らす」スクリプトを書かなければいけないのに、「増やす」スクリプト書いてどうするんだよ、というね。 96にあるようにjson用に構造体にタグを機械的に打つツールは既にあるよ。 もちろんそういうことを知らなきゃ、 冗長なコードを手打ちする羽目になるけど、 知らなきゃ苦労するのはどの言語だって同じだし。 俺はむしろgoの構文のシンプルさって人間が修正するだけじゃなく、機械が処理するためでもあるんだなって感動したけど。 >>108 あ、id の話か。 どうだろうね。IDでもidでもIdでも良いとしたら、つまりプロジェクトとして構文規約を作ろうってことになるよね。 それを始まりとして、プロジェクトによってコードの書き方が違うという分断化が起きる。 >>110 Goの言語仕様が糞でなければ、そんなことは最初からする必要が無い。 Go信者にはこの観点がまるでない。 100歩譲って、jsonのEncode関数にスイッチがあってもいい。 しかしそれもないだろ。 Goの仕様なんてかなり糞で、こんなのを教科書にしてたら勘違いすると思うぞ。(>>43 ) いちいちやってることが回りくどすぎる。K&Rと正反対だ。 (ただしK&Rはこれまたさっぱりしすぎているが) とはいえ、ここは合意を形成する必要はない。 俺はGoは糞だと思うし、今後使うことは多分ないだろう。 君がGoに賭けるのはもちろん自由だし、そうすればいい。 >>112 なら黙って去れよ。つかえねえなぁ。 そもそも、単語単位で命名規則決まってるからlint簡単だし宗教戦争起きないようにしてるんじゃねえか。 go runしか走らして無いんじゃねえの? >>112 所詮はツールだから宗教戦争にしかならないのも確か。 vim vs emacs的な。 ちなみに一番理想的だと思ってる言語は何なのか知りたい。 俺自身はgoの言語仕様に欠点があるのは認めるよ。 でも、どの言語もコモディ化で割と似たような言語仕様になる中、独自性があって、素敵だとも思う。 何か言語設計者に信念を感じるんだよね。 ジェネリクスが熱心に要望されてる中、 未だに入れないのも何かもっと新しい手法を編み出そうとしてるんじゃないかと妄想してる。 phpなんか、片っ端から言語仕様足しまくってるし。動的言語のくせにinterface入れてみたりとか。 でも確かに最初に触る言語をgoにするのは危険かも知れない。 あとgoはast周りが充実してるってことは究極自分の理想言語を作ってgoのエコシステムを乗っ取るって手もあるよね。 rubyの作者が作ろうとしてるstreemって言語もgoをベースに作ろうとしてると聞いたし Goの欠点と言えば、一度使い込むと他の言語で書きたく無くなる事だな と言うか他をリーディングする時点でストレスを感じるようになる Goならこう書いてこの辺りを並列したい、と読みながらGo脳になっちゃう null安全な言語じゃないのはなんとかならないかな。 後付で実装するのは無理があるよね。下位互換性重視する姿勢みたいだし。 nullはなぁ。 unsafe使うともう闇過ぎるし、cgoとかでさえnullがある他の言語とやりとりできるし、 Kotlinみたいにvarに対してvalとか書けるようにしていったとしても、どのみち誰かが!(に相当するもの)で壊すかもしれない事に怯えるハメになるから、 最初から「nilかもしれないからチェック」って意識付けをさせてるのかもしれん。 タプルでerror帰ってくるのを無視するには_が必要みたいな感じで。 アンケートを募集してるみたい。 https://blog.golang.org/survey2017 とりあえずnil safeな言語にしてくれってお願いしてみた >>114 宗教戦争は結局自転車置き場の議論と同種で、馬鹿が無理に参加するからだ。 その点ではC++の割り切り、「ソースコードに過度の美を求めず、オブジェクトコードで勝負」ってのは正しいと思うし、 go fmt ってのもありだと思うが。 Goがまずい点は、後発なのに誰にも合わせる気がない点だ。 UpperCamelはC++以来(だと思う)既に30年「クラス」として使われてきており、他言語も全てそうなのに、 「public」と勝手に規定してしまった。このためにjsonがUpperCamelになってしまうわけだが、 これまた世の中JSONで回り始めて10年以上経ち、大体lowerCamelが使われている状況で、スイッチもつける気無いだろ。 略号は全部大文字?それは言われなくても大体そうだし、違反してたとしてもソース改変して再テストする価値はない。 そんなにマメにソースを改変したければ、ユニットテストではなく、形式検証ツールを提供するべきなんだよ。 > でも、どの言語もコモディ化で割と似たような言語仕様になる中、 結局ソフトウェア技術も成熟しつつあるってことだよ。 どう書くべきか、何をやってはいけないのか大体わかってきた。 > 独自性があって、素敵だとも思う。 ないね。独自性ってのはHaskellの「全面遅延評価」みたいなのを言うんだよ。 俺はHaskellが1990製だと知って驚いたが、それ程の独自性があれば20年後に話題になる可能性もあるということ。 Goには独自性なんて無い。一度廃れれば終わる言語だ。 「新機能」といえる物が全くないだろ。むしろ「ちょうどいい頃合」を目指している言語だ。 悪く言えば、全てにおいて中途半端でしかない。 > phpなんか、片っ端から言語仕様足しまくってるし。動的言語のくせにinterface入れてみたりとか。 PHPはミクロな点でゴミだが、マクロな点には多分ほぼ問題がない。(というほど試してないが、今のところそう感じる) 具体的に言うと、引数の順が統一されてなかったり、引数にすべきものを別名関数にしてたりとか、 そういう「1行内」の部分でいちいち引っかかり、ストレスが溜まるものの、 Goみたいに「言語仕様的に3回書かないと無理」みたいな構造的問題は(多分)ない。 > でも確かに最初に触る言語をgoにするのは危険かも知れない。 「いちいち書くことを良し」とするのはまずい。 (昔の意味での)コピペプログラム推奨になってしまう。 これを嫌って、「いちいちスクリプトで整形」なら確かにありなんだけど、実際は書いたほうが早いから書くでしょ。 初心者がスクリプトを書けるわけも無いしね。 メタプログラミング「推奨」ならいいんだけど、メタプログラミング「必須」ってのは多分間違いなんだよ。 > ちなみに一番理想的だと思ってる言語は何なのか知りたい。 (俺は言語コレクターではないのでバリバリに使ってる言語は数えるほどしかなく、偏っているかもしれんが) ないね。俺は「全ての状況で使える言語」が必要とは思ってない。使い分ければいいだけだ。 そして現状の棲み分け状況を基本的に肯定的に捉える。それは集合知としての結論である、という見方だから。 C++が再統一を目指して全機能を入れてる感があるが、ならまずGC入れろよ、と思うし。 最近気に入っているのはJavaScriptだ。だからAtomだElectronだという気持ちはすごくよく分かる。 ・手抜きが出来るわりに動作が速い ・プログラマの邪魔をしない仕様(自分の足を撃てる仕様) ・HTML/CSS なのがいい。最初は文法が簡素すぎて「こんなんでいいのか?」と思ったが、 慣れると最近のOOPは相当無駄(冗長)なことをやっていたのだなあと実感した。 ただしJavaScriptは言語そのものではなく状況が糞過ぎる。 Web上に間違った情報が氾濫しているし、(これはGoもだが) マトモにプログラミングできない馬鹿が偉そうに薀蓄たれてるところがどうしようもない。それで馬鹿が再生産されてる。 ただしこれについてはPHPerが原因だと見ている。 PHPerが(CSSの)classを正しく使ったHTMLを書けないから、JavaScripterがそれ以上になれない。 classさえ正しく配置されていれば、圧倒的に楽にJavaScriptを書けることを多分彼らは知らない。 先生が間違ったことを教えるから生徒が上達できない状況だ。 だからJavaScripterは基本的に勘違いしてて、自分が至ってない事を自覚できてない。これが本当にどうしようもない。 PHPerは自分が至らないことについては自覚できてる。 彼らはだいぶ馬鹿にされているらしいが、この点はJavaScripterよりだいぶマシ。 あと、JavaScriptは標準化委員会がマジで糞だ。 Mapに[]が使えず、またsizeとlengthが混ざっていてジェネリック出来ないとか、あれは標準化委員がコード書いて無い。 (ただしこれについては直せる範囲だからさっさと直せ、と思う) Goはこの辺さらに酷い。JSONの仕様とか、ありえないだろ。 あれはJSONモジュールを作った奴がJSON使ってないんだよ。完全に例の漫画になってる。; https://twitter.com/frontend_ux/status/692369282626383873 UpperCamelでJSONしてるサイトなんてない。1回使えば分かる。 逆に言えば、1回も使ってない奴が作るからこんなことになる。 そしてそれを弾けない標準化委員会も相当低レベルだと分かる。 他モジュールも相当なゴミが混ざっていると思うぜ。Goがいい教材だと思う奴は程度が低いだけだ。(>>43 ) そしてJavaScriptとは違ってGoの間違いは救いようがないレベルだからどうしようもない。 あと俺が気づいた範囲だと、SQLite3はPHPでもNodeでもopenするときにReadOnlyかReadWriteを指定するのだが、 Goのdatabase/sqlではこの指定が出来ない。 俺にはこれがパフォーマンス等にどう影響するのかはよく分からないが、 根本的に間違ってるんじゃないか?と思うよ。 知らない奴/使ってない奴が仕様策定/基本モジュール提供をしてはいけない。 これも多分、普段SQLite使ってない奴が仕様策定してるからこんなことになってるんだよ。 Web系はよくも悪しくもここら辺に躊躇が無い(馬鹿が自重しない)が、結果的にゴミがゴミを再生産しているのはよく見かける。 しかも使ってる連中もそれに気づけないほど馬鹿なんだろ。だからマンセーするとかおかしなことになる。 俺はPHPもそんなに試してないが、Goはその一部分を移植しただけでPHPより問題山積だ。 >>115 > 究極自分の理想言語を作ってgoのエコシステムを乗っ取るって手もあるよね Goじゃなくて普通はCを乗っ取るだろ。Goも最初はそうだし、今も半分そうだろ。 或いは他言語みたいにJavaのVMに乗ってしまうか。 Goありきなのは既に信者だからだよ。 > streem 何用これ?streemでconcurrency?shellとか言っているし、何に使えるのかよく分からん。 実装は他人に任せてシステム設計に専念する方が良いんじゃないかw 大演説ご苦労だな。 アッパーキャメルも、型が後ろにつくのも、アンダースコアを避けるのも、大文字の定数を避けるのも、Pascalじゃん。 :=で普通は気づくが。 >>124 Uniform Resource Identifiers https://www.sqlite.org/uri.html に書いてあるURIフォーマットを使えば良いんじゃないかな。 db, err := sql.Open("sqlite3", "file:hoge.sqlite3?mode=ro") みたいな。 JSONがアッパーキャメルじゃない?でもGoはアッパーキャメルだ、だから歪んでる? ならなんでjsonパッケージにtags.goがあるんだよww 間違いじゃねえよ、そのままタグ書かずにMarshalするからだろ。 ホントドキュメント読まねえやつだな。 「一回間違って使えば誤解する」の間違いだろ。 database/sqlに、ファイルのオープンに依存する関数あるわけねえじゃん。だってsqlのパッケージなのに。 ドライバにやらせろよ。 >>127 それは全ての環境で使える物ではない。 Goの連中は(というかWeb系一般にそうだが)この手の未熟な奴が仕切って暴走しているのをよく見かける。 新しい言語は老害がいなくて心地よいのだと思うが、 結果的に若い奴らが浅知恵で馬鹿なことを繰り返しているだけになっている。 例えばxampp(今年の9月の最新版だったと思う)にバンドルされている物は3.7.6.3でそれは使えない。 なお同じxamppのPHPのSQLiteモジュールは3.15.1で、つまりPHP経由なら使える。(ちなみに最新版は3.21.0) 俺もこのxamppのバージョン管理は奇妙だと思うが、 これもxamppの連中が「一番無難なバージョン」を選んだからこそであって、問題ないのならそのまま使うのが無難だ。 こういうのがあるから、「最新版では要らないから」と早合点して勝手に仕様を削っていいものではないんだよ。 ここら辺がGo(というかWeb系全般)は拙い。プログラミングの経験が全般的に浅く、物事を知らないからだ。 JSONの件も、マジで1回でも使えばどこもUpperCamelなんて使って無いと分かる。あの仕様は本当にありえない。 作っただけ、動くだけで満足している連中しかいないからこういうことが繰り返される。 そして使えない物が再生産されまくってる。 だからWeb系も全般的に馬鹿にされるわけでね。Goも間違いなく同レベルだ。 >>130 Goでもアッパーキャメルで出すもんじゃねえよ。 ドキュメントに書いてあるでしょ。 変数名が何故あの形かも書いてあるし、一度でもちゃんとfmtから順番にツールにコード通していけば小言が読めただろうに。 xamppは一番無難な初期iniで使うのかねえ、ベルリンで。 要は SQLite の URI format を知らなかったんだろ? そもそもsqlパッケージ自体使い方わかってないんだろ。godoc読んだ形跡がここまで無いのも凄い。 略語が全部大文字どころか、こまごまいちいち指定してこられる事のメリットは、あとからインターフェイス書くときだよ。 関数名のブレようが無いでしょ。 >>121 >> でも、どの言語もコモディ化で割と似たような言語仕様になる中、 >結局ソフトウェア技術も成熟しつつあるってことだよ。 >どう書くべきか、何をやってはいけないのか大体わかってきた。 ここに俺は異を唱えたい。 言語の方向性は歴史的な圧力が絶対あると思う。 仕方なく大多数が採用したから新言語でも採用したみたいな。 例えばclassとstructってなんで2つあるの?って思ったことない? cの頃はstructはただの構造体だった。もちろんcにはオブジェクト指向の機能はないからstructにメソッドは生やせない。でもその後後発の言語はstructを拡張するのではなくclassを作った。でもsturctはそのまま残した。 swiftでも残り続けてる。値型と参照型の違いということで残したみたいだね。 意味がわかんない。 例外処理 例外が発生する可能性がある関数とない関数でコンテキストが大きく変わる。 そもそも例外処理って横着機能でしかないと思うんだけど。 そんなわけでgoはこの歴史的な圧力に対して異を唱えている。 それは本当に正しいのか!って。 >>132 それはその通り。俺は知らなかった。しかし、PHPとNodeではそれでも何も問題なく使えたのがミソなんだよ。 「Goは覚えることが少ない」なんて言っているのはプログラミング経験が浅い馬鹿で、表面しか見えないから。 或いは、他言語を使えないからGoの問題に気づけないだけ。 実際はこの手のGo特有事例(方言)がものすごく多い。(これについてはPHPより酷い) だから常識的にプログラミングするといちいち引っかかってしまう。熟練者にとって生産性が著しく悪い。 (ところが他言語を全く知らないド素人にとっては生産性が悪くないのがミソ) 「C++はプログラマを育てる言語だ」と禿は言っていて、実際にC++の連中は育っている感がある。 俺はJavaScriptもかなりいい言語だと思うが、こちらは壊滅的なほどに育ってない。 Goはどうか?俺はGoは間違った方向に育つ(使えない奴が出来る)言語だと思うよ。色々おかしいから。 それでもGoを信じるのは君の自由だが。 新しい言語には老害がいなくて心地よいのだろうが、それは達人もいないことを意味する。 色々仕様がおかしいのは、つまりそれにも気づけない馬鹿しかいないことの証左だ。 (上記のように、熟練者除けを装備してもいるし) K&Rの評価が異常に高いのは、さらっと書いてあるコードの品質がとんでもなく高いからでもある。 有名なのはmallocだが。 http://www.wdic.org/w/TECH/malloc そういうコードは今のGoには無いと断言できるね。 今のGoはお山の大将が出来ることがうれしいだけの馬鹿しかいない。だからこんな糞仕様がまかり通る。 それでもGoを選ぶのは君らの自由だが、当然その責任も数年後に負うことになる。 それは自己責任だから、君らが思うようにやればいい。 責任を負うことの出来ない俺が「止めろ」ってのもおかしな話だし。 ただ、俺がもし学校の先生だったら、この言語を教えていいのか?と躊躇する言語だよGoは。 とはいえ、成否は俺には分からんね。 俺達がゆとりに死んで欲しいと思っているのと同様、ゆとりも老害に死んで欲しいと思っているのなら、 ゆとり専用言語で棲み分けするのもいい手だ。Goはここに位置できる。 そこで好き勝手やってみるのも悪いことではない。それでどっちが残るか勝負すればいい。 >>135 > 例えばclassとstructってなんで2つあるの?って思ったことない? それは歴史的「圧力」というよりはただの後方互換性だ。 冗長といえばそうだが、かといって削除するほどのことでもない、ということ。 C++のstructとclassなんて、デフォがpublicかprivateかの違いしかない。 当然、明確な使い分けはない。では実際どうするかというと、 クラスとして「主体的に動作をする」のか、データとして「外部から操作をされる」のか、で分けるのが一般的か? つまり、お前らが言うOOPか手続きかで分ける。 しかしこれは、初心者にとっては意味不明すぎるのも事実。 おかしいだろ!整理しろ!というのはごもっとも。Goがstructだけに絞ったのも、別段問題ない。 ただ、これで生産性が上がるわけも無く、だから他言語では放置されてる。 なんつーか、どうでもいいわな、というところ。 > そもそも例外処理って横着機能でしかないと思うんだけど。 その通りだが、要するに、よく使う機能だから言語側にサポートを入れた、というだけ。 無ければ伝言ゲームをする羽目になる。 自前のオレオレ伝言ゲーム構造体よりは、言語側で規定してて言語機能に入っているほうがマシだろ。 ただここに至ってGoの実装はよく分からんね。 あれは自分で「毎回チェック」してthrowするのが必要なだけで、panicした後は従来の例外の様に動く。 catch/finallyでグダグダ書くよりdeferしろってのは一理あるが、 例外を使いたがっている奴はそもそもの「毎回チェック」を書きたく無いからだろ。 Goの例外がどういった層に喜ばれるのか(どういうメリットがあるのか)よく分からん。 >>136 同意する部分は多々あるよ。 >「Goは覚えることが少ない」なんて言っている >実際はこの手のGo特有事例(方言)がものすごく多い シンプルさを意図して実際は中味の複雑さがにじみ出ることは多々ある。 nilでも型があるとかね https://golang.org/doc/faq#nil_error だから蟻地獄的なものはあるかも。 >「C++はプログラマを育てる言語だ」と禿は言っていて、実際にC++の連中は育っている感がある。 これは知らんかった。禿って誰のこと? 正直C++勢と会ったことはない。web系と断絶してる感じする なんで育てる言語がC++なの >だから常識的にプログラミングするといちいち引っかかってしまう。熟練者にとって生産性が著しく悪い。 >(ところが他言語を全く知らないド素人にとっては生産性が悪くないのがミソ) もしかしてIDE使ってないの?vscodeとか。 俺もTypeScriptとかいろいろな言語を使ってるけど 言語仕様で引っかかってもその場でIDEが指摘してくれるから、生産性に問題は起きない。 そもそも第一言語としてGoだけ使うって輩はないだろ。多様性を楽しむくらいの余裕があってもいいと思うけど。 関数型も書いてて楽しい。Elixirとか。Haskellはちょっと挫折した。 ちょっとぐぐってみたら面白い記事を見つけた http://gihyo.jp/news/report/01/GoCon2014Autumn/0001 言語が思想に影響するという説(サピア=ウォーフの仮設) があるからあえてGoにはあなたが方言と言ってる違いを設けて 多様性を確保したいらしい。 >>138 ヒープに値が乗るかポインタが乗るかで全然違うだろ。構造体とクラスは。 後方互換製でも何でもなく、使い分けとるわ。 >>141 概念としてそれをclassとstructに分ける必要あるかって話。 >>142 使い分けてるんだから、必要あるってわかるだろ。 ベクトルなんかをそこそこの量処理したいとき、そのベクトルを表すものがクラスか構造体かでかなり違う。 彼が言ってるような歴史を辿ってきたJavaやC#みたいなGCを持つ言語だと、GC対象か否かという点でもメチャクチャ違う。 >>140 > 同氏は,Go言語はスケーラブルなクラウドソフトウェアのために設計されたきれいな手続き型言語であると述べていました。 あーなるほどね。反OOPか。 Cが生まれて50年弱経ち、ソフトウェアテクニックってのはほぼ固まりつつある。 その状況で若い連中が何か新しいことを思いつき、しかしそれを老害が腐してそのアイデアが埋没してしまうようなら、 それは勿体無いから、若い連中用のプレイグラウンドはあるべきだ。Goはそれに成り得るだろう。 ただし、そこで試されるアイデアの大半は既に誰かが試してゴミだったからポシャった物であり、 つまり「歴史」ではなく「経験」に学びたい若者が「車輪の再開発」をする場でしかないわけだが、 それもまあ必要悪というか、更なる発展の芽を探す為には仕方ないのかもしれんね。 ただそれで無駄言語に傾倒することになる若者は哀れだが、自己責任だから致し方なしか。 心配せずともGo言語で何かめぼしい成果が出れば、C++他は数年後には確実にパクる。 正直、遅延評価を既存言語機能だけで丸パク出来たのには驚かされた。templeteの汎用性を俺は舐めてた。 Go言語で出る成果でC++がパクれない物はたぶんありえない。もともと似てるし。 OOPが暴走気味なのは事実としても、現実解としてOOPしかないからみんなOOPしてるわけで、 そこに刃向かうのはもちろん自由だが、それでpackageが解なの?うーん、といったところか。 それならCでいいじゃん、になってしまうし。 >>139 > 禿って誰のこと? 禿=ストロウストラップ=C++作者=https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%A3%E3%83%BC%E3%83%8D%E3%83%BB%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B4%E3%82%B9%E3%83%88%E3%83%AB%E3%83%83%E3%83%97#/media/File:BjarneStroustrup.jpg > 正直C++勢と会ったことはない。web系と断絶してる感じする 話してみたいのならスレにでもどうぞ。それがネットの正しい使い方でもある。 ただあいつらの話題って重箱の隅どころでは無いからなあ、、、 > なんで育てる言語がC++なの 知らん。禿が著書でそう主張している。そして確かにそんな感じだ。 おそらくC++の奴らは自分でいろいろ試して、結果的にいろいろひどい目に遭うからだよ。(追体験) 例えば、「グローバルガー」とか言うWeb系の奴、実際にグローバルが問題になるほどの規模のコードを書いたことがないだろ。 そういう、薄っぺらい馬鹿が威張っている感がC++erにはない。 C++erの場合は、実際に「便利だから」グローバルを使い、結果的に苦労して、 どの規模の辺りからグローバルはやばいかを知った後で話をしている。 そういう、地に足が着いている感がある。 一方Web系は「経験に学ぶのは愚者。俺達は歴史に学ぶ」と言い、この手の追体験を拒む。 そしてグローバルガーと連呼したりするが、実際にはその規模ならどうでもいい場合が殆どだ。 ここら辺が地に足が着いてない。教科書(歴史)を妄信してる感ありあり。 しかしそのわりにGoで経験に学ぼうとしているのは、結局OOP流に嫌気が差しており、自由にやりたいだけだろう。 (まあ気持ちは分からなくもない。JavaのOOPとか完全にやりすぎだと思うし) それが自分達が言っている「経験に学ぶ愚者」に該当する自己矛盾に気づかないのが愚かなところだが、 Web系の連中にとっては経験こそが足りないから、色々やってみるのもいいとは思う。 今はソフトウェア技術の規模が微妙な時期なんだよ。 数学のように「全ての分野を網羅するには人生は短すぎる」程の広がりはなく、 これまでの全ての問題を一つ一つ追体験するのも無理ではない。グローバルしかり、ポインタしかり。 もちろんそれは無駄だとして「歴史」に学ぶのも一つの手だ。 ただし実体験と教科書の知識だけでは重みが違うから、そこらへんがWeb系全般のフワフワ感につながる。 とはいえ、今後ともソフトウェア技術は肥大化する一方だから、今後の学び方としてはWeb系流の方が正しい。 ただ、今はまだそのシンギュラリティに到達しておらず、C++流の学び方も成立するってだけで。 > IDE 文法が分からない=指摘されてもどう直してよいのか分からない、のだからそれ以前だよ。 ただしvscodeだとC#流の「;が抜けています。追加しますか?はい/いいえ」で行けたのかな? それなら入れておくべきだったかも。実際はemacs+flyCheckでやった。 ただし既にPHPとNodeで動くコードをGoに移植だから、引っかかるのは全てSyntax/API/Go方言なんだが。 > だから蟻地獄的なものはあるかも Goは多分、思想がGoだけで完結してるんだよ。 「驚き最小」ってのはGoの世界ではそうなのかもしれんが、 nilがタプル(というよりポインタが全部タプルか?)だとは普通のプログラマは思わないから そこは「驚き最大」だ。 それならそれでいいとして、だったら最初にそれを言え、なんだが。 Goは割と想定外のところでバグるんだよ。 この点、実はJavaScriptはC的で、文法だけ抑えたらあとは、あー、はいはい、で行けた。 だから俺(というかC使い)にはJavaScriptは相性がいい、というのはある。 Goは妙なところでGoだけの世界を作ってるだろ。これが吉と出るか凶と出るか。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる