golang.jp は、エイベルの古川昇部長が、社内で始めた翻訳プロジェクトだろ? 最近は、活動してないのか? 改訂2版 基礎からわかる Go言語、古川昇(エイベル)、2015
先週から仕事でGoやることになったんだが、この言語辛すぎないか・・・? ジェネリクスないしエラーが辛い。ジェネリクスは2.0で入るらしいが。 Goの作法だとエラーハンドリング忘れて次の処理を書けるリスクが常に孕んでてて書いてて全然安心できない。 あと詳細なエラー情報見ようとするとcustomErr,ok:=err.(CustomError)みたいにしないと情報とれないの危なすぎでしょ。 なんでカスタムエラー型認められていないの?
>>6 認められていない訳じゃない しかし、カスタムなエラー型だと正常時にnilが帰ってきた時に if err!=nil {} がtrue判断を食らうという厄介なバグがある これは型付きnilというバグだが、仕様と言い張ってる模様 仕様なら、the predeclared identifier nil, which has no typeの記述とか直せや! >>6 エラー処理を忘れるうっかりさんは例外だってキャッチ忘れるだろな そして、エラー処理は1.13でほんの気持ちだけ改修入ってるからチェック Is, As >>7 認められてないというよりか風潮といった感じか カスタムエラーがstructじゃなくてinterfaceならいけるんじゃない? まあどのみち使用しているライブラリがerror返してるからどうしようもないんだけどな 俺はMySQLのエラー番号が知りたいだけなのにどうして危険な操作を強いられるんだ >>8 まず俺はGoのエラーと例外を引き合いに出してはいない(例外は糞だが) 例えば関数の戻り値がT,errorのような場合でerrorじゃないときだけTの戻り値にアクセスできるような仕組みが欲しい ScalaのEitherやRustのResultのようなやつな 今はジェネリクスないからそういう実装はできないだろうけど そもそも職場の制約で.1.13は使えないが、IsもAsも対してかわらんなって印象だわ。 ライブラリの実装者が中で返すエラーの型を変えた場合、IsやAsしててもコンパイルエラーにならず適切なエラー処理ができずに実行されてしまう。 戻り値の型できちんとカスタムエラー型を明示してくれてればコンパイルエラーで気づけるんだけどな 今さっき聞いたんだけど、2.0で入る予定のエラーハンドリング周りのサポート、error型のみが対象らしいんだってな。 2.0にはいると本当にカスタムエラーの道が閉ざされてしまいそうだけど本当にそれでええんやろか エラー処理の観点から見るとジェネリクスないのはもう相当きついね 関数型脳は捨てるしかない
まあRustも関数型言語かというと違うけどな。標準ライブラリにはモナドないし。 ジェネリクスが必要なものに関しては今使えないから仕方がない面はあるとは思う。 ただカスタムエラー型が実質使えない状態になってるのは辛いなあとは思う
2MBは静的リンクされてる実行ファイルなら普通よ C系のリンカーの出力だとままある 動的リンクされてDLLとかアセンブリとかSOをロードする実行ファイルとは違う ロードが速いはずというメリットもある
せやな この特性でインスタンスの起動が早くてクラウドだと重宝するね 反面WASMとかだと辛いという話は聞いている
そもそもC/C++自体がすでに第一選択の言語じゃなくて、応答性やパフォーマンスの問題で消去法で選ばれる言語だし、 Goはそれで弾かれる側の言語なんで無理無理 Goが選択肢に入るような要件ならC++は選択肢に入らないし、逆もまた然り
しかし、C++は他に選択肢が無いというよりアセンブラより生産性が高いという消去法で選択される言語 C++よりも生産性が高いと思う人間、例えばGoogleとか俺にとっては消去法での乗り換えが充分に考えられる
あ、もうちょい書き足りなかった つまり、ベターなアセンブラの地位をC/C++から奪おうという狙いの言語、という位置付けだと考えるよ
笑っていればいいさ、20年前にJavaが将来のメジャー言語になると言ったら馬鹿にされるのは必至だったし
まあ、linuxカーネルがCで書かれる限り、Cの牙城を崩すのは夢物語なのは間違いない
1999年ならjavaはすでにメジャー言語でしたけどね
var hoge uintptr = 123 動く(1) hoge := uintptr(123) 動く(2) hoge uintptr = 123 動かない(3) hoge uintptr := 123 動かない(4) やっぱり面倒なんだよね 良い方法ないですか あと(2)があまり使われないのはなぜ?
>>24 ほほう、EclipseもstrutsもJITもない1.2の時代でメジャーとな? 使ったこと無いから的外れかもしれないけど、uintptrなんてunsafeな箇所くらいでしか使わないと思う(アーキテクチャ依存だからという理由 そんなuintptrを簡単にという意図がわからないので、解説plz
根拠も何もなく笑って誤魔化す人に笑われても痛くも痒くもないね そこでどうぞ笑っていてくださいな
Cの整数リテラルに付けるサフィックスみたいな? 1234LL とか 1234ULL
>>27 当時のTIOBE IndexでC、C++に次ぐ3位ですけど 全然関係ない話 公式のドキュメントのフォントがChromeとかで汚いと悩んでたんだけど、実はGoogleのRobotoフォント入れれば良いんだな
そんなのuser.cssでいくらでも好きなようにできるじゃん
:= と = の使い分けが構文的に破綻してるように観える
var s []byte = "abc" string(s) // OK s.String() // undefined var b bytes.Buffer string(b) // cannot convert to string b.String() // OK なんかこの辺もいまいち
a) var hoge bytes.Buffer b) hoge := bytes.Buffer{} c) hoge := new(bytes.Buffer) これは全部同じか?
&xxxxx{}の方が直接的で字数も短いからnewって使ったことも無かった 何のためにあるの?
>>35 なんかしばらくしたら元に戻っちゃったんで、user.cssに戻した 面倒なんだよー chrome拡張でuser.css使えばいいだけじゃん
errorはインターフェースだからswitchで処理するんじゃないの?キャスト使うの?
errorがつらすぎるError()stringだけで表現しきれないよ
たまにgoやると、そのたびにテンプレートリテラルがないことを忘れててショックを受ける
Go って GAE とか GCP 以外ではどんなところで使われてますか
LLで書かれていたserver-sideの置き換え
>>48 ありがたくGogsを使わせていただいてます >>48 ありがたくDockerを使わせていただいています。 { "name": "Tanaka", "age": 26 } { "name": "Tanaka"} { "age": 26 } {} みたいに中身が入ってるか不確定なjsonlファイルを上手くcsvやtsvに変換する方法ってありますか?
普通にjson.Unmarshal()するだけで、mapになるそうだから 入っていないキーは入っていないと分かるのとちがう? 設定ファイルとか使うコード書いたことないから受け売りなんだけど
いまいちカッコ悪いが、 各フィールドをinterface{}で受けて、有無をnil判定するのはどうか type Person struct { Name interface{} `json:"name"` Age interface{} `json:"age"` } func encodeField(v interface{}) string { if v == nil { return "" }; return fmt.Sprint(v) } func main() { var persons []*Person json.Unmarshal([]byte(`[{"name": "Tanaka", "age": 26}, {"name": "Tanaka"},{"age": 26}, {}]`), &persons) w := csv.NewWriter(os.Stdout) for _, person := range persons { records := []string{encodeField(person.Name),encodeField(person.Age)} w.Write(records) } w.Flush() } 【出力】 Tanaka,26 Tanaka, ,26 ,
書いた後にアレだが、 >>55 のやり方のほうが良い var persons []map[string]interface{} Goってjqみたいな機能無いのか jsonの全パターン書くの辛くないか? { "name": "Tanaka", "age": 26 } だけで残りの3パターンも補完できれば汎用性のあるものができそうだが
>>61 >jsonの全パターン 何を言ってるのか分かりません >>62 { "name": "Tanaka", "age": 26 } { "name": "Tanaka"} { "age": 26 } {} みたいに全部定義するのがめんどいってことでしょ >>64 定義って、それはテストデータじゃない テストデータ書かないでサンプル書くの? とかすっとぼけて書いたが、誰かjsonの形式の定義が必要なサンプルコードを書いたりしたか?という話 そもそもが内容が不定なjsonを解読するって話だから、皆さんそれを読むサンプルコードを書いてる つまり、レス主はそれらのサンプルコードを読んでないんじゃね? Unmarshal()の引数に[]interface{}の変数のポインタを渡すと、マップとスライスで構成されたjsonの中身がエンコードされるという前提知識で話してるのに キーをフィールドとして事前定義しなきゃならん、構造体のスライスへのポインタを渡す形式の呼び方での話を持ち出されても困るんだ んでも、構造体を切ることをパターンと言っているのではない可能性もあって、一応確認
【質問】 goroutineはデーモンスレッドみたいにプロセスが死ぬと終了します だから後始末をしたい場合、子にはcontext.WithCancelで終了を通知、受け取ったら後始末 そして、親はsync.WaitGroupで完了待ちしています んでも、もっとうまい方法ってないものかな?面倒 Javaだとスレッドをinterruptして、子はInterruptExeption拾って後始末して、親はjoinして待つじゃない 主にInterruptExeptionをキャッチするコードを書くだけで済む もしも親から狙ったgoroutineに特定のpanicを起こせるなら、recoverで拾えるかなーと…
暗黙で thread safe になるからじゃね?
Most Popular Programming Languages 1965 - 2019 VIDEO >>67 狙ったgoroutineにってのが推奨されてるかはわからんけど、レシーバなり関数のパラメータなりにid持たせて、終了通知channelにそのidを送って受け取った側で処理する、とか >>73 それは多態になってない 呼出元が直接Sub.Msgを呼んでるだろ >>76 Inheritance.Msg()じゃないの? >>76 うん、BaseもSubも同じインターフェースに代入してメソッド呼んでるから、ちゃんと多態になってると思う それとも俺とかレス主が多態性を勘違いしてる? 新しいサイトのurlゴーデブとか俺をバカにしてんのか?
新しいサイト? 言語仕様ドキュメントが見つからないから、移行ではないよな? 何のためのサイト何だろうコレ
なぜかVScodeでmain.goだけ"fmt"とか全くimportできなくなってしまった language serverのリスタートもWindowsの再起動も駄目 なんじゃこりゃ、まいったね
>>88 コマンドラインからは叩けるの? 同じ現象なってたわ >>89 コマンドラインでgolintとか叩いても何も出ないね 今は出なくなってるけど、原因がわからない ちなみに1.13.1 >>90 俺もvscodeの再起動で治ったけど、module周りはちょいちょい不具合でるなあ。 importの警告がいきなりでてきたり >>91 また modules か modules ってどうなるのかな? godoc が動かない issue も目処が立っていないらしいし >>92 バグのあるバージョンがミラーに乗っかっちゃったらポイズニングするしかないのとかもなんとかしてほしい。 コンパチがゆえの弊害が出ている気はする。 >>88 import "./internal/config" とか相対パス参照を止めて完全パスでインポートしたらエラーが消えた 別マシンだと1.12だったからなのか動いてたんだけど、なんだこりや 環境変数 GO111MODULE を off にセットしてみたら
言語自体はそれなりに良いんだが開発状況見てるとと将来が不安。rubyに似てる。
>>96 最初からコンセプトがシンプルだから、rubyとまではならないんじゃないかな。と、思いたい。 あとケツ持ちがでかい >>94 go.mod に replace internal/config => ./internal/config と書いておくと import "internal/config" と書ける。 ./internal/config ディレクトリ内にも go.mod を作っておく必要があるけど >>95 環境変数見てもgo env見ても GO111MODULE= と設定されていませんね Goを始めたのが1.12だったから、そもそも必要なかったし >>95 ん、off?空指定とは違う挙動になるのかな? >>98 internal以下のパッケージの全てにgo.modを入れるのはちょっと… シンプルなのはいいんだけど golintでチェックされる命名規則が嫌すぎる キャメルでgetJsonDataとかだったか関数定義したら"JSON"と大文字で書けとか怒られた お前は姑か!
>>102 むしろoffじゃ駄目じゃん、modules 使ってる環境だから go.exe env GO111MDULE=on してみた >>102 あ、書き忘れ 1.13からのデフォルト変更は無しになってautoのままらしい off にして modules 捨てたらいいんじゃないかな
後は import "hoge-project/internal/config" って書くとか これなら go.mod を作ったり弄くらなくて済む
初心者なんだがcontextの使い道がいまいちわからん。 cancelとかなんかいいサンプルないかな。
>>109 使い方じゃなくて使い道かー んー、goroutineをポコポコ作る場面で、処理をキャンセルしたい事ってあるけど、作り散らしたgoroutineに通知しないとキャンセルできない そんなとき自前で仕掛けを作らなくてもcontextを使えばいい あとは、そういった処理にタイムアウトを実装したい時にも、タイマーが組み込まれてるcontextがある Valueは使ったこと無い ありがちなのはsigintしたときにすぐにプログラムを止めずに子のゴルーチンの処理が一区切りついてから止める場合とかかな🤔
改訂2版 みんなのGo言語、2019/8/1 買ってきた。 これは、文法以外の開発に関する本
>>112 んだね、自分はちゃんと後始末していることを保証するためにWaitGroupと組み合わせてる >>111 回答ありがとう そういうケースって、親がcancelしたら、goroutineはDoneを受信したら終了、って認識なんだけど、それって終了するためにfor、select前提、になるのかな >>112 それも考えてはみたんだけど、waitgroupか、キャパ付きのerrorChannelで事足りてしまうような。 context難しい。。 >>110 パッケージドキュメントだと、やはり基本的にループ待受なのね なんかイメージ的に、その文脈から派生した処理を上手いことその派生分だけ切り上げる、みたいな感じだったけど、contextWithCancel使う=ループ処理がある、なのかな >>115 そうなる 各goroutineではチャネルを読まないといけない んでもコード的に汚いから、裏技がないかと>67で質問したけど無いみたい interrupt panic とか起こせたらなぁ >>118 なるほど。参考になる。 channel読むの前提ってことは、やっぱり汚くなるよね。 selectで終了待受したいなら、中でさらにgoroutine生成してselectまで進めておく、しかないと なんかこう、WithCancelで生成したcontext渡してcancelしたらなにも考えることなく終わってほしいなー。 >>114 便乗して更に質問で申し訳ないが聞きたい。waitgroupって、個人的にはworkerの数が決まってるなら使うべき? wg使わずにキャパシティ付きchannelに放り込む、クロージャでdefer closeしてその後channelをrangeで回す。というのもソースコードではよく見る。 ここら辺なにが正解なのかわからんのよね workerの数決まっていないでチャンネル使うとキャパシティ以上にワーカーできたとき詰まって死にそう🤔
>>121 回答とサンプルありがとう。 質問の日本語がおかしかった。。 なるほど、こうすればchannelで送受信しなくても逐次的に処理できるということか。 ちなみにworkerの数が決まらないケースって、どんな場面で遭遇する? 常駐してて死なないアプリ以外にあんまり思いつかず >>122 受信側は無限に待ち受ける想定だとどうかな?というか、waitgroupを使わないユースケースがそれぐらいしか思いつかないんだよね waitgroupが有効なケース、だけどwaitgroupを使わないケースってどんなんがあるのかな。 >>123 常駐じゃなくても並列処理で足並み揃える時とかに使うかな 例えば並列で別のダウンロードさせたり >>126 そうか、パッと見ダウンロード処理を開始する時にwg.Add(len())すれば、とおもったけど、よく考えたら何をダウンロードするのかを取得する処理自体が並列化してる場合は、ソースみたいに自分でAdd(1)しないと並列化できないね。 とても勉強になった。ありがとう。 >>113 改訂2版 みんなのGo言語、2019/8/1 半分ぐらい読んだけど、これは、文法以外の開発に関する本で、 テスト・デザインパターンなど、 各言語の中級者向け「Effective 何々」に相当する本 effective goは無料で読めるけど全然似てない。適当こくでねぇ。
シマンテックのSEPがgolintを誤検知してさくっと削除
ジェネリックよりインターフェースのメソッド名をリファクタリングする機能が欲しい それとファイル内に閉じたスコープの新設
サクッとwebサーバー建てる時お前らエコー使うだろ? 後輩がジン一択言って譲らんのよ
go初心者です。 田中、佐藤、加藤からランダム(重複なし)で3つ抽出するにはどうすればいいでしょうか?
>>142 なるほど。 ただ実際は配列の大きさは100個くらいあって取り出す配列は5つなんですよね... >>143 重複なしならシャッフルして前から5個取れば良さそう >>144 すみません、前から5個取るにはどうすればいいのでしょうか? >>146 おー!これでいけそうです。 ありがとうございます。 interfaceをに包まれた2つ以上の変数が持つ型が一致してるか判定できる構文てある? こういうのはできないみたいだし… var x interface{} = int(12) var y interface{} = int(25) if (a, ok1), (b, ok2) := x.(int), y.(int); ok1 && ok2 { fmt.Println(a, b) }
まぁ、こんなんかなぁ… if a, ok1 := x.(int); ok1 { if b, ok2 := y.(int); ok2 { fmt.Println(a, b) } }
reflection ならこうかな import "reflect" if reflect.ValueOf(x).Type() == reflect.ValueOf(y).Type() { fmt.Println(x, y) }
型アサーション使っていいなら、型スイッチという手段も
golang関係ないんだが、50000番台ポートをlistenで開きまくるアプリ書いてるんだが、テスト実行毎にデバッグexeのパスが変わってWindowsDefenderがブロックしましたダイアログ出してきてウザいよぅ うちはSEPなんでお呼びじゃないし、更にブロックされてると主張してるがテストコードはガンガン通ってるからブロックしてねーし ともかく、デバッグexeの一時フォルダを固定する設定ってある?そうすりゃ例外設定書ける
ep8 ー ep7で雑に投げられた謎を雑に処理、端から解決する気無し。既存キャラの大幅劣化に加え、ローズ、紫バァ、暗号破りの新キャラ3人がヘイトの対象に(主にローズ) ep9 ー ep8の出来事はほぼ無かったことに…。大味極まりないが逆にそれが功を奏し、SWファンからの評価は概ね高い。興収でエンドゲームを超えられるか注目
>>159 知らんのでググって、最初にヒットした奴の方が良いな 具体的にはオプションはそれぞれ対象の構造体ポインタを受けとるシグネチャを持つ関数 そのメソッドのスライスを順に呼ぶと、関数が特定フィールドに値をセットするという作り まず、その方式だと型switchがいらない オプションを増やしたければセット用の関数を増やす 他の利点として、設定する関数では他のフィールドも参照できるから、矛盾のある設定を防ぐとか柔軟な設定もできそう ぱっと見、visitパターンっぽいアイデアに見えた (個人的な初見の感想なんで深く考えて言ってる訳じゃない なんだっけ、二重呼び出し? ひさしぶりにGO触ったら仕様変更の真っ最中なのね... 暫く冬眠しとくわ
いつでも仕様変更 ジェネリックス欲しがってる層って、何のクラスタの人なんだろ
ていうか Java のジェネリクスもおもくそ後付けやん
golangのゆるふわなinterface機構の上でジェネリックスの出番なんてそうそうあるものなのかな?
ちょっと凝ったことをしようとすると interface{} まみれになるところが改善できれば。
ジェネリクスはGo教において諸悪の根源とされる「利用しようとする前に利用される方を設計する行為」の最たるものだからなあ
自分としてはgolangの形式で動的にリンクできるライブラリ手法が欲しいな dllみたいなcgoなライブラリじゃなくgolangネイティブな形で interface定義とインスタンスをロードするビルダだけ静的リンクするスタイルを想定 これがあるとDIとかプラグインが捗るから 知らないだけで存在してたりする? それともdotnetのactivexみたいにdllに皮かぶせれば行けたりする?
ドラフトに挙がっている Go の generics(contract ベース)が採用されれば、 >>169 > ちょっと凝ったことをしようとすると interface{} まみれになるところが改善できれば。 inteface{} を使わなくてもよくなるんじゃないか、って期待してる。 まぁ、最終的にどうなるかは分からんけど… ジェネリクスは大体ライブラリとかそっちの方が実装してて普通は使うだけ 他の言語でジェネリクスないときはいちいち型キャストと型チェックしてたから そういうのが無くなって嬉しかったんだけどなあ
goでapiサーバーを構築したいんだけど、参考になるサイトとかないですか?
状態を変化させるAPIだと、API作るよりCORSとかCSRF周りの勉強がめんどくさい
WebAPIサーバーなんて、Qiitaとかそこらへんに転がってるような「GoでWeb APIを作ってみた」 程度の簡単なものが実際に本当にプロダクションで運用されてるもんだ。 ただしその前方や足元にはALBやらKubernetesやらがあって、信頼性やスケーラビリティはGoではなくそういったクラウドインフラの層で担保するんだよ。 Goをプロダクション運用したいなら、GoよりAWSの知識の方がずっと重要だ。
標準パッケージのjsonのUnmarshal なんでReaderインターフェースでなくてバイト配列を引数にしたんだろ? DecoderはSAXみたいなトークナイザだしなぁ
>>177 趣味のサービスかもしれんのに、何を先走ってるんだか? 少なくとも商売始めようという人間が便所の落書きで質問しないと思う >>179 いやNewDecoder(r).Decodeでいいだろ goルーチンってプログラム終了前に全部終了させる必要ありますか?
golangはgoroutineでNAMESPACEを適切にコントロールする手段がないのでDockerコンテナを記述するには適していない、という記事を読んだんだけど これって対策とかロードマップとか何か打ち出されてない?
記事読んでみたけど、問題はnamespaceそのものじゃなくてnative threadへのアクセスじゃないのかな。
言語選択ネタは基本的に使いたいものを正当化するためのゴリ押しになりがちだから話半分に聞いておくのが正しい態度
根本的な原因はそうなんだろうけど、クリアするハードルは名前空間なのかなと まあ、自分はDockerコンテナ自身には今のところ手を出す気はないアプリ作者だけど、ちょっと気になっただけなんだ 元からgolangはデバイスドライバとかの低レベルのシステム開発は対象としてないように見える(主観)ことから、それと同様に不要な機能としてガン無視なのかな? それならそれで文句がある訳じゃない
えーと、多分そう ツール書くのにperl awkからjava c#経由して今はgolangが便利すぎて引っ越してきた
過去ログ見たら別の人 自分はmodulesが安定しねーっ、と嘆いていたクチ
プログラミング言語ごとの年収 今のところGoはAWSやGCPを極めた人が使うイメージだな 年収が高いのもそのためだろう Goはドカタグラミングにも最適だから、もし今後も順調に普及していけば平均年収は大幅に下がりそう
覚えなきゃならない独特で特殊なことがインターフェースの概念くらいで、構文は平凡以下の厳選されたものしかないから学習ハードル低いよな 自分はc言語とJavaとJavaScriptを経験してるから、一週間でほぼ使えるようになった
下手すると何も特に勉強しなくてもただ人の書いたコードながめるだけで 「ああこんな感じか?」って雰囲気だけでそれなりのコードかけるようになっちゃう言語
goはシンタックスシュガー多めで、初学者が見よう見まねで学習すると嵌りやすい印象。
ほとんど使う局面がないstruct実体はでっかい落とし穴 実体配列rangeで回して更新されねーっと悩む初心者のいかに多いことか
>>204 ヌルポで落ちまくるよりは遥かにマシだわ むしろfor rangeで要素のポインタを取れるようにしてほしい 落ちるなら、そちらのほうが万倍はマシでしょ 落ちなくて値が更新されないという恐怖
golangのシンタックスシュガーは思いつく限りだと 1. := での型推論による変数宣言の代替 2. レシーバがポインタ型の場合に構造体実体でメソッドを呼び出すと、ポインタに変換して呼び出す C言語からの後方互換性を意識するなら -> は廃止しなけりゃいいのに、中途半端 モダンな言語と同じにポインタを参照と呼び替えて、実体が欲しけりゃunsafeでやれと
3. {フィールド:値, ...} 形式の構造体生成式 ・・・これは構文だしシンタックスシュガーなのか微妙 シンタックスシュガー多めという意見は、どういう観点で構文をシンタックスシュガーだと判断しているのか俺にはサッパリわからない むしろラムダ式(本来の無名関数という意味ではなく -> で書く記法)というシンタックスシュガーすらないgolangはむしろシンタックスシュガー少なすぎ(でもそこがシビれ
シンタックスシュガーといえば、&Hoge{ ... }で構造体を初期化しつつポインタを取れるのに、&1はダメなのがウザい
シンタックスシュガーというか、なんか一貫性に欠ける略記法みたいなのが多いような
多いような、と言われてもなぁ 略記法と言っても、_ とか [::2] とかしかぐらいしか思い浮かばないんで、具体的に
switch w := v.(type) はかなりエイリアン感あるな Goに存在する数少ない型推論と言えるものの一つ
一貫性に欠ける記述に思い至った スライスとマップだけ生成すると実体ではなくてポインタを返す やっぱり、構造体も生成するとポインタを返してほしかった 要らんよな実体
要らないというのはちょっと正確性に欠けてた 普通のロジックを書く場合には要らない DLL呼び出しとか、バイナリファイル書き出しとか、外部I/Fとして任意のアラインメントでのバイト列に直列化するパッケージがあって、内部では全て参照と言う名のポインタを扱うようにしてくれていたら何も問題は無かった 構造体ポインタでスライス作って、構造体のアドレスを入れて、という書き方を説明するためには、アドレスについて教えなけりゃならない それを理由として新人研修の言語教育の候補リストから落としたんだった
構造体がポインタじゃないのなんでだろ 結局全部ポインタにしがち イミュータブルな操作に値レシーバ使うことと整合させるため?
・構造体配列のアクセスがゲロ遅い ・GCに負担がかかる ・エスケープ解析が困難 ・C/C++との相互運用時に>>218 のような変換が必要になりクソ非効率だし実装も面倒 ・nilを受け入れないことを保証できない >>221 より良きアセンブラとしてC言語からの代替という目的だと、性能に対しての多少のコーディングしづらさはトレードオフの許容範囲ってことか こりゃ、どうにもならないなー >>208 さんの言うように静的解析でガードするのが正解なんだな 静的解析でgolangci-lint導入してみた そしたら gosimple が大量に felse == じゃなく ! 使えと うるせー!年寄りには ! は見辛くて見逃すんだよ!! どこだよ、オフする設定方法
静的解析の余計な判定をオフする方法がわかったんで書いとく // nolint:gosimple とか行の後とか前行に書くとそこだけオフされる 設定ファイルでオフすると設定ファイルを公開する手間が増える コードに書いておく方がベターだと思った
一時期Cの関数を検索したかっただけなのにphpのばっかり出て来たときは辟易した
一時期旧日本海軍の軍艦の画像を検索したかっただけなのになぜか 萌え絵のおっぱいおねーさんばっかりでてくる、みたいな状況か
php界隈みたいに翻訳してくれる神様降臨してほしい!
頑張ってくれた先人には申し訳ないけど 古い情報がトップに出てくるのは悪影響しか無い気もする
どこの言語も同じだよな 特にモジュール関係はどの言語もひどい有様で初心者が皆困惑して言語から離れる 一度使用固めたら不都合でも10年は同じものを使って欲しいw
今発売されているGoの入門書でモジュール対応してるものってあるの?
モジュールと言われても用語としての範囲が膨大すぎて意味が伝わらない
みんなのGo買ったけど初心者向けじゃなくて読んでないんですが 本当に初心者向けの本ってありませんか?
みんなのGoってオンラインで無料で全部読めるやつ?
>>252 改訂2版 みんなのGo言語、2019/8/1 この本は、各言語の「Effective 何々」に当たる本 改訂2版 基礎からわかる Go言語、古川昇(エイベル)、2015 この本が初心者向けの文法書 >>246 に書いてある、翻訳プロジェクト、公式サイトの日本語訳 http://golang.jp/ は、エイベルの古川部長と社員が書いていた ガチの初心者がGoなんか使って何するのか、嫌味じゃなくて興味がある Goは言語だけできても全く何の役にも立たないと思うが、 本来のGoのコンセプトの通りに、ペーペーにGoだけ覚えさせてアプリケーションコードだけ書かせるような組織が日本にも存在する時代になったのだろうか
サーバー側は、Ruby → Node.js, Go 今世紀最大の起業家、Vagrant の作者・Mitchell Hashimoto なんか、まさにそう。 今や、Go の重鎮 Ruby on Rails, Sinatra などで、サーバー側を一通り作った人が、Go へ行く。 そういうキャリアパスでは「みんなのGo言語」は、良い本
>>257 >Goは言語だけできても全く何の役にも立たないと思うが、 Goに限らず汎用言語はみんなそうだろ 標準ライブラリが充実してて言語の構成要素が少ないGoを 最初の言語として選ぶのは悪くない選択だと思うぞ C/Java/C#/JavaScriptらと比べるとずっと簡単 だからこそモジュールのバージョン管理が大事なんだと思う
基礎からわかる Go言語もずぶの素人には難しいと言うか無理だろこれは
関数の引数で []*xxx と []xxx があるんですが、どっちを使ったらいいんでしょうか
間違ってたらコンパイルエラー出るから、コンパイルエラーが出ないほう 呼んだ先の関数の引数の定義をよーく読め でも、実際に渡している方の部分を見て書いてる可能性もあるか…… インターフェースの配列を受け取る関数だとすると、どちらでもコンパイルエラーは起こらない ぶっちゃけ、その場合はどちらでも構わないことが多い []xxxxは、xxxxがインターフェースでなく構造体だったなら、十中八九はバグだと思う バグでなく意図的に使うケースもありはするけど………………
>>259 もちろんライブラリやフレームワークの学習は前提だけど、 仮にプログラミング初学者がGo勉強して基本的なCRUDアプリを作れるようになったとして仕事あるか? 極端な話、初学者がSpringとかASP.NETとかRailsとか覚えたら、 サーバーを起動する方法もその上でアプリを動かす方法も知らなくても仕事はいくらでもあるわけだよ 一方Go名指しの求人って、ほぼ例外なく、複数言語が使えてAWSもわかるフルスタックな人が期待されてると思うんだよな もちろんGoが使えたらプログラミングの素質はあるだろうってことでの採用はありうけど、 そうやって入った環境では多分Goを書かせてはもらえないだろう >>264 同意するかは別にして言いたいことは理解した そういう内容なら「Goは言語だけできても全く何の役にも立たないぞ」じゃなくて 「初学者がGoだけ習得しても仕事はないぞ」って書けばいいんじゃないかな 結局みんなと同じようにRuby on RailsとかPHPやっとけばいいんじゃねえのか 人と違うことしてる俺様かっこいいみたいなデスクトップのLinux使ってよく分からないエラー出ながら使ってる奴とか そういうことじゃねえのかポインタとかスライスとか糞 []xxxと[]*xxxをAPIのレスポンスで返したら同じjsonが返ってくるとか糞 普通ポインタの配列なんだからアドレスの羅列が返ってくるんじゃねえんか マジ糞言語
goはあちらこちら洗練されてない。存在としては好きなんだがなぁ。
矛盾が少なくて必要最小限の仕様しかない、という意味ならC だから未だに現役なわけで 俺はJavaScriptが好きだけど JSもCと同様Alt-JSが大量に発生したものの殺しきれなかった、という意味ではある程度洗練はしている 言語としての問題は typeof(null)==="object" 位
やっぱgoに使い慣れている人でも糞だと思ってるんだな
>[]xxxと[]*xxxをAPIのレスポンスで返したら同じjsonが返ってくるとか糞 ちょっと意味がわからないけど、要するにポインタレシーバでのインターフェースで実体も受け取れるという話じゃないかと思うんで同意 すんごくブッ飛んでるよなあれは……
JavaScriptも嫌いじゃないけど、ほぼほぼ毎年仕様が追加されていて着いていけない prototypeで書いてもいいよね?bind使っててもいいよね?ダメ?
公式サイトですらgolangだもんな…… C言語よりは検索性に優れてるよ!w 甲乙じゃなくて丙丁つけがたい争い
go とか [] とか []* とか すごく検索しづらい
>>278 エアプかよ さすがにbindがNGは今時ないと思うぞ まあそうやって駄目な理由を探しているようではずっとエアプのままだろうよ goが洗練されていないのは当たり前、新しい言語だからだ 何だかんだでJavaScriptは25年、Cなんて50年近いのだから、必要な仕様はとっくに入っている JavaScriptでも、今追加されている仕様はそもそも「あってもなくてもいいもの」でしかない それに比べて、まだgoは根本的な部分で仕様変更が為されている段階だろ この意味では、今現在のgoをプログラミング初心者が触るのは間違っているとは言えると思うけど お前も含めて 糞じゃね言って同意って言われるのが終わってる 否定してほしくて敢えて過激なこと言ってるのに
Goが気持ちいいのは、意識高い先人達が築き上げてきた無駄に複雑な数多の概念を「Goだから」で一蹴できるところ 例えばテストコードの assert that 系のDSL 誰もが薄々糞だと気付いていたが、意識高い空気がそれを許さなかった それを堂々と「こんな糞は要らんかったんや!ifでええんや!」と言えるお墨付きが貰えた Goが数々の欠点にも関わらず言語として好まれた本当の理由は、そういうカタルシスにあると思うわ
>>283 構ってちゃんは死ね また、そういう態度はWebを駄目にするからマジで死ね >>284 それは一理ある 公式でも言っているとおり、Goは敢えてガラガラポンしている 多分、いわゆる「お作法」に辟易している若くて元気のいい奴に受けているのだと思う だから「結果的に再発明になってもいい」と思える奴等には良いプラットフォームだろう (なお俺はassertなんて使わないことは一応付け加えておく) みんなgoとかgolangって書いてるけど実際はGoなんだよね
文字関連のライブラリとかかなり雑と言うか古臭く感じる cから発展したともとれるが嫌な感じだな uint64を文字列にするのもいまだにググって調べてる
>>284 俺みたいな老害Cプログラマがマウント取りまくれる言語仕様なんだよね 例外とかいらん!オブジェクト指向もいらん! スクリプト言語のおしゃれ感もいらん! interfaceとgoroutineはオシャレだと思うぞ。あとはダサダサだけどw
selectの非同期待ち受けって、素敵だと思うの もじもじ……
goroutine周りは記述が簡便で初心者も手を出しやすい雰囲気を醸し出してるのに、実際には低レベルで罠が多いんだよなあ これだけ徹底的な低能仕様なのにデッドロックに対する安全機構のようなものが何もないのはいかがなものか せめてpromise的なのくらいは欲しい
Goの非同期機能の公式の説明で共有メモリは危険だとかドヤ顔で講釈垂れてる割には ちょっとchannelの扱いをミスると簡単にデッドロックするんだよな Goの設計のセンスは基本的には素晴らしいと思うけど、 非同期処理の難しさに関してはGoをもってしても効果的な解決法を見つけられなかったのは残念だな
golang.jpが壊れて治らないから諦めてwebarchive行くことにした
golangが完全に終焉するとき 名前がgoneにかわる
golang-jp.netみたいな日本向けドメイン取って誰かが新しいサイト作って
アフィリエイトで広告踏みますのでよろしくおねがいします
goとrustは目指す目的が違いすぎて、並べて書く意味がなさすぎ
1.14のissueって昨日まで20個以上残ってたと思ったけど、あれどうしたのかな
release blocker issueは2個くらいだったし それ以外は次バージョンに延期でしょ
>>297 とりあえずブロックするって方向はそんなに悪くはないと思う。 あとはブロックされてリークしたgoルーチンの回収をどうするか。 「つまらないアンケートに答える層が使っている言語」の統計 FORTRANより下に主流の言語があるのがなかなか
C/C++いまだに多いけどどういう人が投票してるんだろう 統計でデタラメな誘導するのはやめて欲しいよ
お前らが見慣れてるような言語ランキングだって相当なバイアスがかかってるだろう 日本の実情としてはまあ納得できるランキングだと思うけどな むしろこの面子でGoが意外と健闘してるのは驚き C/C++が多いのは、業務システム分野では互いに競合する言語が比較的多いのに対して、組み込みや制御の分野の中では代替が事実上存在しないからだろうね
Rubyは始まりも、オワコンなのよ そうよ、Perlと共にお墓に向かってるの どんなときでも時代はPHP♪ homubrewもrubyを切り捨てた現実を受け入れなさい!
FORTRANがあるということは製造業なのかな それも主に自動車産業
まあ、職業プログラマーでSQL使わない奴なんてまず居ないだろから
今の現場、DBが完全にDynamoDB(KvS)に移行したぞ リレーショナルデータベース使わなくなった
いくらサービスのOLTP系のDBがDynamoDBオンリーでも、会社なら業務系のDBとかデータ分析用のDWHとかあるしWebエンジニアでもたまにはそういうところ触ることもあるだろ? お前の狭い業務では使わなくなった、の間違いだ
それにしても使えば使うほどクソさが見えてきて 嫌悪しかでてこない言語だなgolangは
>それにしても使えば使うほどクソさが見えてきて これはほぼどの言語にも当てはまらなくはない >嫌悪しかでてこない言語だなgolangは 個人の主観です
Kotlinは使えば使うほど良いなと思う サーバーサイドもKotlinの世界になればいいのだ
ちょっと鮮度が落ちた話だけど Let's Encrypt が幾つかの証明書を無効化する羽目に その原因がgolangあるあるの、実体配列ループでコピーしたオブジェクト書き換えてたバグらしい 実体配列ってクソだな
何で参照を渡していたのか不思議… 数行下では値渡しにしているのに
>>334 大人しくpython使ってればこんなことには pythonのほうでも、旧アマ driveを便利に使えるようにする一番有名だった 3rd partyツールが、関数に渡す引数の扱いを間違えて別の人のファイルが 見えるようになったりしてたけどね 旧driveの容量無制限と3rd partyへのAPI解放をやめさせた遠因
>>333 goとcとphpしかやったことないんだけど、Kotlinええの? >>333 Javaランタイムで動かす別言語だと思ってたが、サーバでは使えんの? そもそもgolangスレで発言した意図がわかんない Javaスレに行けば? コンテナ時代にJavaはなあ Java系はそのエコシステムの中だけで完結するからこそ意味があるんだよ そもそもJavaプラットフォームは十分にポータブルで、コンテナのような低レイヤの抽象化を必要としない Javaをコンテナに閉じ込めて動かすのはJavaの全盛期を知る者としては屈辱だよ
Javaの欠点はメモリを食い過ぎること 本当にこれだけだと思う
javaの欠点はメソッド名が長すぎ 何をするにも面倒臭い アレとアレをつなげてコレとコレをつなげてやっとこさHellow World
Javaとかいて邪魔と読みます。くらいに要らない子
Java馬鹿にしてるやついるけど if err != nil をコピペしまくる言語よりかはダサくないよ(笑)
JavaをバカにしていいのはC#とかの直系親族かなー でも御先祖様だから敬わないと golangから見てそれこそカブる部分が少ないんで他所の御家庭 でもVBさんちは何とかしてほしいと思ってしまう自分を許して
コピペって(笑)、インテリセンスとかスニペットが無い世界の人は大変だな
Javaがバカにされるのはそれを使っているプログラマのせいじゃないかと思う。 企業需要が大きいから促成栽培のドカタが量産されたという。 純粋に言語として評価したら、CやC++の問題点をよく研究している印象なんだがな。
ダサいと感じるかどうかは人それぞれだが エラーハンドリングのボイラープレートが どうしようもなく多いのは事実だよね Go2に期待してたんだがな
Goのやり方の是非はともかく、例外がいつどこから飛んでくるかわからない「漠然とした不安」がないのはいい あの不安は少なからず脳の働きを阻害して生産性を下げてると思うわ
書く量が多くなるとかそれぐらいは別にいいんだけどさぁー どうせコピペするだけだし(笑) 最初にエラーハンドリングはそこまで要らないなと思って書いてたコード群が 後で扱うデータの仕様変更があってエラーハンドリングが必要になったときに ガッポリその部分覆ってまとめてエラー扱うってのが一切できないんだよな こうなってしまうと全部のコードリファクタしないといけないしなんなら 個別のロジックまで追いかけて問題ないかチェックしないといけなくなる こういうところがgoはクソなんだよな
> 最初にエラーハンドリングはそこまで要らないなと思って書いてたコード群が 単に見通しが甘いだけなんじゃないか
>>352 だから何? お前が見通してくれるわけじゃないなら黙ってろよ >後で扱うデータの仕様変更があってエラーハンドリングが必要になったときに >ガッポリその部分覆ってまとめてエラー扱うってのが一切できないんだよな これ自体が例外ありきの発想のように思う
Goだと極一部の簡単な関数を除けば基本的にerrを返すから、後でerr発生箇所が増えても影響は関数一つだけだろう それが問題になるようなアホみたいに長い関数を書いてるならそれ以前の問題だな
vscode で if err!=nil のブロックをデフォルトで折り畳んでくれたら、おれは嬉しい
またお前かって初めてこのスレに書き込んだんだが そういって一生ゴミ仕様から目を背け続けろな
errさんイライラwwwwwwwwwwwwwwwwww
errさんはPHPしか触ってこなかったから気にしないんだよ
Cだともっと酷いよ? 戻りでエラー返すと本来の戻り値が潰れるから &errorとかいう独自定義のエラー用構造体を引数に毎回渡す これに比べたら天国
Goは標準ライブラリが豊富っていうけどどこらへんが豊富なの? Goは並行処理が得意なのに並列処理が得意とか実際に触ってるわけでもないのに書く人多いから豊富ってのも嘘なんじゃないかと思ってる
>>367 GetLastError エラーを取得するには関数を使います GetLastError() って Windows OS のみ?
Cだと戻り値でデータ返したりエラーコード返したりやりたい放題で一貫性が無さすぎ Javaとかはtry catch地獄 Cでレジスタで戻り値返さずに複数値返せる設計にしてれば標準となって皆幸福だったのに
最近のは(小さい)構造体なら返せるやろ デカいのは無駄だし mallocしたのだと解放が面倒だが
>>372 ハードウェアの構造無視しすぎ。 それでみな幸せならとっくにそうなっとるわ。 cでもスタックの使い方の規約なんて昔と相当変わってる。 >>370 Windowsの作法やん それにグローバルなエラー情報とか論外 >>374 ん、その昔の段階で戻り値の返し方で言語仕様的に一工夫してくれてたらという正直ムチャ振りなレスだったんだけど Goって複数の戻り値はスタックにおいてるのかね? その辺どうなってるんだろう
コンパイル時にサイズが決まるならスタックに積んで返すのは難しくないだろう。 今どきCでも構造体を返したりできるし。
老人介護用言語すぎてストレスしかない なんで今の御時世にこんな微妙な言語使わなければならんのだ ポインタ意識したりするよりドメイン層の設計に時間を割いたほうがマシだわ はぁ…
権限だけ持ってる考えなしの馬鹿が採用を決めたせいで無理して使うしかないんだわ トラップ多くてその調査のせいで学習コスト跳ね上がるし 並列処理簡単って動かすだけならそりゃ簡単だろうが…ってレベルの完成度の低さで CPUフルで使い切るような事やらせようと思ったら面倒さも管理も段違いの面倒さ… 愚痴はまぁともかく、structって脳死して全部ポインタで扱うほうがいいんけ? というかstructに実装持たせるような意識なんて投げ捨てて旧石器時代を目指すほうが良い言語?
あくまで関数が主体であり、structはオブジェクト指向的な実体というより、単なる文脈と考えればいい Rustも同様の考え方だし、C#なんかも最近はそういう方向へ進みつつある 善し悪しはともかく最近の流行りではある
>>383 基本的にはちょっと楽なCだからね まともなC使いは第一引数にオブジェクトのポインタわたしてたし 継承も構造体使って同じことしてた むしろC使いは理想的な言語を作ってくれた!と思ってる >>383 CPUフルに使いきるなら素直に別プロセスにして上位レイヤーで分散するよう工夫したほうが結局コスト安く済むような印象がある まあWeb系じゃないならそうは行かない場合もあるんだろうけど ハイパースレッディング的にCPUを並列化したいならGoなんで使うものじゃないよ
>>383 コア数分のgoroutineでCPU使ってくれない?なにかそんなに面倒なことあったっけ? golangのポインタ周りはrangeでイラっとしたくらいだわ 他はわかりやすいし使いやすい印象
いやいや・・ポインタも構造体の実体からもアクセスがどっちも . とか トラップすぎて草はえるわ そりゃさだいたいは問題ないよ、だけどな大体のとこは良いけどたまーに 罠にハマるっていうパターンの問題が一番やっかいな罠になるもんなんだよ そんな中途半端なことするぐらいならいっそハナから面倒なままにしてくれるか あるいはしょうっちゅう問題が起きるから常に注意して書く必要がある、ぐらい のほうがよっぽどマシ GO言語はこの「だいたいいいけどたまに罠」がクソ多すぎてほんとクソ言語だよ
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたはじまった | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
全部ポインタにしてるわ 現代のアーキテクチャからしたら明らかに遅くなりそうだが C脳だから全部ポインタw
全部ポインタは無駄処理増えてパフォーマンス的に良くないようだけど そうした方が言語トラップを回避できる可能性が高いって時点でうんこであることは間違いないと思うよ コードをひと目見てすぐ問題があると判断できないようなトラップが散りばめられてて学習コストが低いとか嘘だわ インポートも微妙、名前ぶつかりすぎでローカル変数名が半端になっていく エクスポートの仕様も半端、プロパティとかないから構造体のフィールドは全開放で 扱う側に全責任が委ねられてしまうしパッケージ変数とか公開した日にゃノーガード戦法しかない その割にリフレクションでの制限だけはクソきつくて非エクスポート関数の参照や値の変更は実質ほぼ不可能 あとエラーもうんこ goのerrorをバケツリレーしていくような実装って、結局のところJavaでいうところの throws Exception を 全メソッドに書いちゃうようなゴミ実装をより面倒くさい記述にしただけみたいな感じ エラーの中身が型として読み解けないせいで意識しないといけないスコープが広がりすぎるから超めんどくさい エラー処理をせずもみ消したいときにtry/catchがいらないみたいな、死ぬほどどうでもいい利点くらいしかひねり出せない 言語の決定権がなく仕方がなく使ってるけど、全てを把握できてて自分以外が触らないような 単機能の小さいツール作るくらいの用途くらいでしか使いたくない言語って感じで、書くほどストレスが溜まっていくぜ… これを絶賛する人たちが本当に最高だと思ってるのかマジでわからんくなる…
今Go使ってる人はなんちゃっての人は少ないからねえ まともにGoやってますって人の少なさよ
はて、ポインタで無駄処理ってのは聞いたことないな アセンブラのレベルから見ると、実体って概念は配列要素へのアクセスを先頭からの相対位置で行うという、限られた局面でしか現れないもの あ、自動変数の実現としてスタックを積んでスタックボトムからのオフセットを使用するのは一般的ではあるか ともかく実体渡しはCとかあの辺りの言語で実装された二次的なもので、あくまでポインタの糖衣構文じゃないの? 俺が最近のCPUを知らないからトンチンカンなのかな? ベクタ計算がプリミティブに使われない限り、よりマシンに近い記述がポインタだと理解しているんだが
せっかくのキャッシュなのに キャッシュ捨てまくりが発生
ちゃんと読んで答えてるっぽい奴居て草 今君は川に流れてるウンコを態々拾いに行ったのだ ばっちぃから触っちゃ駄目だろ、ちゃんと反省しろよ
>>399 それが何で遅くなるのか理解して言ってるか? ポインタが無駄な処理になるからじゃなく、メモリアクセスとメモリ管理を最適化するため 実体配列のニッチな需要があるかぎりは実体は廃止できないという意見 正直、そういう需要なんて切って捨てていいと思う Javaみたいに Javaはスレッド跨ぐ場合はスレッドごとにコピーした値をキャッシュしたりはしているし それで起きる問題を回避するための手段も用意されてる Goがただ面倒くさいゴミ言語って話でJavaを例えに上げるのは理解してなさそうに見えちゃわない?
だって Java thread って context switch が遅いんですもの…(仕方ないけど)
皆んとこインフラでGo使ってないんか? クラウドならGo一択だと思ってた
Go製のキラーアプリであるDocker それをRustで書き直すって話無かった?もう公開されてる? 厳密なコンテキスト操作がGoでは実装できないからって それとも自分の勘違い?
Dockerの記述言語なんて使う分には関係ないからキラーアプリとは違うような。
コンプライアンスに即した範囲でできるテレワークって事で 最近「他社ゲームのアーキテクチャを調査」ってタスクをやったんだけど Golangは無いね。Node.jsばっか 個人的にはgo使いたいから、家にいる期間になんか一個作りたいけどなぁ…。
ゲーム会社でもコンプライアンスの関係でテレワークできない業務なんかあんの? 少なくともゲーム会社よりはお堅い会社に勤めてるけど、全部在宅で何の問題もないな コードは主にNode.js(オンライン)とPython(バッチ)で、オンラインについてはGoへの書き直しを進めてる
JavaとかScalaで作ってたものをGoに置き換えるみたいな流れは割とある
windowsとlinuxで動かさなきゃいけないアプリをJavaで書いてて 全く問題なかったんだけど 実質有償化に伴って他の言語で書き直そうかと思ってるけど Goってwindows上でも安定して動くのかね? ちなみに24時間稼働しっぱなしのアプリ
C#ってlinux上ではmonoとか使うわけでしょ? 流石にないわー
>>406 CATSってスマホゲーがサーバーにGoを使ってるらしい サーバーにちょくちょくアクセスしながら動作してるんだが、めっちゃ速いよ この辺はスピンアップが爆速な恩恵なのかも >>406 フロントはNodeでバックエンドがGoだと 外からじゃ調べよう無いよね? >>414 個人的興味でちょっと見てみるわ >>415 そういう調査じゃなくて スライドシェアとかの公開資料のまとめ 正直引き続き契約延長いただいてありがとうございますというレベル この状況がまだ続くんなら、流石に家でもほんとに作業するように変わるんじゃないかと思うけどね または切られるかだな… 今のC#知らない人多そう 特定の言語に拘らず積極的に情報収集した方がいいと思うけどね スレチだからここまで
流石にJavaやScalaからGo移行とかになるとあまりの言語機能のゴミっぷりに開発者がキレそう 今までハサミつかって紙きってたのに石器渡されるようもんだわ
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたはじまった | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
この言語はCでサーバを書いているようなニッチな要求の仕事を置き換えるんだろうな なに?そんな仕事があるわけない? …去年回って来ちゃってたよ、そんな仕事が ミリ秒縛り要求で数十の機器の管制をするサーバ 当時はgo知らなかったんでgccで書いた
リアルタイム性重視なら、GCあるGoは向いてないんじゃ その用途で置き換えるならRustになりそう
鯖は比較的余裕有るけど、クライアント側でGCが痛い子になる事はありそう Rustは半日では無理だなぁ〜、概念は直ぐ理解出来るけど書き方に統一感無さ過ぎてキレそう<'a>&'a *ref
Rustはバカ速いとか聞くから覚えたいんだけど 学習コストもバカ高いよなぁ CとかPascalやっててJavaを始めたときの倍くらい大変な感じがする C#はJavaを丸パクりで基本構文ができてたから、1日
そりゃあif文for文みたいなコードだけなら1日だろうよ
rust、利便性のためにライフタイムの省略パターンとか作ったんだろうけれど、逆にわかりづらくなってるわ。
>>433 クラスの定義の書き方とかもだよ Javaでない言語のクラスの書き方は、クラス定義にはメソッドの宣言を書いて、定義の外で実装するスタイルが主流だった(他の言語には無いとは言わないが非主流) これはC++とかObjectPASCAL、そしてGoもこちらのスタイルではある C#では、基本的にデフォルト仮想なJavaメソッドに対して、デフォルトは非仮想って程度の差(充分にでかい差ではある、ちなみにジェネリックはまだない時分) だから、覚えるというより慣れるのに1日 SalesforceのAPECはまた面白くて構文はC#以上にJavaなのにデフォルト非仮想だったかな よく似た兄弟すぎて、仕事とプライベートそれぞれ違う言語で書いてると混乱する >>433 ああ、そういえばCとかではエントリがmain関数だったのが、クラスになっているスタイルもJavaで覚えた そのためC#でもほぼ同じだから、そこで引っ掛かることが無かった そういう観点であってifとかforなどの構文じゃないよ >>436 笑わせるなよ 学習コストの話なんだからコーダー視点に決まってるだろ JavaとC#では技術スタックが全然違うだろう サーバーの構築から通信方法からフレームワーク等の選定から何から、 そういう足回りを全部すっ飛ばして全部あらかじめ他人に与えられた環境を使って 「さあ、アプリケーションコードを書いてください」ならそら大差ないだろ 俺は436じゃないが「コーダー」ってそういう意味じゃないかな
出だしが学習コストの話で、人格攻撃やらサーバの構築とか的外れな事を言い出してくるやら 詭弁術だけはお得意なことはよくわかりました
ギスギスしててワロ Goは誰でもある程度のレベルくらいまでなら使いこなせる優しい言語
ものすごく当たり前の落とし穴に落ちた ファクトリから構造体アドレス返してたのをインタフェース返すように変更したらテストでコケた キャストチェックのテストだったんだけど、レシーバのシグネチャが同じ別のインタフェースがあって、そいつにキャストできちゃった インタフェースが同じなら同じものとして使えるってことは、そういう問題を想定しとかないとならなかった
大きくなってきたんでパッケージを分割 設定とか全体を管理するAパッケージ httpのリクエストを管理するBパッケージ webAPIのロジックを管理するCパッケージ ロジックのインスタンスは設定で作って、リクエストから呼び出して処理してもらう さて、ここで落とし穴 Cパッケージから設定を参照するためにAパッケージをインポートすると import cycle not arrowed 発生 AパッケージではCパッケージをインポートして、ロジックのファクトリを呼び出してる インポートの循環の制約とか、それは厳しすぎやしませんかね 第三の上位パッケージを作ればなんとかなるのかなぁ?
>>445 Goに限らずモジュール境界はインタフェースで抽象化するもんじゃ? そうしないとユニットテストつらい > 設定とか全体を管理するパッケージ インターフェース云々以前に、そんなふわっとしたモジュール強度の低いパッケージが存在することが問題 設定なら設定で分けろ 設定はデータ構造自体がインターフェイスなんだからカプセル化とか要らん
>>445 AからC呼び出すっておかしいだろ 設計やり直せ >>449 ロジックのインタフェースの実体を得るファクトリ関数なんだがおかしいのか? でも、そもそもが設定情報のパッケージにシステムを管理するデータの生成を担わせてる設計が原因臭いとはうすうす やっぱそこを別パッケージに分離して結合を弱めないとだめだな 結局、日和ってロジックのインスタンスはCパッケージにシングルトンとして実装してBから呼ぶことでallowedを回避した 根本的な解決ではないが、動けばいい!(うわっ自分で言ってて恥ずかしい
VScodeなのかdelveなのか、デバッガでスライスを見たとき64個までしか見えません どこの設定を弄れば最後まで見せてもらえるのか、調べてみたけれど分かりません → githubのgo-delveとかvscode-goとか このカスタマイズについて情報があれば教えてください
各プラットフォームのランタイムのせいだろうとは思うけど・・・ io パッケージの func Copy(dst Writer, src Reader) (written int64, err error) と type Writer interface { Write(p []byte) (n int, err error) } で戻り値に一貫性がない事に気づいて、ちょっとイラっときた (io.Writer).Write() では n の合計が len(p) になるまで繰り返さないとダメ? かと思ったけど、 Write must return a non-nil error if it returns n < len(p). って書いてあるよ・・・
ああっ The built-in functions len and cap take arguments of various types and return a result of type int. だからなのか いいのかそんな仕様で
Goではintのサイズと配列の最大長は環境依存だからそれで正しい そして、CopyはWriteを一発呼ぶだけじゃなくて指定された長さをコピーし終えるまで読み書きを繰り返すように実装するもの だから配列の最大長とか無関係 やってることが全然違うんだから一貫性もクソもない
>指定された長さ ダウト Copy見てきてください こいつはReaderからバイトストリーム(厳密には意訳)をEOFに達するまでWriterに書き込み、その書き込みバイト数を返します サイズなんて指定しません Writerに書き出すソースが固定のスライスではないだけで、Writerに書き出すという目的から見ればWriteと同じでしょ まあ違うとあえて言うなら、私とあなたは考え方が違うんでしょうね (私は「何をするか」という目的で言ったので)
log.Logger の出力でファイル名も出させるようにして気づいたけど、ソースファイルのパスって実行ファイルの中にしっかりと記録されてる? Loggerでファイル名を指定すると内部でruntime.Caller呼んでスタック情報拾うんだけど ログにはソースファイルの完全パスがしっかりと出てくる 実行ファイルを別ディレクトリはにコピーして実行しても出るから、実行ファイルの置き場所を利用している訳じゃない また、runtimeパッケージがソースファイル情報をもってる訳もないからリンカが埋め込んでるんだろうと推測 runtimeパッケージを使う使わないで、リンカが埋め込む埋め込まないを切り替えるなんて器用な真似はさせていないだろうし だとすると、ソースファイルの情報って全て記録されているはず(stringsで実行ファイルの中を見た訳じゃないけど) という推測 完全パスで困るのはユーザ名がしっかり出ちゃうことなんだよな それが嫌ならユーザディレクトリで開発するなという事なのか
みんなはGW中は嫁さんとセックスしまくりなの? 独身の俺からすると羨ましいんだけど
飽きるか?全然飽きないんだが。 嫁ともっとセクロスしたいわ。
∧∧ ミ _ ドスッ ( ,,)┌─┴┴─┐ / つ. 終 了 │ 〜′ /´ └─┬┬─┘ ∪ ∪ ││ _ε3 ゛゛'゛'゛
GoのスレなんだからせめてGopherくんで抜けるかどうかの議論しろよ
gopherくんみたいな女いるよな 目がでかくて歯並び悪いやつ 抜ける
常駐しつつ標準入力からのコマンドを受け付ける構成のプログラム書いてる だけど、デバッグターミナルからの標準入力はサポートされないんだな(vscode-go/ issues/219) VScodeの問題かと探したのにdelveの問題?
ちなみにシグナル使えという話は横に置いといてね os.Interruptとかのハンドリングはもう入ってる Windowsでkillしても受け取らないんだこれが
ところどころ抜けてて口頭説明前提の作りで肝心な内容が無い資料公開されてもな
言語仕様より標準ライブラリのクックブック的な本が充実して欲しいかな 結局Goのソースやテストコード読まなきゃ使い方がわからないのが多過ぎるし
>>475 みんなのGoは、flagパッケージとかの使用例が役に立った よく言われるように初心者向けではないだろうなとも思った Golang逆引きレシピ(version1.14対応) って本出してくれ kindleで5000円までなら買う
開発陣のモチベーションはどうなんだろう。 なんかrubyと同じような臭いが。
サーバで使われることが割と一般的なコンパイル言語(Java以外)って Go以外になんかあったっけ
C# 海外を含めるならWin鯖除外でも今やGoよりは多いんじゃないか
>>482 訂正、サーバでバックエンドとして C#かー Javaじゃね?って言葉を無視するのであれば、Scalaは聞いたことある。
javaがinnullable化すればいいんだ いつ達成されるのか
Goは学習コストが少ないっていう嘘に騙されてるやつとそう信じてる信者が多いのが最大の失敗 コード読むだけじゃ見落とすような罠が簡単につくれるし直感的に分かりづらい仕様と機能不足が多すぎる 書き捨てるだけなら簡単だがチーム開発で採用するには残念すぎる言語
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたはじまった | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐―´´\
>>447 ものすごく遅い話なんだけど そっかー、インタフェース定義とファクトリの実装が同じパッケージにある必然性って全くなかったんだな io.Reader の実装が到るところにあるように、定義と実装を分離させれば済む話だった あーでもない、こーでもない いつの間にかそうリファクタリングしていて、アレ?となった >>493 ていうかinterfaceを返すファクトリというもの自体があまりGo的ではない その辺は思想がJavaなんかと大きく違うところで、Goでは戻り値には具象型を使うのが基本 interfaceは関数の引数に使うもんで、その関数を使う側のパッケージが必要に応じてinterfaceを実装するんだよ それに従えば結果的にファクトリとinterface定義は別パッケージになる >>495 あ、脊椎で反射的に反論しそうになったけど指摘されてみると全くその通りだね ファクトリからインタフェースを返すのは悪手だわこれ 1.12 の http/request.go に、でっかい落とし穴が こいつは、1210 行目で ContextType == "multipart/form-data" の処理が未実装 そして、 Chrome は FormData オブジェクトを XMLHttpRequest で send() すると問題のマルチパートで送りつける よって、FormData は使えない…… 他のブラウザだとどうなんだろ?困るな
xmlHttpRequest.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' ); じゃダメなん?
うーん、コード追ってみたら未実装は間違いでParseMultipartFormを使うらしいけど、わけわかんない 単純にParseFormを置き換えたら、エラーかえしやんの
>>498 いや、ブラウザ側の話じゃないから ブラウザがどんな方法で送ってきても受けられなきゃ駄目でしょ 普通、ParseForm が判定して取り込むよね なんで分離してんの?
エラーが起こる第一原因判明 ヘッダにContent-Typeが無いリクエストでParseMultipartFormすると、パースを打ち切るのではなくてエラーを返す ショボい作りだ
request.go の中身を初めて見たけど、エラー処理は雑だし残念すぎるなコレ
request.MultipartReader() の方を使ってみたら
>>504 ParseMultipartForm 使って、エラーが出ても無視することにした Content-Type 無いようなリクエストでForm読まないから なのかな?よく知らない でも、WebAPIでFormとしてデータを受けるときはParseFormの使用が罠なのは確実 それともbodyを自分で解析するのが定石だったりする?
>>502 >ヘッダにContent-Typeが無いリクエストでParseMultipartFormすると、パースを打ち切るのではなくてエラーを返す これは正常な処理だよ Context-Typeが"multipart/form-data" の場合 Context-Type のmultipart/form-dataの後に続くboundaryをキーにしてmultipartをパースするんだから ParseMultipartFormがContext-Typeからパースに必要なboundaryを取得できなくてエラーになるのはいたって正常なことだよ >>508 の補足 Content-Typeが無かったらboundaryが取得できないのにParseMultipartFormでパースしようとするからエラーを返す 「この中にformがいっぱい入ってますよ」っていうformなんだよね
ヘッダーのContext-Typeで分岐して適切なParseなにがしを呼べってことです。
>>511 何のメリットがあって呼ぶ方が判定しなければならないのか、教えてください う〜ん、Context-Type が指定されていないのに multipart を自動判別して くれるライブラリとかフレームワークって他所の言語にあったりするのかな…?
自動的に判定して分岐できるんだったら、それをライブラリがしないというのは手抜きだろ、と言っている しかし、例えば文字コードの自動判定ではSJISとUTF-8のどちらでも有効であるマルチバイト文字が存在する 例)"【D"と"縲識"はどちらも E3 80 90 44 このようなケースがある課題では自動処理できないので、ライブラリの外側で何かしらの対応をしてやる必要がある マルチパートFormという課題でも同じように呼ぶ方が対処してやらなければならない問題があるのだろうと思った だから、その問題について教えてくださいと書いたんだ 駄々ではないと思うんだが間違っているか?
505で書いたように、一見問題がないような対処はできるけど(自分でも手抜きとはわかってる)、問題点の実体が見えてないと対処に漏れが無いという確証が持てないから
それはバウンダリの中身に、 Content-disposition: attachment; filename="xxxxx" Content-Type: text/plain なんかが書いてあるからできる動作であって、実はバウンダリの中身はかなり自由。 マルチパートの中にさらにマルチパートを入れるマトリョーシカのようなことをしてもかまわん。仕様上は。 これをきれいに自動でデシリアライズするのは結構難しいと思うけど。 そういう意味では、呼ぶ側が解釈を与えないといかんって割り切りは間違っちゃないんじゃないか? 他のコンパイル言語でどう対応してるのか気になるな。
仕事でAWSのAPI Gatewayって機能使った時に マルチパートフォームデータだけは解釈してくれなかった クラウドサービスの都合上外部のライブラリ入れるにはソースに同梱するしか無く、 それは嫌だったからバックエンドのLambda(goに対応しているけど仕事で使ったのは非go)で 自前でバウンダリのfrom-toを切り取った上でガン無視してリクエストbodyを拾うだけの処理を書いた記憶があるw 完全にスレチだけど
>>515 だってContent-Typeに現れるのはその2種類だけとは限らないから全部ライブラリ任せにはできんだろ。 ParseMultipartFormの説明で、必要に応じてParseFormを呼び出しますと書いてるのに、 ヘッダにContent-Typeが無ければエラーとするというParseFormにはない条件を入れてしまっているのがおかしいポイントだと思うんだけど maxMemory引数はデフォルト値を中に持って、オプションとして変更できるようにするのが、こういったライブラリの定石だから(ソケットのタイムアウト時間設定とか)、これは問題点じゃない いや引数の設計上の問題点だけど
>>520 それが、parsePostForm関数ではその二種類しかハンドリングしてないんだよなぁ ブラウザ側でとんでもない(サーバで汎用的な方法で解析できない)フォームデータを送るならブラウザの問題だろう FormDataオブジェクトを使うと発生するContent-Typeくらい自動で処理しないライブラリってどうなの? request.parsePostForm() は Content-Type が無ければ application/octet-stream と見なす様だ func parsePostForm(r *Request) (vs url.Values, err error) { : ct := r.Header.Get("Content-Type") // RFC 7231, section 3.1.1.5 - empty type // MAY be treated as application/octet-stream if ct == "" { ct = "application/octet-stream" } ct, _, err = mime.ParseMediaType(ct) :
RFC 7231 HTTP/1.1: Semantics and Content(日本語訳) https://triple-underscore.github.io/RFC7231-ja.html#section-3.1.1.5 > 実施においては、リソースの所有者は、[生成元サーバが[所与の表現用 > に正しい Content-Type を供する]ように、常に適正に環境設定されてい > る]とは限らないため、クライアントには、[ペイロードの内容を精査し > て、指定された型を上書きする]ものもある【例:MIME sniffing】。その > ようにするクライアントは、不正な結論を導くリスクを負い、追加のセ > キュリティリスクを公開し得る(例:"特権拡大")。更には、送信者の意図 > をデータ形式を精査して決定するのは、不可能である: 多くのデータ形 > 式は、処理の意味論においてのみ相違するような、複数の MIME 型に合 > 致する。実装者には、そのような "内容 sniff 法" を利用するときは、 > それを不能化する手段を供することが奨励される。 >>523 それバージョンいくつ? 1.12だとmultipartReaderでct==""だとエラーを叩き返すんだ ということは1.12でのバグなのかな? >>525 GitHub リポジトリの develop branch から引っ張ってビルドしたもの $ go version go version devel +810c27e9be Wed May 13 11:59:26 2020 +0000 あ、それ違う それはParseForm(1180行あたり)から呼ばれる奴だ つまりマルチパート非対応 ParseMultipartForm(1294行あたり)から呼ばれるmultipartReader(480行あたり)ではContent-Typeが無いと、やっぱりエラーを叩き返してる
つまり現状でも マルチパート非対応のParseFormでは、ctが無くてもOK マルチパート対応のParseMultipartFormでは、ctが無ければエラー という差異が存在している
ParseFormだとURLにフォームくっ付けてContent-Typeがないリクエストを想定してるけど ParseMultipartFormだと、そういう形式のリクエストは認めていないという違いになって現れる
意図的にContent-Typeのないような感じのフォームデータは許さないサーバを書いてるから、エラーチェックしないという対応だけでも問題なさそう
>>530 content-typeがない場合 Request.Bodyの内容からapplication/x-www-form-urlencodedやmultipart/form-dataなどのデータ形式(content-type相当)を判断する必要がる。 multipart/form-dataに限ってはboundaryをRequest.Body内容から見つけ出す必要がある。 (keyValueを取得するにもboundaryが必要。) で、ここで問題なのがRequest.BodyはSTDINからの入力でseekが出来ないのでデータ形式判定後に再度Request.Bodyを読み込むために何らかの方法でRequest.Bodyをキャッシュする必要が出てくる。 (multipart/form-dataはファイルもアップロード出来るのでメモリ上でのキャッシュには向かない) それとhttp.Serverは常駐プロセスになるので、無駄なリソースを使って自動判別して自動でパースするよりcontent-typeで分岐してパースする方が合理的。 >>531 としても、ParseForm内で分岐させない理由にはなってないと思っちゃうんだけど、それについては? 分岐させないのは意図的だとして、その理由が引っ掛かる 最終的に func (i *rInst) ParseForm() error { v := i.request.Header.Get("Content-Type") if v == "" { return i.request.ParseForm() } else { return i.request.ParseMultipartForm(100 * 1024) } } とすることにした
>>532 > としても、ParseForm内で分岐させない理由にはなってないと思っちゃうんだけど、それについては? そもそもParseFormがリクエストのパース処理を包括したラッパー関数だと何処で勘違いしたの? なぜそこまで頑なにRequest-MethodとContent-Typeの値で分岐しようとしないの? (Content-Typeの値の有無だけ確認して分岐したって言うのは無しよ) >>533 のあなたの最終的な実装を見るとあなたはContent-TypeとParseFormとParseMultipartFormを理解して使って無いの、何となく動くからってやっつけで実装したようにしか見えないの。 >>533 あなたの最終的な実装を元にして実装するならこんな感じかな(勝ってに拡張しちゃってるけど) func (i *rInst) ParseForm() error { var err error r := i.request ct := r.Header.Get("Content-Type") ct, _, err = mime.ParseMediaType(ct) if err == nil { switch ct { case "multipart/form-data": if r.Method == "POST" { err = r.ParseMultipartForm(100 * 1024) } else { err = errors.New(“invalid request”) } case “application/json”: d := json.NewDecoder(r.Body) // i.Json = make(map[string]interface{}) i.Json = &BindStructure{} err = d.Decode(&i.Json) default: err = r.ParseForm() } } return err } まぁ、頑張って。 > i.Json = &BindStructure{} の部分は i.Json = BindStructure{} の間違えでした。
>>535 application/json ってFormを送るブラウザがあるのか? bodyをjsonとして送ってくるんだな 寝ぼけてるぽい、もう一回上げ直し >>533 あなたの最終的な実装を元にして実装するならこんな感じかな(勝ってに拡張しちゃってるけど) func (i *rInst) ParseForm() error { var err error r := i.request ct := r.Header.Get("Content-Type") ct, _, err = mime.ParseMediaType(ct) if err == nil { switch ct { case "multipart/form-data": if r.Method == "POST" { err = r.ParseMultipartForm(100 * 1024) } else { err = errors.New(“invalid request”) } case “application/json”: d := json.NewDecoder(r.Body) // i.Json = make(map[string]interface{}) // err = d.Decode(&i.Json) i.Json = &BindStructure{} err = d.Decode(i.Json) default: err = r.ParseForm() } } return err } >>535 あ、REST-APIでよく使われる形式なのか そういうForm使わない呼び出しはサポートしないんで割愛 POST以外のAPIアクセスは事前に拒絶してるから割愛 現状でも問題ないな(手抜き) >>540 いや違う mime.ParseMultimediaTypeは呼んだ方がいい? 呼んだ方がいいから書いてくれてるんだろうな 追加しておきます ありがとう スレチになるのでちょっとだけ。 ブラウザが送るって言う解釈とはちょっと違うけどjavascriptで fetch(url, { method: 'POST', headers:{"Content-Type": "application/json"}, body: JSON.stringify(data) }).then(res => res.json()).then(function(resp) { // ... }) みたいにapplication/jsonでリクエストできます。
>>539 まって、Content-Typeが無いと mime: no media type になる気がするんだが(コード見ただけだけど) Context-Type が無かったらParseFormの出番だと思う >>541 > mime.ParseMultimediaTypeは呼んだ方がいい? // ct に「;」がある場合に「;」より前を取得してるだけなので // mime.ParseMultimediaType使わずにこれでもいい if pos := strings.Index(ct. “;”); pos != -1 { ct = ct[:pos] } >>542 うん、でもそこはAPIの仕様だから 汎用的なForm解析ならば必要だけど、自分のAPIだと割愛してよいってだけの話 > まって、Content-Typeが無いと mime: no media type になる気がするんだが(コード見ただけだけど) ごめんこっちに置き換えてw if pos := strings.Index(ct. “;”); pos != -1 { ct = ct[:pos] } iphoneで書いてるからちょっと適当になりましたw
func (i *rInst) ParseForm() error { var err error r := i.request ct := r.Header.Get("Content-Type") if pos := strings.Index(ct. “;”); pos != -1 { ct = ct[:pos] } switch ct { case "multipart/form-data": if r.Method == "POST" { err = r.ParseMultipartForm(100 * 1024) } else { err = errors.New(“invalid request”) } case “application/json”: d := json.NewDecoder(r.Body) // i.Json = make(map[string]interface{}) // err = d.Decode(&i.Json) i.Json = &BindStructure{} err = d.Decode(i.Json) default: err = r.ParseForm() } return err }
現時点で // SetParseMemory は ParseMultipartForm で指定するメモリサイズを変更します。 func (i *rInst) SetParseMemory(size int64) { i.size = size } // ParseForm() error func (i *rInst) ParseForm() error { v := i.request.Header.Get("Content-Type") if v == "" { return i.request.ParseForm() } else { if pos := strings.Index(v, ";"); pos != -1 { v = v[:pos] } if v == "multipart/form-data" { return i.request.ParseMultipartForm(i.size) } else { return i.request.ParseForm() } } } とした
あ、これでいいのか // ParseForm() error func (i *rInst) ParseForm() error { v := i.request.Header.Get("Content-Type") if pos := strings.Index(v, ";"); pos != -1 { v = v[:pos] } if v == "multipart/form-data" { return i.request.ParseMultipartForm(i.size) } else { return i.request.ParseForm() } }
>>545 >うん、でもそこはAPIの仕様だから >汎用的なForm解析ならば必要だけど、自分のAPIだと割愛してよいってだけの話 わかりました。 サンプルがちょっとグダグダになってこめんなさいw とりあえす頑張ってください。 結局、application/json のために ParseForm から ParseMultipartForm を追い出してる? やっぱり自分的には納得いかない
archive/zip パッケージの仕様なのか、zip 自体の仕様なのかわからんけど まーた穴に嵌まった zip内のトップディレクトリにファイルがある file1.txt sub/file2.txt という構成だったときには sub/ というzipエントリもReadCloser.File配列に入ってくるのに トップにファイルがなくて sub/file2.txt というように、サブディレクトリ以下にしかファイルが無かったときには sub/ が入ってきてない(もしくは入らないzipがある) orz
package main import ( "archive/zip" "fmt" ) func main() { list("jquery-ui-1.12.1.zip") list("ant-1.10.7-javadoc.jar") } func list(name string) { fmt.Println("----- " + name) if f, err := zip.OpenReader(name); err == nil { defer f.Close() for _, fi := range f.File { fmt.Println(fi.Name) } } }
実行例 ----- jquery-ui-1.12.1.zip jquery-ui-1.12.1/jquery-ui.theme.css ・・・ ----- ant-1.10.7-javadoc.jar META-INF/ ・・・
Go最近始めたんだけど[]stringって型の書き方が違和感すぎるんだけど理由ってあるの? 他にこの配列の型導入してる言語もしりたい
想像に過ぎないんだけど、 []が後置だとmapも map[keyType]valueTypeはvalueType[keyType]mapとなるはず そしてmapをvalueとして持つmap map[keyType]map[keyType]valueTypeはvalueType[keyType]map[keyType]map なんか見辛いような、そうでもないような そもそもmapって、なんで付けなきゃならないんだろ? keyType付いてたら文脈で分かりそう 連想配列って元からそうだよな
>>553 zip自体の仕様みたい 仕方ないからサブディレクトリのファイルが出てきたときに、省略されたディレクトリのエントリもあった事にしてモデルに登録した サーバで http.ResponseWriter への書き込みが WSAECONNABORTED (10053) でエラーになっているとき http.server.go#1905 で return してるため、1907のc.setState で StateIdle がセットされない そのため、http.Server の ConnState ハンドラでコネクション数を勘定してると数が合わなくなる という罠に嵌まった どうしよう……エラーを検知した時に勘定している数をデクリメントするか? だって、 return の判定で使われてる shouldReuseConnection って隠蔽されてるから
テストでの罠検出には定評のある人材だから すごかろう(やけくそ)
>>556 英語と同じ語順にした array of string => []string Cの場合それを使う構文と宣言を同じにしたせいで ややこしくなったし その反面教師だと思う Cだと使う時も宣言もstring[]なんだよね そもそも、問題のレスポンスでは20MBくらいのmpgファイルがリクエストされてるんだけど こういったデカイ応答を返す場合って自分が知らない注意点がある? Content-Length はファイルサイズ(21614145) Content-Type は application/octet-stream で送ってる ブラウザでは動画はちゃんと出てる
ブラウザ側では数十msで受信してるから、タイムアウトじゃない
う、もしかすると送信するストリームが Content-Length よりも長いという可能性もあるのか それでブラウザ側から終わった!と切断されてる可能性 面倒極まりないな
深く考えずに レスポンスの書き込みに失敗したらコネクション数をデクリメントする ことにした コネクション数が0になるまではWaitGroup.Waitで待ってる作りにしてたんで
>>567 ResponseWriter の実体って、 chunkWriter ってstruct だから自動的にチャンクで送られるんじゃないの? >>567 うわ、Headerでなんか設定しないと駄目なのか >>567 うーん、HTTP1.1だとTransfer-Encodingにidentityを指定していない場合は強制的にchunkで送られるんじゃないか疑惑 Content-Length不要のお知らせ? >>567 ブラウザでヘッダ見れた チャンクになってないっぽい 調べてみる ありがとう 一貫してオレの都合よく動くようにできてないと騒いでるだけだな
呼び出し順序に則って作らなければ動かないフレームワークってのは 屑って言うんじゃないの?
いや、呼び出し順序に従わない場合はエラーにする ならば仕方ないよそりゃ OpenしないでReadできないのはおかしい、とか言わないから
>>567 Content-Length不要…以前の、設定しなけりゃチャンク送信! orz ちなみに、レスポンス書き込みがエラーになるブラウザはChromeとEdge Firefoxだとエラーにならないのは何故だろう むしろエラーにしてほしい 変な俺様拡張がまかり通ると そっちに甘えてそれが当たり前になって 文化や規約を企業に乗っ取られてしまう
458 に関係しての罠 プロジェクトをユーザ名とは関係しないディレクトリに置いても、まだ駄目だった C:/Users/ユーザ名/go/pkg/mod/golang.org/x/[email protected] /encoding/japanese/all.go というように go get したパッケージの置き場から、ユーザ名は露呈する 嫌ならば GOPATH はユーザディレクトリの下に置いてはいけない そりゃ当たり前で気がつかないのがウカツだった… 参照してるパッケージだってコンパイルされるんだもんなぁ
雑誌でGoはC++を嫌ったGoogleの技術者が作ったって書かれてたんだけどそうなの? 色んな情報見てきて初めて見たんだけど
コンパイルの遅さに嫌気が差したってのは見たこと有るな、尚ソースは無い
目的と合ってないから、目的を絞り混んで作った、いわゆるドメイン固有言語って認識 言語は問題解決に向いてる向いてないはあっても、良い悪いってのはそんなに無いよねという持論
同意しない Goが絞り込んでいるのは用途ではなく開発スタイル
Go は、Ruby を極端にした感じ 継承より委譲。 継承を無くして、Duck Typing だけにした! Ruby on Rails をやったら、やっぱり継承・抽象クラスがあると便利! フレームワークには必要
問題解決力だけで言うとGoが一番高いの? 個人的にはフロントのネイティブ実装を強制されるって意味も含めてJSか、ライブラリの豊富さでPythonとかだと個人的に思うけど
pythonってそこまで書きやすいとは思わないなあ インターフェースがないから どのオブジェクトが何を実装してるのかわからない やはりインターフェースは偉大
Goはクラウドネイティブ開発に習熟してるがオーバークォリティなことをやりがちな奴が多い JSは大半はゴミ、たまに凄いのもいる Pythonは全体的に高学歴で頭良いけど動きゃいいって感じの奴が多い どんな人間が欲しいか次第じゃないかな
pythonは import Hoge したら help(Hoge) a = Hoge.hoge() だったら help(a)
場合つまり解決しようという問題による 問題解決能力って何よという話 グラフィカルでない 非同期処理が効果的 ならば少ない労力で実装できるという強みが売りかな 労力に関しては仕様が一頁で網羅できるGoの学習コストの低さが大きい PythonだとCの知識前提で使うCythonでないとGoには太刀打ちできないというQuiita記事もある 総合力ではPythonの圧勝だろうけど、限定された問題ってのはそういうもの
>>590 オーバークォリティか……耳に痛すぎる指摘だ 用途によるとしか言いようがない気がする。 どれも銀の弾丸にはならんよ。
銀の弾丸は狼男(もしくは悪魔)を倒すという用途に特化されてるんですが・・
ブルックスの論文を知ってて言ってたら申し訳ないんだが、ソフトウエアプロジェクトと言うものに対する銀の弾丸は無いって話だよ。
オーバークォリティなことをやりがちな奴が多い ってのは質が良いプロダクトを作るのには向いてないってこと?
>>597 いま必要な事以上の事をやりたがってプロジェクトの進捗が遅れるってことだよ。 カップラーメン作りゃ十分なのにスープの出汁とるのに豚骨2日近く煮たり、麺を手打ちし始めるような奴。 単体テストやってたら過剰品質だと怒られたんだよな○KI電気SI
>>599 カバレッジ100%とかを目標にしてたんなら過剰品質だと言われてもしかたがない Web関連の自動化でselenium使いたくて、 Pythonでいいかってなったとこはある。
自動テストのコストは成果物を運用しながら継続的に改良していく中でペイしていくもので、SIなら突貫で作って一発動いたらあとは納品して終わりなんだから自動テストは実際要らんわ Goで書くようなものなんて複雑怪奇な業務ロジックとかじゃなくシンプルな小物だろうし
>>592 Qiitaの記事欲しい てかPython触るぐらいなら機械学習分野もGoに入れ替わってほしいわ PythonのC/C++バックエンドよりは多少遅くなるけど、クラウドの相性のよさとかライブラリの質考えたらGoのほうがいい(Numpyとかpandasとかはまた別だけど) 自動テストってどのテストを指してるのか分からないけど、テスト書かないのは後戻りできない負債になるよ 事情通に聞いてみたのよ なんで自動テストしないのか、って それ始めちゃうと、なんで今までやらなかったのか、そう言われて困るお偉いさんが山ほどいるから、だとさ
自社サービスとSIじゃビジネスモデルが全然違うんだから開発手法も違って当たり前 (俺は必ずしもそうだとは思わないが)仮に自動テストによってSIにおいても大幅な工数削減が可能だとして、それに何の意味がある?売上が減るだけじゃないか お偉いさんの面子だのと人に鬱憤を押しつける悪い癖を自覚し、自分とその周囲の状況、そして問題の本質を正しく理解しよう
はじめての C まぁいやらしい という定番ネタのあるひとは黙っててください D 言語は泣いていい
構造体の初期化で省略されたフィールドを既定値で初期化する方法を考えてたんだけど、こんなやり方でも構造体を初期化できるんだな(アンチパターンって言われそうだけど) type Logger struct { _ struct{} mutex *sync.Mutex Prefix string Writer io.Writer } func (l Logger) New() *Logger { l.mutex = &sync.Mutex{} if l.Writer == nil { l.Writer = os.Stdout } return &l } func main() { l1 := Logger{}.New() l2 := Logger{Prefix: "Looger: "}.New() }
はい。諸々すみませんでした(´・ω・`) echoはなんかあったのかな 使ってるからゴタゴタとかちょっと気になる iris?だっけ?(うろ覚え)goは前にも消滅したFWあったし
>>620 汎用フレームワークでここまでパフォーマンスいいのはすごいよね MSはaspnetcoreのベンチマークにTechEmpowerを使ってることを公言してるんで眉唾 オーバーフィッティングの可能性がある
学習に使ったのと同じ入力で評価してるわけだからまさにオーバーフィッティングだね 論理的に公平になり得ない まあ他の上位陣も一緒なんだろうけど
お気に入りのフレームワークの順位が低くて悔しい人たち
>>607 での Cython との比較でも、Go 側が「並列化してない」という批判がコメントに寄せられてるけど訂正されてないんだよな つまり足を縛って比較して Python 負けてないよ!と主張している記事 qiitaのは、あそこのあるあるで理解しないで書いてるだけだ 意図して縛ってるんじゃなくて、わかってないだけ
セットアップとかPythonで書かれてたりすることが多くて、在宅学習でセミナー受講したりしはじめてる スライスってPythonとかが由来なんだな でもar[-1]とか、そんなの要るの?という書き方が多いな 覚えるのメンドクサ
なぜかVScodeで保存しようとすると、go listが大暴走して動かないようになってしまった リファクタリング中でぐちゃぐちゃな状態だから臭いけど
JavaでdirectXやるにはCじゃ無くてGoって聞いて来たんだけどホント? 何から始めたら良い?
その最後の行は 「続きはGoスレへGo!」にするべきだった
Go言語のChannelはチャネル、チャンネルのどっちの読み方が正しいの? チャネルは多いけど最新のGo言語の本ではチャンネルと書いてある
英語の音を無理やりカタカナ語で表現してるだけだから どっちがっていうと難しくない? 一応発音的にはチャンネルよりチャネルの方が近いと思うけど 日本語的にはチャンネルという読み方の方がなじんでるし
正解は「チャネ」です 俺にはそう聞こえるから間違いないです
cmd フォルダなのに main パッケージにしなければならないのはなんとかしてくれ go build cmd/main.go だと動かない exe が出来るし go run cmd/main.go だと cannot run non-main package なんで main パッケージなんてあるんだ? main() 関数あったらどのパッケージだろうと実行させりゃいいじゃん?
Javaやらと同じでパッケージの仕様が練られてないんだよな C#みたいにフォルダ?関係ないね、namespace で書けよ だと嬉しい
cmdフォルダのpackage cmdを他からインポートすれば良いのでは?
そりゃmainフォルダにすれば解決なんだけどさ パッケージがディレクトリのパスでアクセスするimport機構なのに、mainパッケージだけ例外というのがモニョる
単に、mainパッケージだけ例外、というのが残念だという愚痴に過ぎないよ 回避以前に、例外なんだと納得すれば問題はないもんな
pythonでいう__name__ == ‘__main__’を外出しした感覚だと思う 変にCを引きずってるからおかしなことになった ぶっちゃけかなりわかりにくいと思う
https://play.golang.org/p/Ido4pfGMpHn の if s=="a" { return a() } else { return b() } の else 文で if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary) と go-lint が吐き出すんだけど、どう書けばいい? if s=="a" { return a() } return b()
それってgofmtで自動で直してくれるんじゃないの
セーブ時のフォーマットでは直してくれてない gofmt呼んでるのかわからない しかし、if ブロックで return してたなら、確かに else は不要 コーディングスタイルまで口出しするとは、他の書き方許さん理念は極まってるもんだな
Goのバージョン30ぐらいにはコードを書かなくても全部自動生成してくれるようになるよ
オーケーGo クリーンアーキテクチャで掲示板作って これでモダンな技術の5chが作れる時代が来ます
そういや、range キーワードって省略されても構文解析できそうな気がするんだけど、なんか問題あるのかな?
そうだね、一貫性が無くなるよね。バッドプラクティス度合いで言うと最悪ウンコをLv10としてLv10だな
すんごい基礎的な疑問 go get した外部パッケージって、呼び出されないソースもコンパイルされてリンクされる?
>>670 詳しく書くと、例えば import "github.com/hoge/pkg/util" したら、util に涛�チてる全ての滑ヨ数が、呼び出bオしなくてもリャ塔Nされたりすb驕H (更にはmainパッケージとか別のパッケージも) >>671 ありがとうございます 不意に心配になってしまいました デカいプロジェクトの時のパッケージ構成ってどうしてる?dddはなんかやり過ぎ感あるし
気付いてなかったけど、VScodeでgo.modのrequireにカーソル合わせたら、パッケージを最新バージョンにアップデートするかが出てきた
>>655 if e, err := hoge(); err!=nil { return e.method() } else { return err } と書きたいのに、外に出せとか 外に出すと今度はerrが定義されてないとか言うから、errをブロック外でvar定義しなきゃならん 頭悪いよなgolint >>677 話は変わるけど err!=nil は err==nil なんじゃねーの e,err :=hoge() if err !=nil{ return err } return e.method() の方が自然じゃね
return _,err return e.method,nil とかになるかもしれんが
Go, Kotlin Swiftの文法対応表を作って欲しいぜ
>>684 英語だから何書いてあるかわからないよ〜(;O;) >>685 google翻訳にぶっこめばいいだろ。 技術屋だったら英語の使い方は勉強しとき。 すんでで気がついて事なきを得たけど 参考にしたサンプルからコピーしたコードだったんで context.Background() を、そのまま使ってた マルチスレッドではWithCancelなどで別々に作ってやらなきゃなんないよな
英語読めないって人って高卒? 受験で勉強すると思うのだが
ホストがMacなんだけど、dockerでgolang/Fyneを試してみたいんだけど無理かな? なんかXエラーみたいな感じなの
iOSはBSDベースなんだから余程アップルが魔改造してなきゃBSDと同様な程度にはサポートされてるだろ? BSDでリリースされてるかどうか知らないんだが
まずgolangに関係のない話 chrome だけかもしれないけど XMLHttpRequest だと単純リクエストなのに CORS に引っ掛かってしまう で、ここから本題 echo 使ってるんだけど、ハンドラ別に allow なオリジンを切り替えたいんだけど、やり方が分からなかった orz
a := make([]int, 0) makeの第一引数って何を渡してるの? 普通のプリミティブじゃないよね
言語仕様にスライス、マップ、チャネルの型って書いてあるじゃん
その辺は最近のモダンな言語からしたらすげー泥臭い仕様だよな
なんか全体的にそんなところがあるよな。べつに機能的に問題があるというわけじゃないんだが。
"[]int"だとstringだけど、ダブルクォーテーションなしだと何を渡してるんだろうと思って
確かにもやっとしないでもないね t := []string とかで型の変数を作れる訳でもないのにポッと出てくる型指定
makeは組み込み関数にカウントされてるから、むしろ型を変数として生成できないという縛りなんだな 滅多にmake関数使わないな チャネルの容量を設定する時くらい 固定長配列なんて作らないし
構文見てて思った new関数なんてあったのか 使ったことある?
makeが関数でrangeが式なの違和感あるんだよな 逆であるべきなのではと思ってしまう
go: finding dmitri.shuralyov.com/gpu/mtl latest go: downloading dmitri.shuralyov.com/gpu/mtl v0.0.0-20191203043605-d42048ed14fd go: extracting dmitri.shuralyov.com/gpu/mtl v0.0.0-20191203043605-d42048ed14fd build dmitri.shuralyov.com/gpu/mtl: cannot load dmitri.shuralyov.com/gpu/mtl: no Go source files ● 根本原因 dmitri.shuralyov.com が落ちてるんで GCP のビルドが通らない ● 状況 go.sum 見てみるとfirebaseが要求してるパッケージ したがって firebase を使って GCP でサービスを提供しているすべてに影響するはず こまるわー
既存のパッケージがGOPATHにはあるはずなんだけど、どうしたらいい?
なんとなくGCPのビルドシステムの問題にも思えてきた だってGOPATH(~/gopath/pkg)には一式存在してるもん なんでダウンロード(というか最新版チェックしに行ってる?)できないからってビルドを失敗にすんのよ
>>712 dmitri.shuralyov.com って個人じゃないのかな? 企業ってこともあるのか よかった復活した そしてやはり個人持ちのホストの模様 ホストでしっくりこないならサーバー Google Domainsでドメイン管理してるからGoogleCloud上にあるのかも
しかし個人のホストからimportするリスクやばいな Goチームの人だから許されてるのか?
GitHubかGoogleSourceRepositoryにホストすればいいのにな
う、Google Source Repositoryって、もしかして source.developers.google.com/p/プロジェクト/r/リポジトリ/... ってパッケージ名になるのか?長
引数を値渡しするか、ポインタ渡しするか それが問題だ sliceは値渡しでも良いよね 要素を追加しようとすると結局新しいsliceが必要 ポインタのポインタとかやりたくないし stringは普通は変化させる時は新しい物を作るから、値渡しで充分 空を表現するには空文字列で良いし 構造体はどうすべきか 全部ポインタ渡し?
>>718 基本的にポインタで渡すべきと思ってる 値を使うには細心の注意が必要になるから 速度的に有利とかいう話はあるけど スライスなんかは内部にポインタ入ってるし、文字列だってポインタだから、メンバとしてそれらを持ってる構造体を値渡しするのもナンセンスじゃね? それらのメンバにアクセスしたとたんにページフォルト起こる可能性があるから、速度面での優位は怪しくなるという意味でナンセンスだろうという 値渡しはスタックに積むだろう(それ以外に方法があるのか知らない)から、スタックを圧迫するはずという理屈も加味 >>719 いや、サイズが大きいのは基本的に可変長であるスライス、string、mapなのだから、それらだけは内部的にポインタを持って実質的に常にポインタ渡しとなるようにしておけば、常に値渡しでもパフォーマンス的にほぼ問題にならんだろうというのがGoの設計意図だよ 個人的には、同一の実体として振る舞うようなOOのインスタンスに近い性質の構造体はポインタ渡し、単なる値の寄せ集めは値渡しとして使い分ける >>720 ググってみたら、goではスタック足りなくなると拡張すんのか……すげーな 論理アドレス空間ははじめから確保してるんじゃないの? だったら他の言語と変わらない気が
例えばjavaではStackOverflowErrorになるし、cだと検出すらされない(今は知らない goでは関数呼び出し時にオーバーフローをチェックして拡張するらしく、初期値は4KBだとか ほんまかいな?
考えてみれば何万とgoroutine作ってもびくともしないようにするには、それくらいやらなきゃダメだろうから納得すべきか
>>723 1.4までは8kB、今は2kB 1.4リリースノート >>723 >cだと検出すらされない(今は知らない 今でもOS任せですよ。Windows だと例外としてキャッチできますが。 Elixir は、10万の小プロセスが、並列で動く 結局、Rust, Elixir は、普及のキャズムを越えられなかったから、 Go の1強になってしまったけど
かえすがえすも、名前がイケてないのが悔やまれる もっとマシなネーミングをできなかったのか
正直goって流行っている感じじゃないんだよなぁ めんどくさいし
むしろGoよりめんどくさくない言語の方が少ないだろ
ゴリゴリ書かなきゃいけないという点で面倒くさいけどゴリゴリ書いてしまえるという点で面倒くさくない
Pythonとかの思い付くまま適当に書いたらシンタックスシュガーでなんとなく動く、それを簡単だと言ってるんだと思う
PHPとかの方面の人から見ると、面倒で使えないと思うんだろう node.jsやらと比べて数倍の性能を叩き出すWebAPIをちょちょいと書けてしまうから手放せない Webアプリなんて、WebAPIとJavaScriptとHTMLがあればすむ話だからPHPとかやる奴こそ面倒なことやってんなーと思う
>>735 ひと昔前はそれが普通だったからねえ railsもphpもサーバーがHTMLを組み立てるという思想ありきで生まれたから仕方ない 今その役目は消えたからほぼ全てのフレームワークがオーバースペックになってしまった Pythonでマップのインデックスで {(a,b): c} とやってるのを見て、ちょっと羨ましく感じた Goだとタプルは型じゃないもんな
VSCode VSCodeのGoの拡張機能は結構クソだが、Goばかり書くわけじゃないのでGoに最適なエディタはどれかとか興味ない
>>740 他のエディタ使ってないからVScode特化の話なのかわからないけど おかしい動きを見せたら、まずコマンドで Restart Language Server >>740 それでもダメな場合 Install/Update Tools 全部チェックして実行 VSCODE良いね。 Goプログラマーの仲間入りしました。
>>740 lint使えばvscodeでも快適だぞ 依存しているパッケージも拾って来てくれるから Goは補完が大事だから他の環境はマジで貧弱すぎる vim拡張とかこれでコード書いてる人いるのか?と感じた
俺は補完は好きじゃなくて逆に鬱陶しく感じてしまう。 タイピングのリズムというか、今xxxという操作/入力しようとしたのに余計なことすんな と思うことしばしば。
「(」打つと勝手に「)」も入るやつとか おせっかいに「()」の真ん中にカーソル移動するやつとか 自分でタイプすると hoge()) みたいになってうざい
go.modに勝手にgo1.13みたいなものが入ります やめてほしいですが誰に言えばいいですか?
自分で指定すると思ったけど もしかすると、参照するパッケージに引きずられる可能性があるのか? パッケージがリンクするランタイムの中で最新になっちゃうとしたらどうしようもないかな
ツールアップデートしたら#41870にバッチリ引っ掛かってしまった
俺はコンパイラが無様すぎると思うんだけど、どう思う? https://play.golang.org/p/XRFmBiqhqJp インタフェースAを返すメソッドを持つインタフェースB。 そのメソッド実装がインタフェースAを実装しているポインタを返しても、 ./prog.go:34:4: cannot use &Base literal (type *Base) as type IBase in assignment: *Base does not implement IBase (wrong type for Sub method) have Sub() *Sub want Sub() ISub と、インタフェースAを返しているとは認められない。 C / C++ のプリプロセッサのマクロって #define A(X, ...) X A(__VA_ARGS__) みたいな再帰的な処理出来ないけど この問題昔から指摘されてるのに 40年経っても1000年経っても解決されないよね 解決しようと思えば出来るのに C++ の拡張とかばっかりやってる
>>757 そしてあなたも解決しようと思わないのでしょう? >>757 「型無しのマクロを使うな。template使え。」という方向だよ。 C++で今さらそんな拡張ありえん。 >>760 スレ違いだが通りすがりに言っておくと、 マクロにそこまでの機能を求めるのなら、 自前でスクリプト言語(AWK/Perl/Python/Ruby)等でソースの事前処理をmakefileに書いた方がいい。 それだと無限に機能拡張出来る。 だからC++というかmakefileシステムでそれをやる意味はない。 よってまともな奴は誰もマクロの拡張なんかしようとは思わない。 「言語」にそれを持たせる意味がないから。 (言語による垂直統合ではなく、makefileによる水平分業で全く問題ないし、融通も利く) ただしGoはそれを標準機能で付けてる。 これがどう役に立っているのかは知らん。 (Go generate、AST木が参照出来るので上記のマクロ拡張とは次元が違うが) 知らないだけかも知れないけど、generate が build と分けられてるのが使いづらく感じる go.mod に generate のパラメーター書いておくと build で実行するとかじゃダメなのかな
そもそもプリプロセッサーが何をやっているか考えたら再帰なんかできない事ぐらい分かるやろ もう相当前のものだしなぁ 逆にC#とかだとCで出来たような事が出来ないから不便だと思った事があるわ
今時も何もgolangではポインタはバリ現役 というか、golang使ったことないんだな哀れ
ポインタが散々叩かれて色んな言語で無くしたけど 最近のモダンな言語では復活してきてるのは面白い
つーか名前をへんてこにして誤魔化すとかじゃなく リアルにポインタの概念(何かのオブジェクトを指す変数)を消し去ろうとしたら あらゆるものをコピーでもっといてしかもそれらを常に同期して同じ値になるように 常に維持する仕組みにするしかないがそんな非効率きわまりない言語が実用に値するはずがない
ポインタがない言語ではオブジェクトは参照コピー プリミティブはコピーというのが最近のスクリプト言語の常識 ただ細かい違いは言語ごとに違ってハマりどころになってる
>>771 全部イミュータブルにすりゃいいんだよ コピーと参照渡しを区別する必要がなくなる >>775 Haskellはモナドの裏に隠してる 正確にはランタイムと言った方が近いかもしれないが ていうかHaskellのイミュータブルな配列でもUArray(UnboxedのU)が提供されてるしポインタ・参照・Boxedからは逃れられんよ >>771 >>773 × 最近のスクリプト言語 ○ ポインタを使えないほぼ全部の言語 だよ。C#もJavaも同じだ。 ただ実際のところ、これで大して問題にも遭遇しない。 そもそもCですら . なんてゴリゴリ速度チューニング時以外は使わず、 -> と []ばかりだ。 そしてC++で参照(&)が導入され、今君が認識しているいわゆる「オブジェクト参照」は全部これになった。 だから俺はあんまりポインタは必要なくて、 -> を . として結果的に -> しか使えないようにした、 最近のほぼ全ての(というかC/C++以外全部、多分Goも含めて)言語の方が正しいと思ってるけど。 Goも制限付きポインタで、C++の&相当でしかなかった気がしたけど、違ったっけ? なお、ポインタという「概念」を消し去るのは無理だよ。 これを何故か理解出来ない馬鹿が多いのか、Python使いは無駄に吠えてくるけど、 プログラミングを本気でやるつもりなら、その根幹の実装を理解することは避けて通れない。 >>775 erlangは全部インミュータブルで、ループ(for文)すらなく、全部再帰らしいよ。 c#はunsafeでめちゃくちゃできるけどね やろうと思わんが
>>778 うん知ってる。 ついでに言うとstructが値渡しで、Cで言う . による高速化もつまみ食い出来るようになっている。 ただしこちらも主な使い方ではなく、実際に効果が出る小オブジェクト(確か16バイト以下)で限定使用することが推奨されてる。 その辺はC#は実用言語だから地味に整備してある。 unsafeもその一環でしかない。 だが結局のところ、その辺の小異に目をつぶればC/C++/C#/Java/Python/JavaScript等の現在の主力言語はどれもほぼ同じで、 C/C++だと直接ポインタを扱える、位の違いしかない。 それはつまらないとして、敢えて独自路線を行ったのがGoだが、ポインタ周りは大して独自でもなかった気がした。 Goじゃないと出来ない/他言語でやると凄く苦労する、てのはないよね? (というかポインタ自体Cの時点で完成してて、その後は精々間違いを自動検出する方向にしか進化出来てない) 多分Goの売りはgoroutineとgenerateなのだと思う。 ただ俺にはgoroutineがそんなに便利とは思えなかったし、そもそもあれコルーチンではなく単なるスレッドだから名前間違えてるだろ、だ。 generateについてはCマクロをゴリゴリしたい奴には非常に有用なのだろうけど、そもそもそんな奴は多数派ではないし、俺もそうじゃない。 ただしAST木が標準で出せるというのはかなりインパクトはある。 とはいえ、AST木では低レベル過ぎて困るので、本当はもっと上のレベルが欲しいのが大半なんじゃないかと思う。 ちなみに最近の言語でも評価が固まってないのは例外周りで、これは各言語によってまるっきり違う。 Goはドベタにerrを値で返す、仕様としてはCモドキだが、現実的には一つの選択肢だとは思う。 格好良くはないが。 >>779 いや、goroutineはスレッドとは隔絶してるんよ そしてこの間まで理解してなかったけど goのスタックフレームつまり自動変数も他の言語とは隔絶 それはgo独自の優位性で、goroutineは初期スタックサイズは今では2kBしかない そのため、数百万のgoroutineを作成できる これは巨大なコンテキストを必要とするスレッドでは太刀打ちできない性能なん >>780 > goのスタックフレームつまり自動変数も他の言語とは隔絶 どこが?サイズだけならCは調整出来たと思ったけど > そのため、数百万のgoroutineを作成できる それは既に結論は出てる。 以下ブログ、俺が読んだ時とはだいぶ趣が異なるが、(当時は確か初期サイズ4KBだったはず) https://github.com/maxpert/raspchat/releases/tag/v1.0.0-alpha 要は2KBでも十分大きすぎて、Nodeの方が断然まし、ってことになってる。 これは当たり前で、Linuxのkernel領域でのスタックサイズが128Bだったか256Bかに制限されているらしいから、 その気になればLinuxは256B/threadでスレッドを起動出来る。 そしてNodeはシングルスレッドだからスタック領域が余すところなく全部消費される。 これはGoではどうやっても出来ないことだ。 というよりJSのシングルスレッドアーキテクチャは最初からこのc10k問題解決を主眼にしてる。 だからその領域ではそれ用に作られたJSに勝てるはずもなく、実際そうだった、というだけ。 goroutineのサイズをケチってどうこう、って作戦は究極にはJSのシングルスレッドアーキテクチャに行き着く。 だからその方向ではNodeには勝てないのは仕様だよ。 そうじゃなくて、言語サポートがあるからスレッドがお気楽に使え、それがgoroutineです!って方が順当で、 実際そのブログの作者も喜んで使ってみたが、思ってたと違う、、、というのがそのブログだよ。 > そのため、数百万のgoroutineを作成できる 数百万のthreadなんて実際あり得ないし、管理も出来ない。 そこをgoroutineならお気楽に生成/消滅出来るので、これまで「面倒/管理が難しい」等でthread起動しなかったところを、 「これは別スレッドでも動く」というだけの理由でお気楽にすべてgoroutineで切り離して行けば一見超並列出来そうに見える。 ただ、実際それをやったらそこで遭遇している問題、つまりgoroutineは思っているほど軽くない、に遭遇してしまう。 現実的にはthreadなんて論理CPU数の2倍程度あればCPU処理だけなら埋まってしまうからそれ以上起動しても意味がない。 I/Oで引っかかった時のスタックサイズをケチりたいのなら、 JSのように非同期でシングルスレッドにする方が原理的に上だし、実際そうだった、というのがそのブログだ。 軽さ速さは環境によって変わる 少コア環境ではM:Nスレッドモデルのgoroutineは有効に機能しない場合がある 少なくともGo開発側はM:Nスレッドモデルに合わせるにはasync/awaitモデルよりスレッド/チャネルモデルの方がいいと判断した 位の話でしょ goroutineのモチベーションは非同期処理についてG社が持つようなメニーコアかつ分散な環境でスケールするかって話をしないと伝わらないよ
>>782 逆に言えばそれ以外の環境では他言語に劣るわけだろ。 元々は多分、命名からして、コルーチンをgoroutineで、ということなのだと思う。 コルーチンは通常は本体側と交代で間欠的に動作する前提で書かれているから、スレッドで切り離すことはしない。 ただ、もしそれが本体と並行に動作可能なら、スレッドとして切り離せば、 本体側が動いている間に次のyieldまで動作させられ、コルーチン部分の処理時間を見た目ゼロに出来る。 実際、大半のコルーチンはこれが可能なはずで、これまでは単に面倒/スレッド生成消滅のコストの為にそこまでやらなかっただけ。 だから、スレッドよりもっとお手軽で軽いgoroutineを用意すれば、という訳だ。 OSでの並行はprocessだが、multi processは重すぎるのでアプリ内processとしてthreadが出来た。 それと同様に、thread内の並行として、goroutineという、もう一段軽い物を用意した。 だからここまでのストーリーは辻褄が合っているとして、それがどこに適用出来るかだよ。 CPUが精々数個しかないそこら辺のPCだと、threadだけで埋めきれるので、普通にそれが最適解になる。 threadだけでは埋めきれないほどのCPUがあり、積極的に並行goroutineとして切り出してくれないといけない、 という、いわゆるメニーコアならGoの方が有利になる可能性があるけど、実際この場合はキャッシュコヒーレンシの問題が発生してくる。 勿論チャネルだし、後はオブジェクトの中身も含めてインミュータブル、 つまりErlangの世界まで行けたらこの辺の問題も無くなるけど、Goはそういう感じじゃないでしょ。 そもそもメニーコアの筆頭のXeonPiも死に体だし。(これはGoのせいではないけど) だから、>>782 の観点だけなら、 Goは素晴らしい実験用言語だったけど、現実的ではなかったね、で終わると思うよ。 実際、Goって使用者は増えてるのか? Rustは前年度「Rust新規に始めた人数よりCを新規に始めた人数の方が多くなっちまったよオイオイ」とか話題になっていたが。 JSはプログラマに、I/Oを明示的に切り離して高速化することを求め、(実際あの非同期は壮絶にウザイが)現実的にはものすごく機能してる。 Goはプログラマに、並行可能な部分を積極的に切り離すことにより超並行によって高速化を目指している、と捕らえることは出来るが、 実際これは全く上手く行ってないし、今後とも上手く行く気配もないでしょ。 一時期、CUDAよりもXeonPiだ、という時期もあったはずだけど、なんか話題はCUDAに戻ってるしさ。 ホントにあんまり知らんのだろ。 恥かく前にやめとけ。
シリコンバレーって所でPythonから移行が進んでるそうです
yieldが必要なコルーチンとは全く関係なく、昔で言うグリーンスレッドを超低コストで実現してるという方が正しい。 エアプしてる時間があったらスケジューラの動きとか調べてみたらいいよ。
スレッドプールとかが効いてくるネイティブスレッドではなくて、あくまでグリーンスレッドだからな。
>>784 ここで言ってるメニーコア環境がXeon PhiなどではなくXeonやEPYCのようなパッケージのコア数の向上とそれを積んだ大規模分散環境の話だって伝わってないって事は分かった どこまで適用できるかって話に関してはG社が自分とこに使えればそれでひとまずOKというラインがあるのでそっから先は知った事ではなくて良いのでは? ↑は >>785 にも続く話だけど現実的でないとか上手く行ってないとか結局それが現実的でなく上手くいかないタイプの分野・会社に君がいるだけじゃないの?と思ってしまうよ メインスレッドすらグリーンスレッドで、数本立ってるネイティブスレッド上でタスクを持ち回りで実行してるから、await asyncは自動的にされてると思って良いぐらい。
>>784 コルーチンを指向していたならchannelなんて使わんだろう。 どっちかというと軽量プロセスの方向性。 >>788 > グリーンスレッド この言葉は初めて聞いたが、確かにJavaやRubyでは普通に使われてる言葉らしい。意味は確認した。 なるほど、スレッドだと論理CPUを跨げるので、その部分がOS管轄になるから重いのか。 goroutineがグリーンスレッドなら、マルチコアだと全く性能が出ないな。 まあそれはいいとして。 なら、そもそもネーミングが悪いよ。 gogreenthreadとか、まんまの名前の方が良かったよ。 (ただしGoは意図的に他言語に合わせてない部分があるからここもかもしれんが) 確かにthreadではないのは理解した。 >>790 > Xeon PhiなどではなくXeonやEPYCのようなパッケージのコア数の向上とそれを積んだ大規模分散環境の話だ いやそれは同じだぞ。少なくともプログラミングモデルは変わらないだろ。 実は俺は785投稿した後に、「あ、もしかしてNiagara等(有名なのは京)のCPU内メニースレッドの話か?」と思ってしまったが、 そうじゃないのならそっちも間違ってるぞ。 上記の通り、それだとgoroutineでの性能向上は不可能だ。 そしてグリーンスレッドだというのなら、CPU内メニースレッドには非常にマッチする。 実際Niagaraとか64スレッドだが、正直64スレッドなんて普通のthreadでは埋めきれないし、 それ向けにプログラマが積極的に切り出せ、というのは技術的にはかなり納得する。 だからグリーンスレッドの多用での性能向上を目指した、というのが合ってるんだと思うよ。 その後の話はその通り。 確かに俺にとって有用ではないから俺は使わない、で終わりだ。 やってる連中はそれが役に立つと思ってるからやってるだけ、というのは確かにそりゃそうだ。 > > グリーンスレッド > この言葉は初めて聞いたが、 ええっ!?
>>791 まあとにかくgreenthreadだというのは理解した。 (仕様を確認したわけではなく、そちらの主張通りの方が色々辻褄が合うからそうなのだと思う) > await asyncは自動的にされてると思って良いぐらい。 それはgreenthreadの話ではなく、他の普通のマルチスレッド言語は全部そうだよ。 実際、PHPが使いやすいのはこれだし。 むしろJSだけが異端。ただし、俺はあれはそうする意味があったと思っている。 >>792 > コルーチンを指向していたならchannelなんて使わんだろう。 これは間違い。 コルーチンならyieldだけであり、channelでも全く問題なく機能する。 そしてchannelにするのは、(君はおそらく完全なソフトウェアプログラマだから理解出来ないのだろうが) 一般的には共有メモリを使わせず、一番速い同期機構にする為。通常はそれがchannelだとされている。 ただし共有メモリが遅くなるのはキャッシュコヒーレンシがらみであり、 greenthreadなら共有メモリ同期でも全く遅くもならない筈だから、本来は禁止にする必要もないし、チャネル縛りにする必要もない。 (実際Goだと禁止も縛りもされてなかった気はするので、言語的には辻褄は合ってるが) ただし間欠動作ではない為、mutex等の同期化機構は必要で、それも嫌だというのならチャネルになる。 > どっちかというと軽量プロセスの方向性。 これは俺はそう言ってる。 >>791 ちなみにgreenスレッドスイッチは何で起動してるか分かるか? なおgreenthreadについてはありがとう。これだと色々辻褄が合う。 781のブログも、「そもそもgoroutineってそんなに使いたいか?」という疑問があったのだが、 greenthreadでchannel同期なら、実装は単なるFIFO=リングバッファだから原理的に最速だ。 だから何でもかんでも「goroutineに出来る物はgoroutineにする」という方向性で悪ノリしたくなるのは分かる。 ただ、2KBはオーバースペック過ぎるから、それで頓死するのも分かる。 さてスレッドスイッチ、理想的にはキャッシュミスでgreenthreadスイッチが行われればいいのだが、 現状のx86ではこれは出来ないよな? そもそも例外はOSに行ってしまうし、キャッシュミス時はそのCPUスレッドはそこでストールしてしまう。 一番近いのはTLBミス例外だが、それもOS行きだ。 ページフォールトしていたらプロセススイッチで終わり、 していなければそのまま処理が返ってきてキャッシュが充足されるまでストールしたまま待たされるはずだが、 そこでCPUが遊んでいる時間を他greenthreadで埋めてしまえ、というのは思想としては分かる。 ランタイム側で「TLBミスからの復帰」だと分かればgreenthreadスイッチ可能だが、 一般的には例外からの復帰はユーザープロセスからは見えないだろうから、おそらくカーネルに手を入れないと無理だ。 それでもやってしまえば面白い。ただ、この場合にgreenthread間でスラッシングした場合は悲惨なことになるが。 というわけで、スレッドスイッチ起動のネタは分かるか? 従来通りタイマなら、面白くもないがまあ、というところ。 greenthreadで最小構成ならスレッドスイッチのコストはPC/SP/Flags復帰分=関数1回呼び出し分でしかないから、スイッチし放題ではある。 だから豆にスイッチしまくりというのも面白いが、それでもキャッシュミスでのストールは避けられない。 そこでハードウェアサポートがあってキャッシュミス時にgreethreadスイッチが出来れば圧倒的に面白くなるが、 現状のx86だと出来ないよな? >>781 goだとスタックを動的に自動拡張するのが味噌 ケチってるんじゃないよ 関数呼び出し時にフレームをチェックして増量する >>781 あと10K問題とか勉強してからにしたほうが恥かかないよ >> どっちかというと軽量プロセスの方向性。 >これは俺はそう言ってる。 なんか言っていることがむちゃくちゃ。コルーチンの話はどこ行った? そもそもchannelはコルーチンじゃ無理だろうて。
>>797 それはわりとどうでもいいな。 だったらgoroutineの初期値も0であるべきだよ。 スレッド同期に2KBなんて普通は必要ないし。 とは781のブログからなら思うが、要はそんなケチ環境は相手してないって事か。 まあそれもありだな。 >>769 問題はポインタそのものじゃなくて型の要件を満足しない型無しnilだしな。 nilポインタ禁止にすりゃ良かったのに。 >>793 マルチコアで性能が出ない理由がわからん。 複数コアでタスクが空き次第実行してるから、単一コアのグリーンスレッドとは全然違ってフル回転するぞ。 >>795 phpはマルチスレッドと言うよりもマルチプロセスだろ。 他のマルチスレッド言語は言語によって全然違うよ。 pythonなんかは最近aioが整備されたじゃん。 select使うかどうかじゃね? >>796 コンテキストのスイッチとスケジューラはなかなかなるほど賢いなって思うぐらいのアルゴリズムになってるから、俺が説明するより本家読んできたほうが為になるぞ。 なんで性能向上が不可能なんだろ。 goroutineがたくさん起動する状態だと、同じような処理がタスクの切れ目でスイッチされることになって、キャッシュのヒット率も低くないし、ブランチ予測もそれなりにあてになる状況だろ。 GILかかる言語でもあるまいし。
>>806 確認した。(日本語版だけ。英語版は後で読んで少なくとも感想は返す) スライド若干間違ってる、というかこいつ自身同期分かってねえ感じだが、ソフト屋ならこんなもんだろう。 ただいずれにしろ結論として、「共有メモリは遅いから使うな」で良いし、実際それ以上の理解は現実的に必要ない。 >>805 話がずれているのは俺がgreenthreadの定義を狭く捉えすぎていたからだな。 その記事で言う N : 1 だと思っていた。 これまでの俺のgreenthreadについての書き込みは全てこの定義だ。 だから当然他CPUを掴めないので高速化しようがない。 ただしGoが M:N なのは分かった。 しかしこの場合にCPUを跨ぐ為には当然OSのサポートが必要で、 当然そのスライドでもメッセージをkernelに投げてる。 問題はM:Nだと大して美味しくもないことだよ。 いや、Go界では当然凄く美味しいことになってるんだろうけど、N:1だと使える爆速最小実装がまるで使えない。 なら次段階は通常は「常に同一コアに割り当てるスレッド」をグルーピングしてその間だけでもこれを利用しよう、となるところだが、これもやってない。 勿論こんな事をやると思想に反するからだろうけど。 ただまあ、思想として、スケジューラ周りをランタイムに丸投げして「どんなスケールでも最大効率」を目指してるのは分かった。 とはいっても、メッセージをkernelに投げざるを得ない構造になってるから、改善余地があるとすればスケジューラ程度でしかない。 そして、俺は別段OSのスケジューラが間抜けとも思えないけど。 あれ、CPUが余ってたら振ってくるだけだし、実際演算とかで100%CPU掴む環境ならそれで必要十分だからね。 あるだけよこせならpriorityを上げればいいだけだし。 あと強いて言うならスレッドのスタックサイズが小さく済むことか? しかしあれ、俺は知らんがthreadがOS管轄ならOS単位でしか指定出来ないものなのか? それも奇妙だと思うから、普通はシステムコール時に引数与えて指定出来て然るべきであって、 今のLinuxがそうなってなくても当然いつかそうなるものだとも思うけど。 少なくとも.NETはnew Treaadでスレッドの最大サイズを指定出来る。 こいつもランタイムが管理するスレッドかもしれんけどさ。 >>807 ソフト屋ソフト屋と言ってるが、何屋なんよ。 解ってないと言うか、お前が何か変な想定してると思うぞ。 M:Nで、かつスケジューラがまともな場合、に関しては相当美味しいと言う事が理解できて、スケジューラのソースはgithubにあるはずだが、読んだ? stealは無差別にstealする訳じゃないぞ。 1コアあるだけよこせだと、IOバウンドな処理の時に勿体ないでしょ。 小さく済むと言うか、バカほど立てられるんよ。 .Netの話はネイティブスレッド。お前ホント理解できてないのな。 >>807 常に同一コア云々に関しては、ソース読め。 >>807 CPUをまたぐ場合にはOSのサポート、もちょっと違うだろ。 あくまでグリーンスレッドで、ネイティブスレッドじゃねえぞ。 システムコールだったり、アトミックに処理ができるだったりでタスク覗くときにどうなってるよって話じゃねえの? マジで自演人形劇はやめとけって どんどん病気がひどくなるぞ
>>810 > M:Nで、かつスケジューラがまともな場合、に関しては相当美味しいと言う事が理解できて 俺は別に美味しいとは思ってないぞ。 M:NならOSのスケジューラと大差ない筈だし、 実際ランタイム判断でN:1に出来る状態でもNodeに負けてるだろ。 カッコイイスケジュールをやりきるより、スケジュールなんてしない、の方がシンプルで速いんだよ。 Goは例の「一方ロシアは鉛筆を使った」のアメリカ側をやりきってる感じがある。 とはいえそれもソフトウェア全体の成長の芽の一つだから、やること自体は頑張れ、でしかないが。 > スケジューラのソースはgithubにあるはずだが、読んだ? 読んでねえよ。ただ、読む価値ねえから読まねえよ。遅いスケジューラなんて意味ねえし。 > Netの話はネイティブスレッド つまり普通のスレッドだろ?ならWindowsはスレッドのスタックサイズを指摘出来ることになる。 Linuxでこれが出来ないとも思えないので、goroutineは軽いんです、なんて利点はなくなると思うが。 >>812 そりゃお前が理解出来てないと思うぞ。 上述の通り、スライドでもメッセージをkernelに投げてるだろ。 そこを同一CPU内にディスパッチされた場合にのみN:1専用超軽量ルーチンで処理するよう、 スレッドスイッチの際に全部張り直す、というのもありだが、実際それやってても大して速くないと思うぞ。 そこは本来はプログラミングモデルを明示的に変えないと駄目なんだよ。 同一CPU内でのみ動作するスレッドであれば、スイッチのコストはほぼゼロだから、がんがん切り出して問題ない。 一方、メッセージにkernelを挟む必要があるのなら、それはそれだけでコストがかかるから、何でもかんでも切り出したら余計遅くなる。 だから本来は goroutine のみではなく、 golight とか、N:1スケジュール専用のgoroutineを用意しないと駄目なんだ。 それがなくて全部goroutineで扱うから全体的に遅くなってしまう。それがブログ主がやった事だよ。 ただこれを分離するのは思想的にやりたくないんだろ?ならそこが限界だよ。 >>806 さて英文の方も読んだ。 なるほどGCの為にスレッドの動作状況を調整する必要があるから、スケジューラはどのみち内部に必要なのか。 これは俺はCでしかスレッドを使ってないから気づかなかったわ。 ただその後GoはノンストップGC入れたと聞いたから今は要らんだろとも思うが。 Syscallの時にハンドオーバーしたいのは、ぶっちゃけもう一つthreadを立てておけば済む話だよね。 (GOMAXPROCSをCore数ではなく、Core数+αにする。ただしそれに似たような話は書いてあるが) 内容は日本語版と同じだね。そりゃそうだが。 ただ、英語版の方が確かに実装した理由が書いてあったから読み物としては良いが。 >>814 スケジュールなんかしない、って全然ありえないんじゃないか?それこそ非同期の時代に。 Nodeにはだいたい勝ってるかと。 読んでもないのに読む価値がわかるとは凄いな。 スレッドのスタックサイズが問題ではなくて、ネイティブスレッドか否かが問題なの。アホか? だから、スレッドではないから、スイッチのコストが全然違うの。 goroutineはスレッドのようなものであって、スレッドではないからそもそも切り替えのコストがほぼない。 だからガンガン切り出していいの。 なんにも聞いてないのな。グリーンスレッド勉強になったんじゃないの? >>815 もう一つスレッドを立てるとか言う観点がナンセンス。 何度も言うがgoroutineはスレッドのようだがスレッドではない。 古いPerlスクリプトをGoogle Compute Engineの無料枠で動かそうとしたら cpanのDBD:mysqlのmake時のテストで多分メモリエラーで落ちた いい機会だからgoで作り直すことにしたわ(´・ω・`)
>>816-817 実際Nodeに負けてるのは事実だし、あのブログ読んで技術的に俺は納得してる。 782も納得してるし、他の連中もあの貧弱環境ならそうだな、となると思うが。 ちなみに当たり前だが全ての環境で全敗するわけではないぞ。 俺も数年前に味見でPHP/Node/Goで同じものをPCのXAMPP上で試したが、 GoはNode比2倍、PHP比6倍のパフォーマンスが出た。 (僕のカワイイGoを虐めるな!って感じだから、、これを言ったら満足するか?) それで俺はPHPで行くことに決定した。 PHPのパフォーマンスで俺には十分だったし、無料鯖は現状PHPのみだからだ。 そしたらGoでやってた奴が「ゴラアふざけんな!」って言ってきたが「知るかボケ」と返した。 あいつはPHPの糞コードがこれ以上世の中に増殖するのが許せなかったらしい。 実は本当はNode無料鯖が大量にあればNodeにしたいのだが、今はそうではない。 よって糞とは分かっているがPHPだ。 ただ、そのGo使いは「Goなんて遅すぎ、Rust行くわ」と言って今はRustでやってるよ。 そりゃパフォーマンスだけで勝負するならRustになるし。 静的なコンパイル言語なんだからスクリプト言語と比べて速いのは当たり前。 それが貧弱環境だと覆るのはアーキが悪いんだよ。 そして何故そうなるのかを色々理解した上で、それぞれが用途に適したものを使えばいいだけ。 今のところ俺がGoを使うことになる芽はない。だからって何だよ、でしかないとは思うけど。 最近のお前らがよく分からんのは、言語べったりで言語と心中しようって奴が多すぎることだ。 お前の使ってる言語が良くても悪くてもお前の成果でもないし、悪口でもないだろ。 ぼくがつかってるげんごすごい=ぼくすごい、なのはゆとり特有な気がするが、 何故お前らがそうなるのかさっぱり分からん。 >最近のお前らがよく分からんのは、言語べったりで言語と心中しようって奴が多すぎることだ。 なかなかの妄想力
後半完全に何言ってるのか分からん 病気じゃないのかお前
>>821 PHPは歯ブラシとしては優秀だからな。 それは認めるわ。 ただ、XAMPPとか無料鯖とか言ってる次元で意味がわからん。 普通自鯖だろ。 ちなみにRustが持て囃されてるのは、早いからではなくて安全だからだぞ。 大量の並行処理をさばくならGoの方を俺は選ぶが。 言語べったりと言うが、このスレはGoのスレなんだし、そもそもお前が他の言語に対して理解がなさすぎて、何でも自己流の解釈するから頭おかしい結論になるんじゃねえか? お前らな、「グリーンスレッド?知らんかったわw」の時点で気付け
わざわざgoスレに乗り込んできて何がしたかったんだろ
スレッドのようなもので、スレッドではないって言ってんのに頭の中スレッドでいっぱいだから理解もできてないし。 何なんだろうなホントに。
goroutineのオンリーワンは当分揺るがないだろな 同接数十万以上とかのWebAPI作るならgolangが第一候補 そこまで性能が求められない場合では、保守性からJavaとかNodeみたいな人員調達容易な言語
Go書けるまともな人相当少ないからかなり美味しいんだよな 世の中の人プログラミング苦手なのか?と思ってしまう スクリプト言語かいてイキってた人達が沈黙したし
この10年ぐらいはスクリプトでイキリがほんと多くてウンザリした
>>816 君がその程度の理解なのは理解した。 ただそれはGoの思想「何でもかんでもgoroutineに切り出せば自動的に速くなります」なのだろうからGoUserとしては悪くない。 しかし現実にはNodeに負けてる、ってこと。 君らの問題は、何故それが起きるのか理解出来ないことだ。 これは806のスライド作った奴もそうだが、何故遅くなるのか、何故速くなるのか、理解出来てない。 ただ、そう教えてもらったから、という知識しかない。 しかしこれもそんなに酷いことではない。 最近は複雑化したハードウェアに対応する為に、ソフトウェアも複雑化してる。 学生では単純に知識量が追いつかない。 となるといわゆる正しい作法で洗脳する、というのが現実的な解で、 それがJavaでのオブジェクト教、Goの場合はgoroutine教なのだろう。 しかし既に言ったがchannelしか使わないのなら現実的にそれでいいんだよ。理由は分からなくても。 ソフトウェアを資産として捉えた場合、正しい作法で書かれた物が大量にあることが重要であり、 君らがGo流の正しい作法で書くのなら、それはGo界の資産となる。だから貢献してる。 問題は、その程度の理解なのに限界領域の最速を目指せると勘違いしていることだ。 それは無理なんだよ。ハードウェア上で動いているのだから、ある程度のハードウェアの知識がないといけない。 実際、Nodeに負けてるのも、その理由も、君には理解出来ないんだろ。 なおNodeのはスケジューラとは言わない。ああいうのはキューという。積まれた順に吐いているだけだから。 あれをスケジューラと呼ぶのは、まともなスケジューラ作ってる(つもり)なGoの連中に対しても失礼だ。 ただそこで負けてるのはやっぱりアーキが悪いんだよ。 スケジューラを入れると、一般的にディスパッチの際にその分オーバーヘッドが入る。 だからディスパッチされるジョブが小さければ小さいほどそのオーバーヘッドが大きく見えてしまう。 それは「goroutineで何でもかんでも切り出せ」という思想と矛盾してしまうだろ。 だからNodeに負けた。
C界で有名な話で、「K&Rのmalloc(30行程度)に勝つ為には5000行のコードが必要だった」というのがある。 https://www.wdic.org/w/TECH/malloc 何もやらないのが一番速いから、シンプルなソフトウェアはそれだけで速い。 OSのスケジューラもほぼキューでしかないはずで、Nodeと同様に「積まれた順に吐くだけ」だけど、 逆に、それでいい領域であればそれ以上のスケジューラを持たせても原理的に勝てない。 それがNodeに負けた理由。 JSのシングルスレッドアーキテクチャというのはかなりトリッキーなアイデアではあるが、 ああ割り切ってしまえば世界がシンプルになるから色々省略出来る。 結果、ソフトウェアが全体的にコンパクトになるから思っている以上に速くなる。 それがNodeに負けた理由。 逆にGoの思想でNodeに勝つ為には、「積まれた順に吐くだけ」な馬鹿キューを上回る為に、 「このgoroutineは『いつ』『どこ』にディスパッチすべきか」をきっちり管理しないといけない。 それは今の「空いてれば取ってきます」程度では全然駄目で、上記mallocの戦いなら今はまだ一合目でしかない。 後10倍くらい複雑化してプロファイラーも整備しなければ「シンプルなだけ」のソフトには速度で勝てない。 (プロファイラーを実装したくなければユーザーが明示的に指定するgolightみたいなのがあればいいのだが、 そういうの無しでやりたければ、プロファイラーが要る) 後君らが見えてないのは、複数のCPUを並列/並行動作させるのは実はものすごくオーバーヘッドがあること。 これはx86だと全部ハードウェアがやってくれるのでソフトウェア上では負担がないのだけど、 それはコードから見えないだけで、実際のCPUは止まりまくってるから実行速度はがた落ちになってる。 それがNodeに負けた理由。シングルスレッド限定だとこのオーバーヘッドがないんだよ。 >>830 CPUリソースを余すことなく使う、という意味では原理的にNodeの方が上なんだよ。 本体ジョブしかしないんだから。 ただNodeの場合はマルチコアだと束ねて使うしかない。 これも既に行われているはずだけど、この場合はそれぞれのNode間の直接情報交換は無理筋になる。 (やる場合はDB(或いはエミュレーションレイヤ)経由だが、直接RAM上での交換とは速度では全く勝負にならない) しかし数十万のコネクションを一度に張って、その間で頻繁にやりとりするって何がある?ほぼ無いよね? チャットはそうだけど、だからこそチャットアプリでNodeに現実的に負けたあのブログは大きいんだよ。 だからGoUserが噛みついてDisclaimerまで付いてGitHubにまで追いつめられちゃって、になってる。 ただし、実は現実的にはネットワーク出力は一つなのだからチャットでも何でもシリアル処理実装で全く問題ない。 よって根本的にはCPU単体速度>=ネットワーク速度なそこらのPC程度だとNodeでも問題の発生しようがなく、対応出来てしまう。 これはレン鯖等も含めて。 そうではなく、ネットワーク速度>>>CPU単体の速度、な環境ではNodeでは全く無理筋だが、これがどこにあるかだよ。 クラスタで中身は束ねたPC程度だとNodeで全く問題は発生しないはずで、実際それがNode鯖を使ってる連中の使い方だろ。 GoはNodeの思想からすれば盛大に屋上屋を架している。 それでパフォーマンスが出れば大したもんだけど、スケジューラがあの程度ならまだまだ遠いよ。 「CPUが十分速い」という大前提が成り立つ限りJSの思想はかなり筋が良いんだ。 ただそれが1995の時点で見切れたのか、単にラッキーなのかは謎だが。 >>830 と思ったが、オンゲか? オンゲは確かにNodeでは無理だろう。これは根本的にNode向きではないから。 コネクション単品の処理も重く、コネクション間の情報交換も多い。 逆にコネクション単品が軽いチャット程度だと、goroutineがオーバースペック過ぎてNodeに負けてしまってる。 これはある意味単なる設計ミスで、起動時にもっと小さいスタックサイズを指定出来るようにすれば済む話なのだけど、 それをしないところをみると何か出来ない/したくない理由があるんだろう。 あのブログを出されて噛みつくってのは民度が低くて、スタックサイズを可変にするってのが建設的対応だよ。 ただ、可変スタックサイズなんてやれば出来る話でしかないし、 理由はおそらくスケジューラの性能がその辺だからだろう。 goroutineに切り出すと「スケジューラ」「同期化機構」分だけオーバーヘッドが生じる。 それは「賢いスケジューリング」で取り戻すしかないが、元々軽いgoroutineでは無理がある。 だからある程度重いジョブをgoroutineに切り出すことが必要で、 それ以下の軽いジョブだと到底無理だから消極的に制限してるのだろう。 これだとチャットでNodeに負けた理由も、 またそれでもなおgoroutineのスタックサイズを2KBと巨大なままに保っていることも説明が付く。 実際、データを置かず、再帰も必要な時にしかしないのなら、スタックサイズ2KBなんて埋めようがないし。 >>835 Nodeに負けてるが定量的でないぞ。 お前が書いたNodeのコードに負けてるのであれば、goroutineをどう使えばよいか解ってないお前がポンコツだって事だ。 主観的すぎる。やりなおせ。 >>841 負けてるのは781のブログだよ。詳しく知りたければ読めよ。 俺は彼の分析には納得してるし、その通りだと思ってる。 だから同じような環境なら間違いなく負けるとも思っている。 お前らって(というよりは最近は他言語もだが) 結局Goが「最速最高」じゃないと文句を必ず言ってくるけど、それはないでしょ。 速度ならC/C++/Rustには負けるし、お手軽さではPHPやJSには負けてる。 だからいちいちそんなところで噛みついてくて欲しくないね。建設的な話が出来ない。 完璧な言語なんてないのだから、己の状況でどれが一番ましか判断してそれを使うしかない。 なら、いろんな言語を客観的に見てないと駄目でしょ。 ただ、スレッドで切り離せるところをgoroutineで積極的に切り離せば解があるのではないか? という着眼点でGoが動いているのは分かった。 確かにこれは面白いし、実際threadはそういう風に使われることを想定されてない。 だからこれをやりたかった人達はネイティブスレッドには文句たらたらだったのだろう。 ただ問題は、同期自体が凄く重いのと、 現存のハードウェアはそういった大量の軽量スレッドを生かす方向には出来てないことだよ。 Niagaraは比較的向いてるけど、SPARC自体が死んでしまってるし、富岳もARMになってしまったからね。 と思ったけど、SPARCはOracleが独自改造しまくってたな。 実際OracleみたいなDBサーバーならGoはハードウェア的にもソフトウェア的にも向いてるのかもしれん。
>>833 >>834 俺から見ればGo使いも十分イキってる馬鹿だけどな。 そしてスクリプト言語使いがイキってるのを止めてる気配も感じないが。特にJS/TS。 ただPHPerは叩かれすぎだとは思う。 >>846 そりゃご丁寧にどうも。 ただ、今ここで話した限り、以前の印象「Go使いはC++を使えない馬鹿」ってのを再認識したけどな。 C++も無駄に複雑になって、しかもそれを使いこなすのが目的みたいな勘違い野郎がネット上には増えてるし、 あれはあれでおかしな事になってるが。 ただGoはちょっと立ち位置が悪い。 「端の言語」はとりあえずは生き残れるんだよ。Goはどの面もそこに該当しない。 今なら「最易」枠がPHP/JS/Python。 「最速」枠がC/C++。 「堅牢」枠がJava。 中庸といえば聞こえは良いが、実際に積極的にGoを選ぶ理由がない。 上記の言語はそれなりに糞だと分かってても最○を求めたら他に選択肢がないから選ばれる。 だからのさばってる。 goroutineの思想は確かに面白いが、今はそれを生かせるハードがない。 そしてそのハードを開発させるほど影響力も大きくない。 (ただしGo向けハードウェア開発自体は簡単だから、やる気になればすぐ出来るが) あとはgenerateだね。 ただしgenerateが向いてるのは下地の言語が全機能を持っている場合であって、(つまりC++) Goみたいに綺麗に制限されてる言語には向いてないんだな。 >>843 だからスレッドではない。 同期も重くない。 同期しないためのchannelとselectだよ。 もう少し調べてから書け。 >>847 goはバランスをとったのだと思うな。 最易ではphpやpythonに負けるけどそれらよりは速くできる。 最速ではc, c++, rustに負けるけどそれらよりは簡易に利用できる。 堅牢さでは、、、んー、これはjavaに負けてるのかな?rustには負けてそうだけど。 バランスとったから突き詰めたら他のものに負けるのはしょうがない。 0か100じゃないんだからそれでいいと思う。 goの良さはchannelやgoroutineを用いて従来言語よりcsp(communicating sequential processes)を利用しやすくなったところだと思う。 疲れてるのに長い文章読む気もおこらんから読んでないが >>847 だけ読んで俺は基本的に同意の人間なんだが・・ ちなみにわしはC++が一番好みで最初の数行に同意なんだが 複雑すぎるとか難癖つけるやつが多いがC++が今の形に発展したのには理由がある 哲学、美学先行で必要もなくわかりにくくしているわけではない実用が最優先言語なのだ Go も正直なんでこんな流行してるのか今一理由がわかんない これ使うくらいなら既存言語を用途にあわせてチョイスすりゃいいじゃん、ともおもうが まあ小型のプログラムをサクサクと書くには便利な言語だね ただし、Go は名前がクソ あとエラーハンドリングはなんとかしろわりとマジで /\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたはじまった | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐—´´\
思うに、go言語に未練あるけどもういじりたくない(または理解できなかった)人なんだろうな どうにかして貶めたいという固い意志を感じる
Goが理解できなかったわ無いわ こんなのスクリプト言語レベルだろ
>>850 バランスというより、なんか独自進化じゃないかな。 後出しジャンケンでインターフェイスを実装したことにするとか。 >>851 軽量スレッドなんかは既存言語にはできない事だからな。 goroutine はスレッドをダメだこりゃと車輪再発明する暴挙に出た一品 更にスタックが固定じゃ限界があるって考えて魔改造 そこまで無茶苦茶やらかすことで数百万の平行処理を可能とした鬼子 逆を言えば、そこまでしなければ数百万のリクエストは捌けない デメリットは関数呼び出しからやらかしているためC呼び出しな低レベル処理が書けないという点 WebAPI用途のドメイン固有言語と言ってもいいかもしんない? 到るところでベンチマークが出ていてすら認めたくないのが笑える https://postd.cc/the-way-of-the-gopher/ erlangなんかはこういう発想で軽量プロセスにしてるよね。 とはいえCouchDBでしerlang使ってないけど。
サーバーサイドはGo一択でいいんじゃないか? 速いし運用もこれまでのlinuxの知識があれば問題ない ライブラリも充実してるし 並行処理も便利 これまでforkを駆使して面倒なことしてたけどしなくて良くなった
>>860 そもそもこいつらが使ってるCassandraなんてまさにGCでフリーズする(笑)はずのJavaなわけで、眉唾な話だな もうJavaで書けばいいんじゃないかっていう >>850 > csp(communicating sequential processes) 何ぞそれ?と思ってwiki読んだが、「応用」以前はハア?って感じだな。 応用部分は納得出来るが、それはどちらかというとモデリング&シミュレーションであって、(従来の)プログラミング言語って感じではない。 勿論それ以前の部分はプログラミング言語としてのCSPについて説明してあるはずなのだが、 大半の連中はこれ読んでも俺と同様「何のこっちゃ?」だと思うぜ。 それはさておき、記述しやすいのは事実だから、cspに金脈があるのならいきなりブレークするのだろう。 >>851 C++の現状に歴史的経緯と必然性があるのは認める。 しかしそれは新しく始める人にとっては関係ない話なのだから、言い訳にはならないだろ。 C++は(普通のプログラミング言語を目指すなら)ちょっと仕様を整理しないと駄目だよ。 ただC++陣営は「全部入り、仕様の整理は各人がコーディングルールで制限しろ」で多分考えてて、 確かにそれもありではあるのだが。 実際、C++を気に入ってる奴って、「俺がこうしたい」を記述する方法があるからだろうし。 他言語で「それは書けない」に遭遇すると本当にどうしようもないからね。 Goが受けてるのは簡単だからだよ。 PHPは簡単だがパフォーマンスと文法が糞過ぎ。 JSは非同期がウザ過ぎ、あとフニャフニャすぎて駄目。 Goは型もあるし!難しくないし!パフォーマンスも出るし! となるだけ。俺個人はJSのフニャフニャっぷりが気に入ってるのでそこで止まってるが。 型あり言語出身の奴等が上記フローを流されたら順当にGoに行き着く。最近はTSに行ってるかもだが。 あとGoは意図的に「若者の楽園」を目指しているのが、「見た目は」奏効しているかも。 意図的に用語等を他言語と変えていて、既存言語既習者の参入障壁を上げている。 色々あるが今回ならgoroutine、やっぱりあれはgolwp(lightWeightProcessの略)とかが妥当だろ。 それをgoroutineなんて言葉を使うから、thread/lightWeightProcess/co-routine/greenthread等を知っている奴等は余計に混乱する。 ところがこれらを何も知らない若者は全く混乱しない。だから結果的に若者が後れを取らない。 ちゃんと用語を合わせた新規言語(Go以外は全部こうだが)を作った場合、 他言語既習者は文法だけの修得でがんがん進めるのに対し、 新規プログラミング学習者(=若者)はOOP等の「プログラミングそのもの」の部分で学習に時間がかかり、 早々に頭を抑えられて、結果、「老害」とわめくことになる。 Goのように意図的に既存言語から変更している場合、既存言語を知っている奴等だけが混乱する。 結果的に、既存言語既習者の流入が減り、「老害」が比較的少ない環境=若者にとって居心地が良い環境になるわけだ。 ただしそれは見た目だけで、実際は人材が枯渇してる。「老害」と共に「老兵」も来なくなるから当たり前だが。 例えば、806のスライド、作ったのは東大の学生のようだが、中身を見る限り、こいつは、 共有メモリを使ったことがないし、それが何なのかも理解してない。 というより多分Goのチャネルしか使ったことがない。 その程度の奴をカンファレンスに呼ばないといけないほど人材がいない。 そしてここで「Goのスケジューラが読むに値するコードだ」と吠えている馬鹿もそう。 その程度のコードをありがたがらないといけないほど全体のレベルが低い。 「空いてりゃ取ってくる」程度のスケジューラなんてすぐ書けるし、 むしろそれすら書けない馬鹿は死ね、なのがC/C++/Rustの世界だと思うが、Goはそうじゃない。 だからこの意味ではGoUserは「イキっている」のを自覚出来てない。
ただこれはGoの仕様だ。 実際いちいちグダグダ言われてもモチベーション下がるし、やりたいようにやらせろ、ってのはある。 そこで若者が天才的なコードを連発出来れば素晴らしい楽園が出来上がるわけだが、 実際はプログラミング自体、才能だけで突破出来るものではなく、地道な修練が必要なものだから、 そうは行かなかった、というだけ。(若いだけでは何ともならない) 結果的に「若者の楽園」=レベルの低い「馬鹿者の楽園」になってる。ただまあ、それもありだと思うけど。 ただそれによって本来はGo界にも存在したはずの「凄いコード」に触れられる機会を逸していることは認識した方がいいとは思うが。 だから「若者」に受けているだけだとは思うが、実際それも分かる。 今のC++の仕様なんて色々複雑になりすぎてるし、あれ見たら引くだろ。使いもしない細かい仕様が多すぎる。 Javaは無駄に清書させられる、C++は意味不明、Rustはコンパイルが通らん、CはGUIには不向き、ならGoになる。 他のスクリプト言語よりは速いし。 伝わるかな?言い方を変えればユース、サッカーのU21みたいなのをプログラミング言語界に意図的に作ってる。 そこでは若者が馬鹿やってる、勿論レベルは低いがフルレギュで戦ってる大人がそれを揶揄するのは野暮ってもの、みたいな。 実際「共有RAM知りません」「空なら取ってくるだけのスケジューラは凄いです」 (この後投稿するが)「なんとNodeはシングルスレッドでした!」とか、グーで殴るぞ、のレベルだろ。 ただそれでもそういう環境の方が合う奴もいるだろうから、本人が選べばいい。
インメモリなキャッシュと分散データベースでメモリ管理コストが影響する幅は変わるに決まってるし、そうでなくとも実測で改善してるならそれが全てでしょ ここで比較するならC/C++/Rustみたいな言語で書き切るコストやそれを行える人材を確保するコストに対して、Goのまま書き換えなり他の手段で対処するコストがどうなのかという話だと思うよ JavaのGCだって今や複数のリリース元から日夜改善されてってる訳で Go自体は良さがあると思ってるけど他を眉唾だなどと語り貶めす形で話をするのはいい気持ちしないなぁ
あと話を聞いてる限り、新規の若者は「全部の文法」を抑えてから次に行こうとする。 本来はこれが一番効率がいいから当たり前なのだが、 C/C++はその点、古い文法=今では使うべきではない、というのがそのまま残っていて、 何も知らない若者がそれを活用しようとしてるのが散見される。 んで、「そんなん使うなボケ」と言ったら逆ギレされることが多々ある。 ただこれらも新規参入者にとっては落とし穴でしかないから、ウザイのは事実だよ。無いに越したことはない。 これらが存在する理由はレガシー=互換性だから、新しい言語なら比較的少ないのも事実。勿論Goも。 だからC/C++なんて最速枠でなければとっくに死んでるよ。C/C++は新規を獲得する努力をしてない。
>それをgoroutineなんて言葉を使うから、thread/lightWeightProcess/co-routine/greenthread等を知っている奴等は余計に混乱する。 名前だけ見てコルーチンみたいなものだろうなんて思い込むうのはおっちょこちょいだろうが 使ってみりゃすぐわかるだろう、普通。
つーか Go の発案者て老人ばっかりじゃなかったっけ? なんか皆 C++ 嫌い(それもいかにもロートルにありそうな理由)で それであえてC++的な要素(ジェネリック、継承によるオブジェクトの多態モデル try..catchスタイルの例外等々)は全部入れないようにしたって話だが つまり若者向けではなく、モダンなプログラムをやりたいがCではきついので ちょっとだけモダンになったCっぽいシンプルな言語、みたいなイメージだと思ってた
>>869 多分それで合ってるぞ。 それに若者が食いついただけ。 既にC++使えてる奴は全く食いつかないし、食いつく必然性もない。 >>870 たくさん書き込んでるけどもう良いだろ、Rubyスレに帰ろうな >>856 Nodeがシングルスレッドなのは基本中の基本で、そんなのでこんな記事書いてること自体がびっくりだよ。 お前はそれすら知らずにNode使ってたのかよ!(Go界は人材不足だからこんなもんかもしれんが) そこら辺がWeb系が馬鹿ばかり、と言われる点だと思うよ。これで仕事してることになっちゃってるし。 ただこいつのイベントループの部分の理解も間違ってると思うけど。 イベントループを抜ければスタックは空になる。スタックフレームガーなんて事にはならない。 そして「燃え上がるグラフ」になってるのはお前がそう組んだからで、完全に組み方が悪い。 (燃え上がってるのは「負荷」ではなくて自分が呼んだ「関数ネスト」だから) ただまあ、組み方が悪かろうが何しようが、動くってのは重要なんだが。 だからこのケース(=同じ奴=同じ技術レベルの奴)が組んで動くようになったんだから、Goの方が向いているのは事実だ。 状況からすると、timeoutした場合はおそらく優先処理しないといけなくて、 それを放置して次のリクエストを積んだら余計な手間が発生するのだろう。 そうじゃないと「燃え上がるグラフ」にはならないから。 この点、NodeというかJSのイベントループには優先順位がないから、筆者の言うように「最後まで待たされる」事になる。 だから優先順位を付ける必要がある場合は自前でsetTimeoutをラップしてやる必要があるけど、逆に言えばそれだけだね。 それすら思いつかない人でもGoなら上手く行く、というのもまた重要な点ではあるけど、 781のブログと同様に噛みつかれ、「お前のコードが糞なだけ」と言われた場合、それは事実だと思うよ。 (なおこのケースはI/Oのようなので優先順位付加ではなく自前キューの方がいいが) ただこれは「後付」であって、ここまで解明していればNodeでも対策は簡単に出来るわけだが、 実際はここまで解明するまでに時間がかかる。 AmazonS3がそういった類の、 つまり「timeoutのエラー処理を優先的に処理しないとその後の処理も遅れます?」みたいな特性を持っているとすると、 スペック上からは見えない落とし穴であり、Nodeなら嵌るがGoなら(知らなくても)嵌らない、というのはあり得る。 それはやっぱりNodeのシングルスレッドアーキテクチャの方が世間(他言語)からは特殊で、 Nodeだけ嵌り得る落とし穴も世の中には存在するということ。 こういうのに遭遇したくない場合、Goの方が安牌、というのはその通り。この点はNodeだけが特殊だから。 勿論この人が最初からGo使ってたら一番幸せだったろう、というのもその通り。
ただgoroutineって優先順位付けられたっけ? 何かこの人たまたま直ってるだけで、さらに負荷かけたらやっぱだめでした、になるだけの気がするが。 「燃え上がるグラフ」になってるのは「処理が遅い」のではなく「処理時のネストが深い」だからね。 AmazonS3のせいでもなくて、 いわゆる「コールバック地獄」的な組み方=コールバックを深くネストして『最初の段階』で全部積み上げてしまうから、 後で止まれなくて実はtimeoutしてた時に余計な処理が多々発生してネストが深くなっているだけの気はする。 ただこの手の「不味い組み方」な奴はJSには多いのも事実。もっとフラットに組めよ、と言っても通じないし。 多分彼等にとってはJSの非同期ってのが至極相性が悪くて、 彼等的に非同期を解消する方法がコールバックネストしかないのだと思う。 その点、Goだと最初から同期で書けるので、そういった「糞コード」には(初心者でも)ならない。 この辺はC/C++/Rustだと「お前が糞なだけ」で片づけられるだろうけど、 俺自身は「初心者でも糞コードになりにくい」のは大変良い特性だとは思う。(というよりこの点はJSが糞なだけだが) というわけで俺のその記事に対する感想は、 goroutineが優先順位付けられた場合:Nodeだけ嵌る落とし穴に命中してご愁傷様でした goroutineが優先順位付けられなかった場合:初心者JS使いだけが何故か嵌る糞コードになっててご愁傷様でした だな。多分後者で、初心者でも糞コードになりにくいGoだから救われた、だけの気がする。 (Goが良いというよりはJSの非同期ってのが糞コードの産地になってて、筆者もそうだっただけだが)
>>866 ついでだから本家の方読んできた。 まずそもそもReadStatesをそんなにバカスカ更新するようなアーキが必要なのか?という疑問はあるが、 それはさておき。 これは、多数のオブジェクトを「生存したまま」でメモリを埋める、 つまりオンメモリDBのような使い方をするアプリとGCが絶望的に相性が悪くて、それに該当した、ということなのだろう。 これはGoがショボイというよりはGCの限界で、C++/Rustしかねえわな、ということだと思うよ。 JavaでもC#でも同じ結果になる気はする。 だからそういうアプリでGC言語使っちゃ駄目、というのが教訓だと思うよ。 Ruby のコンパイルに、1CPU なら、20分掛かるけど、 4CPUなら、5分で済む CPUセントリックな処理では、CPU並列処理は意味がある
>>862 cspは概念・モデリングっつう理解でだいたいいいと思うよ。 昔から並行処理システム関わった奴ならたいていは似たようなモデルは考えてる。 cspはそれを厳密に数学的に記述するって感じ。 極端なこと言えばメッセージでやり取りしましょう、だ。 っで、goはプログラミング言語としてgoroutineとchannelがあるから他の言語より並行処理向き。 go以外なら古くはadaやなんかもそう。タスクにランデブポートっつうのがある。 erlangも似たようなメッセージ機構はあるんじゃなかろうか。 本質的に並行処理ってのは非同期的な処理システムなわけだけど、 非同期ioとコールバック(やシンタックスシュガー)でやるより、独自に動く実行体が複数あってそれらがメッセージ通して協調動作するってシステムの方が好きだ。 >>876 まぁーやっぱ、gcってよくねーわ。 捨てる前提のプロトタイプにはgcあり言語もよいと思う、ほんで大部分の案件はそれで十分ってのもあっる。 げももっと性能を、、、てやると今なら c/c++/rust の3つしかナイショ。 >>880 それアクターモデルだろよ、と思ってwiki確認したら、CSPがモロに書いてあったわ。 ただ、アクターは浮かんでは消え、という印象があるが。 smalltalk信者等、通信したい奴は確かにいるようだが、それがイマイチ何になるのか明確でない。 あと、コード上で通信したいのならGoだが、アクターモデル自体は普通にオブジェクト指向で組めるし、 C++なら(あまりよろしくはないが) >> と << をオーバーロードしてそれっぽく見せることは可能だ。 実際その方がgoroutineより何倍も速く動く。 Erlangは俺も以下を半分くらい読んだ程度しか知らないが、 https://www.ymotongpoo.com/works/lyse-ja/index.html あれは実用本位で、理論側から出てきたものでは全然無い。 電話交換機筐体を複数並べてスケールアウトした時にも性能が低下しないように作られてる。 だから最初から共有RAMなんて禁止されてる。そして当然メッセージ交換だが、 最初から上記のような疎結合でのメッセージ交換を想定されてるから、 Goみたいな密結合を想定されているものとはちょっと違うが。 >>881 ちなみに本家の方はコメントも付いてて、GoUserが吠えてる(事になってる。 ただあの程度で噛みつきと捕らえられるのも厳しい気はするが) Rust試す前にGoのバージョン上げろよ、というのもそうだが、 キャッシュサーバー使えよ、というのは確かにな、とは思った。 言葉の端々に今どきの若者は〜みたいなのを感じる 周りから相当クソ扱いされて5chで鬱憤晴らしてるんだろうな
>>881 実際問題、ここ数年のGC言語で足を引っ張られた事はあんまりないけど。 そういう意味では参照カウンタ方式のPythonなんかは割と効率良いんじゃない?それこそスクリプト言語だけど。 言語としてのスループットを上げたければ、allocはまとめて、freeはもっともっとまとめてやって、必要そうだったらメモリのcompactionかけるほうがスループット上がると思うが。 >>882 Goのどこが密結合? チャンネルは? >>886 参照カウンタのGCとマーク&スイープのGCは意味合いが全然違う。 それを一緒くたにしてるようでは駄目だよ。 そこら辺がGoスゲーって言ってる奴のレベルが低いところだよ。 それ以外も君は間違いすぎていちいち指摘するのは諦めたけど、 多分もうちょっと勉強した方がいい。 Goは酷い言語でもないけど、凄い言語でもない。 860の本家にRustと冷静に比較しているコメントがあるから読んでくるといい。 >>882 c++はc++11以降ほんとよくなった。 でももう新規案件ならrustに譲ってもいいかなと思う。 >>887 広義では参照カウンタもgcじゃん。 gcも色々改良されてるし未だに古典的なマークスイープgcのみってのはあまり無いんじゃろか。 だから案件の多いweb系とかアプリとかの上のレイヤーでgcが問題になるケースはあまり無い。 gcはそれより下のエンジンとかのシステムレイヤーで問題視されることが多い。 で、一応goはc/c++/rust同様のシステム言語のくくりで語られることもあるからその辺から叩かれたりするけど、そうじゃなくて上のレイヤーの言語として使えばいい感じの言語だと思う。 >>887 参照カウントに対して、俺がどういう意図で話してるかわかってる? 一緒くたにしてるわけではなくて、参照カウントのメリットってのもきちんとあるんだよ。 勘違いが多すぎるのはお前の方だと思うよ。 グリーンスレッド知らなかったんだっけ? グリーンスレッドの切り替えにはコストがかかるんだっけ? 全部スレッドの話だよな。 いちいち都合の悪いところをネグってレスつけるのやめろよ。 Go vs Rust、じゃなくてむしろこの2つ以外が要らんのだけど 取り敢えずGoが分からないグリーンスレッド君がRustを理解出来るとは思えない(笑)
参照カウント方式には結構なメリットがある。 別スレッドも必要ないし、速度も出る。ストップザ・ワールドも必要ない。 オブジェクトの開放が「かならず」「一定の場所」で行われてデストラクタの動作タイミングを保証できる。 弱参照がきっちりしてればそれこそ循環参照もそれほど恐れることはない。 組み合わせて使うのが良いと思うよ。俺的には。 だからこそ引き合いに出したんだが。 C++好きならshared_ptrあたりから理解が及びそうなもんなんだが。
>>887 で、指摘してみろよ。 お前が間違ってることは懇切丁寧に指摘してるんだから。 >>896 自動的にメモリを開放してくれて、フラグメントを解消してくれる仕組みは、大雑把に言ってガベージコレクションの仲間に入れるもんじゃない? とりあえずGoのリリースノートを全部読んでから話してほしいな。彼には。 1.14あたりでgoroutineのスケジューラちょっと変わってるし。
>>889 > 広義では参照カウンタもgcじゃん。 そう。俺も「参照カウンタのGC」とも言っている。 馬鹿は放置として、君も疑問のようだから回答しておくと、 参照カウンタ方式は「ユーザーが間違ってない」前提が必要で、「ユーザー補助」でしかない。 対してマーク&スイープは「ユーザーが間違ってても」GCが為されるから、「システム保護」なんだよ。 だから役割が全然違う。少なくとも真面目に24時間365日動作させるつもりなら、単純に交換は出来ない。 これが結局何だかんだでマーク&スイープから離れられない理由で、 JavaもC#もJSも、勿論Goもマーク&スイープしてる。 勿論それが重いのはみんな分かってるから、色々工夫してるけど、最終的にはやるしかないから。 だから参照カウンタ方式のGCでマーク&スイープと同様に「システム保護」を得る為には、 「ユーザーがどんな書き方をしても」解放されることが必要で、 例えば>>896 のようなのが有ればいいけど、これで実装してる例ってあったっけ? (なお循環参照の検出自体は簡単だが、適切に起動する為のイベントがないから、実装時に困るのはそこだと思うが) > そうじゃなくて上のレイヤーの言語として使えばいい感じの言語だと思う。 そこは今どっかりとC#が根を下ろそうとしている。 C#は俺は良い言語だと思うけど、Javaに食われて死にそうなのがなあ、という見方だったが、 少なくとも俺の予想以上には大健闘していて、生き残るかもしれないなあ、とは思いつつある。 これまではC#もC++もWeb系が手薄だったけど、どっちもガチで整備し始めてるから、それが完了した時にどうなるかだね。 そしたら本当にGoを使う意味が全くなくなる。 逆にRustはCPU負荷無しで「システム保護」出来るわけだから、GC言語を皆殺しにかかってる。 そしてC並に速いのだから、確かに最終兵器ではあるんだよ。盛り上がる理由はそれ。 >>900 ユーザーが参照カウントを上げ下げすることなんてほぼないぞ 言語内の仕組みなんだから C拡張とか書く場合もたいていスコープ抜けたら それまでの一時変数は全解放するって書き方があるし 他のGCでもそれは同じ だからほとんど中身の仕組みを意識しなくても良い むしろそれができないなら実装がしょぼい Goが人気出た大きな理由の一つは、過不足がなく比較的高品質な標準ライブラリ その点でいえばNodeも同じだが、Nodeと違って変なのを噛まさず標準ライブラリを素のまま普通に使うことを美徳とする文化があるのも効いてる くだらない流行り廃りに惑わされずに決まったものをただ普通に使えばよいというのが近年の複雑化しすぎたWeb界には受けた Rustはそのへんは全然ダメだね
またそんな煽りを… まったくオマイラときたら変な輩を呼び寄せる呪文を唱える 才能に関しては天才的だな
RustはRustでC++の標準ライブラリがゴテゴテと九龍城が如く聳え立ってきた反動でもあるので許してやれという気持ちがある それにしたって初期の標準が貧弱で標準に取り込むまでの右往左往が長すぎるというのも分かるが
>>906 Rustは去年ようやく並列処理APIが固まったレベルだから、将来性はともかく現時点ではまだヨチヨチ歩きな幼児と見てる 十年後に期待 Rustは今でも面白いよ。標準ライブラリが貧弱でも大して困らんけ、並列ランタイムだけは標準に入れて欲しかった。 メジャーなtokioとasync-stdの両対応してる場合も有るけど、大抵枝分かれしてて共存も出来ないから無駄なんだよな。
>>908 Javaで言えば1.0レベルだろ 当時から面白かったんで使ってたけど、実用性は微妙だった。特にファイルIOとコレクション C#が充実したらGoが要らなくなる論は全然わからんな。 一体どういう理屈なんだろうか。 同じサーバサイドでもお互いに分担するエリア全然違うくないか? というか、全然手薄でもなかったし。C#。
ファットなランタイムに依存しながらも比較的デプロイ時の取り回しが良い わりと固定されたツールセットで無難に迷わずに使える まあ近いと言えば近いんじゃないかな C#をバリバリ使ってるとこだとGoの出番はないだろうし
C#ならGUIもサービスも書けるし遅くもないから、Windowsアプリを書くなら鉄板の選択肢だよな どうしても高速化したいとか解析されたくない時だけC++ ただ事前にランタイムのインストールが必要なんで、Linuxとかマルチプラットフォーム展開の敷居がちょっとあるんで、CLIツールとか書いてもGoに比べてデプロイが不便 充分に住み分けされてるからどっちを使う論争は不毛
Windowsアプリを作るときの鉄板に関しては異論はないが、C#のデプロイはガッカリ仕様だぞ。 .Net 5でも。
>>916 SCDでデプロイしたことあるか? むちゃくちゃファイル数多いぞ。 SingleBinaryが自己展開ではなく直接アセンブリをロードする形にやっと.Net5でなったけど、そのままだとSingleBinaryと言ってるくせに数ファイル漏れるので、 それも完全にSingleBinaryにするには結局自己展開ファイルにせざるを得ない。 ファイルサイズも結構でかくて、最近は使ってるメソッドのみと言う形でTrimできるようになったけど、誤爆もまだまだあって実用とは言えんし。 ホントにやってみ。期待してただけにすごくガッカリしたから。 >>918 まあ、不安ったって迷走してる程度で、根本的にはCの代替として落ち着いていくでしょ 確かどっか大手がコンテナの記述用途でテコ入れするとか 対立煽りしたいらしい奴は、方向性がまるで違うんだからC++のスレにでも行けって感じ >>921 ならわかるだろ。 あれがガッカリ仕様でなければ何なんだ。 >>901 >>905 俺が無知なのはさておき、GCを実装してる連中はそこら辺まで調査して選択してる。 Go含めて重鎮が地味にマーク&スイープを選択するのは、それなりに理由がある。 ただし、マーク&スイープは、「大量の生存オブジェクト」には不向きで、Discordの件はそれに該当する。 逆に言えばそれが不向きなだけで、「最小限の生存オブジェクトと大量のゴミ」という、 普通の使い方の場合には、マーク&スイープの方がいいと判断したからそっちを選択してるわけだ。 kotolin-nativeは多分新しいことを試してみたかったんだろうと思うが、 Pythonはおそらく判断をミスっていて、通常向けに最適化するべきだと思う。 (これがPythonが無駄に遅い理由の一つになっているかも) ただしGC機構についてだけ言えば、Python型なら今回のDiscordみたいなことにはならなかったはずだ。 だからあれはより正確に言えば「『マーク&スイープ方式の』GCの限界」だな。 >>903 最後の部分 > 近年の複雑化しすぎたWeb界には受けた 以外には同意だ。 俺は「Web系は複雑化しないところがいい」と見ている。 Web系は馬鹿ばかり、と揶揄されつつも、それでもWebが回ってるのは馬鹿でも回せる構造になってるからだ。 それは水平分業がしっかりしていて、しかもそれを普通に選択する文化だと思う。 例えばPHP、3層構造にするのについて誰も文句言わないだろ。 対して今回のDiscord、あれは指摘されてるとおり、キャッシュサーバーを使っていれば発生しなかった問題だと思う。 そこをなまじ実装力があって自前で実装してしまうからこそ命中する。 実際キャッシュなんて100行程度で書けるから、 不必要な機能も付いてて遅く、さらにブラックボックス的な他ライブラリ等に頼るよりは、 自前で実装する方が気分が楽なんだよ。 (ソースが読めるとしても100行程度で書けるのだから書いた方がまし、という選択になる) その辺Web系は実装力もないからさっさと外部ライブラリ/フレームワークに頼るのだけど、 結果的にはそれの方が正しいように俺には見えてる。 この文化だと「○○が欲しい」というリクエストも感謝も明確に出てくるのでライブラリも揃う。 C++だと「そんなゴミ要らん自分で書いた方がましじゃボケ」になるからね。 だから遅々として整備は進まないが、それでも徐々には進むから、最終的にはどうなるかだけどね。 Web系が複雑化しているように見えるのは、やたらフレームワーク/ライブラリが乱立するからだと思うが、 それは外部的に見えるから複雑化しているように感じるだけ。 C++等だと内部的にみんなやってるのが出てきてないだけで、確実に重複しまくってて再開発しまくってる。 だから乱立に見えるけども一応外部に出てきて重複開発しないWeb系の方がエコシステムとしては効率がいいと思うよ。 ちなみにデプロイって何の話してるんだ? サーバーサイドなら最低限ビルド出来る奴がセットアップするんだから問題なし。 WindowsへのC#のデプロイは何ら問題ない。 Linuxなんてど素人は使ってない。 残るはMacだけど、お前らMac向けにGoでツールとか書いてるの? ちなみに俺が言ったのは、「楽に書けて、サクッと動いて、そこそこの性能」という事だよ。 君らの分析の方が技術的に真面目で、さらに当たってるからそれで問題はないけど、要は、 PHPだと超超超楽勝だがポンコツ、 (Pythonだと超楽勝だがPHPと同程度の速度しか出ないポンコツ、ただしPHPからは逃れられる)、 Nodeだと楽勝でそこそこ速い、 Go/C#だと楽勝でもないがまあ普通に速い、 それより速いのはC++/Rustだけどこいつらは非現実的、 と今は並ぶでしょ。速度/容易さで並ぶのはC#。 C#の方が断然巨人だから、色々環境は整ってる。 ただしWebではなくWindowsアプリを主眼にしていたから、Web周りは若干周回遅れになってる。 勿論ASP.NETは昔からあったけどね。 サーバサイドでなくとも、要は「中庸」のプログラミング言語が欲しい場合に何が来るかということ。 一応C#は過度に難しくならないように努力してるから、巨大化している割には肥大化してない。 その辺C++とかかなり最悪だし。 ただしそれは「最速」言語の宿命で、 こちらの方が少しでも速いケースがある、という場合にユーザーが最速記述出来ないのは問題だから、 どうしても仕様が肥大化してしまう。速度面で仕様に妥協が出来ないんだ。 だからほぼ確実にRustもこれから肥大化する。 ただGoではC#を馬鹿にするなんて出来ないよ。 お前らの眼中にないASP.NETの方がGoサーバーよりも100倍シェアがある。 https://w3techs.com/technologies/overview/programming_language すまん100倍では済まずに 31,666倍(=9.5/0.0003)だった。 言語名を押せば各詳細が出る。 その他の面もC#は既に巨人だからC#からみればGoなんてゴミ同然で、相手されてないよ。
>>923 楽かぁ。 Goのシングルバイナリに慣れてると、結構なガッカリ感だったが、主観的な物言いしてはいかんのかもしれんな、すまん。 >>924 さておくなよ。 どう判断をミスってんの?言語設計の問題でしょ。 Swiftは? >>926 「サーバサイドはできる奴がセットアップするから問題なし、PHPのデプロイが簡単」とか言ってる時点で話についてこれてないから、ちょっと調べてからしっかり喋ってくれ。 少なくともPHPファイルをポン置きするような事は「デプロイ」とすら呼ばん。 C#が眼中に無いのではなくて、ここはGoのスレ。 >>919 F#いいよな。 でも ocaml も流行ってないしなぁ。 ocaml は歴史もあるし金融系で使われてたり実績も十分そうなんだけど。 COBOLは歴史もあるし金融系で使われてたり実績も十分。
C#はビルド速度とNuGetが地味につらい Goのビルド速度、シンプルな純正テスト環境は大きな利点に思う。小規模開発時には特に。
YouTube で有名な雑食系エンジニア・KENTA は、 初心者が進む道を、サーバー側言語のRuby → Go を王道としてる この2つ以外は、出てこない GUI 系は、画面の手直しなどで、工数がかさむ。 C#, dot.net などのWindows 系は、いらない。 Java などの土方系も、いらない。 C/C++ などのポインタ系や、ハードウェアの仕組みなども、いらない。 Elixir, Rust は、普及へのchasm・溝を超えられなかった
「俺の考えた最強の型システム」合戦になって収集つかなくなって導入しないことが決定した
sort書くときはジェネリクスと型推論効かせて簡潔に書きたくなる
なにかというと interface{} が現れる今の状況をなんとかしてほしい。
どこかのブログで「Goはイテレータを書くのに4つの全く異なる方法がある」って書いてあったけど、これマジ?
>>943 イテレータを書く と言ってる意味がよく分からない イテレーションはrange句を書くときだけを意味するが、配列もしくはスライス、文字列、マップ、チャネルでそれぞれ受けとるイテレーション変数に違いがあるんで、それで4種と言ってる? >>946 チャネルにキャパシティ設定してないとか goの諸々が分かってる?という記事だと思う >>948 1.無名関数をループする関数 2.Nextとかのインターフェースを持ったオブジェクト 3.並列処理でループさせて通信で受ける これをイテレータねえ? >>948 for文だけでカプセル化できてるように思うけど for i := 0; i < 11; i += 2 { println(i) } println(i) // undefined: i いや、Goに関わらずAPIの設計としては常識に近いよ Iteratorデザインパターン
Goではfor文がイテレータ 自分でイテレータみたいなものを実装する必要はない
>>955 じゃあイテレータの定義説明して、どうぞ イテレータは、既定の順序に従って移動できることと、値を逆参照できることが要件になるだろうな。
連続した要素を一個ずつ舐めて処理することだよね?(´・ω・`)
それはただの繰り返し、 for文の説明にしかなってない。 もう一段の抽象思考が必要。
>>960 wikipediaの解説くらい読めよ…… イテレータ(英語: iterator)とは、プログラミング言語において配列やそれに類似する集合的データ構造(コレクションあるいはコンテナ)の各要素に対する繰り返し処理の抽象化である。 「連続した要素」である必要は無いし、「一個ずつ舐め」る必要も「処理する」必要も無いぞ。 >>963 えっ、繰り返し処理って一個ずつ舐める以外の手法ある? 実際なにかするかは別として、絶対舐めるよね? 一人が同時に何本の竿を処理できるのか その答えを俺は知ってる
GoFのを定義とするならhasNextとnextでラップして要素持ってるだけなんだよな 流石に古いだけあって些か貧弱
イテレータにそれ以上の機能は何も無いだろ。 それ以上を求めると、ジェネレータとの釣り合いが取れなくなるんじゃないか? 連続したもなにもなく「次」の値を取り出していくものでしかない気がするが。
デザイン「パターン」だぞ それが理解できないならシステムエンジニア向いてないよ
>>964 気に入ったのがあったら舐めるの止めてもいいし、最初の一個だけひたすら舐めてもいい(外部イテレーター限定)。 2バイト文字列とかなら1個飛ばしで舐めるのも普通。 >>973 舐める舐めるって気持ち悪いな まずお前の言う「舐める」というのを具体的にどういうことなのか説明しろよ >>973 飛ばした1個もちょい舐めしてる それがイテレータ嬢 >>942 ほんまこれ Go の何が駄目といって「われらがGoはXXは無くしてシンプルに美しい」 とかなんとか自画自賛してるが、実際はむりくりそのクソみたいな 単純機能を組みあわせてクソ面倒な色々なやりくりしないといけないという まるで前世紀の遺物みたいなシロモノ あと Go は名前がクソ うーん、全世紀の遺物から、複数の戻り値とか、deferとかみたいなので別方向に進化したものだと思うけどな。 面倒くさいなって思う事もそんなに無くなったが。 後出しジャンケンみたいなインターフェイスはなかなか便利だし他の言語には無いと思うぞ。 まあ名前はひどい。
インターフェース自体はいいんだよ。 問題は void* のような型消去した interface{} を多用しないとならないところ。
/\___/\ / / ヽ ::: \ | (●), 、(●)、 | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ,,ノ(、_, )ヽ、,, | < まーたはじまった | ,;‐=‐ヽ .:::::| \_______ \ `ニニ´ .:::/ /`ー‐--‐‐—´´\
思い付きのまま検討とかしないで言うんだけど interface{} と書くところで {} とできたらどうだろう
>>980 池沼用言語なのでお察し ただし、昨今の高機能化(といいつつ実際には複雑化)した他言語へのアンチテーゼではある ハァ…ハァ… 池沼用言語……? 取り消せよ……!!! ハァ… 今の言葉……!!!
(´・ω・`) ふむふむ・・・なるほどなるほど・・・ / `ヽ. お薬増やしておきますね __/ ┃)) __i | / ヽ,,⌒)___(,,ノ\ -----
モダンな言語使ってる所だと単価云々より労働環境のメリットの方がデカい エンジニアファーストだしフルリモート出来るし 単価高くても出社必須・クソスペPC・下請けみたいな所は論外
>>990 俺はJSを気に入ったから転職しようかとも思ったが、 求人見てデザイナの下請けばっかりだから止めた。(少なくともJSは、でも多分PHPも) もしGoだとプログラマ主導が多数派なのなら、それはわざわざGoを選ぶ意味にもなり得る。 Goは何故か食わず嫌いが多すぎて人員が集まらないから、余程の高性能案件でないと
Go案件はメルカリ一派しかまともにやってないから その周辺の会社に行け 給料もクソ高い
メルカリって大して儲かってないのに、株価を吊り上げてボロ儲けしてる企業だろ 株主が買った株は役員や社員のステーキ代になることも知らずによく買うよな ほとんど宗教だな
>>992 > 何故か どう考えても妥当。 言語としては劣化版C++でしかないから、C++を既に使える奴が使う意味がなく、C++erからは最初から無視されてる。 これはC#やJavaを既に使える連中もそう。 要は既存言語で満足してる奴が「機能劣化版」でしかないGoを使う意味がない。 逆にC++が嫌いで嫌いで仕方ないが、それでも仕方なくC++使ってた連中が当初飛びついたが、 こいつらは最近はみんなRust行ってるはず。 結果、他言語を知らない、プログラミング初心者しか残ってないでしょ、このスレ見ても。 (ただこれが悪いことだとは言わないが。俺はそういう実験をする言語があってもいいとは思う) >>994 上場ゴール目的だったと思うしそれでよかったんじゃね? そのおかげでエンジニアは金もらえるからありがたい エンジニアは経験や実績で1000万くらいもらえる >>998 だったらGAFA並みに成果を出してくれればいいけど、そうでもないからな 使えない奴に金を出してなけりゃいいけどね >>999 使えるやつが多いけど 所詮フリマアプリだからな それにそんなリソース費やすもんか?とは思う クックパッドと同じ謎さ加減を感じる lud20230116210606ca
このスレへの固定リンク: http://5chb.net/r/tech/1571315884/ ヒント: 5chスレのurlに
http ://xxxx.5ch
b .net/xxxx のように
b を入れるだけでここでスレ保存、閲覧できます。
TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Go language part 3 YouTube動画>2本 ->画像>2枚 」 を見た人も見ています:・Go language part 1 ・【LAA】Los Angeles Angels part46 【ワッチョイ有】 ・グリムガーディアンズ / Grim Guardians: Demon Purge Part1 ・Vue vs React vs Angular Part.4 ・Vue vs React vs Angular Part.5 ・Vue vs React vs Angular Part.3 ・Vue vs React vs Angular Part.2 ・Vue vs React vs Angular vs Svelte Part.9 ・【ワッチョイ有】Vue vs React vs Angular Part.5.5 ・Strange Brigade Part 1 ・【祭り】BSR coinexchange part13 ・ArcheAge 6鯖Tahyang 晒しスレ Part1 ・Intel Management Engineの脆弱性 Part.2 ・【 bitcoin 取引所 】QUOINEXCHANGE Part.3 ・League of AngelsU(リーグオブエンジェルズ2) Part6 ・League of AngelsU(リーグオブエンジェルズ2) Part2 ・【MGO3】METAL GEAR ONLINE 3 Part 926 ・Visual Studio 2019 Part7 ・Visual Studio 2022 Part2 ・Visual Studio 2022 Part1 ・Visual Studio 2010 Part21 ・Visual Studio 2019 Part6 ・Visual Studio 2017 Part4 ・Visual Studio 2019 Part2 ・Jacksonville Jaguars Part2 ・Visual Studio Code / VSCode Part9 ・Visual Studio Code / VSCode Part8 ・Visual Studio Code / VSCode Part12 ・Visual Studio Code / VSCode Part5 ・MacでもLinuxでも使えるVisual Studio Code Part2 ・【XboxOne】 Halo 5: Guardians Part69【FPS】 ・Phalanger 〜まさかのPHP派生言語〜 ・Cygwin + MinGW + GCC 相談室 Part 8 ・Regular Expression(正規表現) Part15 ・【xflag】ファイトリーグ-Fight League Part.24 ・【xflag】ファイトリーグ-Fight League Part.16 ・【PHP】Laravel【フレームワーク】 Part.5 ・【LoL】League of Legends 質問スレ Part67 ・【LoL】League of Legends ARAMスレ Part74 ・【LoL】League of Legends 初心者スレ Part345 ・【LoL】League of Legends 初心者スレ Part244 ・【LoL】League of Legends 初心者スレ Part324 ・【LoL】League of Legends 初心者スレ Part250 ・【LoL】League of Legends 初心者スレ Part282 ・【LoL】League of Legends 初心者スレ Part297 ・【LoL】League of Legends 初心者スレ Part261 ・【LoL】League of Legends 初心者スレ Part276 ・【LoL】League of Legends 真の初心者スレ Part1 ・beatmaniaIIDX 26 Rootage 情報スレ Part23 ・beatmaniaIIDX 26 Rootage 情報スレ Part13 ・【LoL】League of Legends 質問スレ Part64 ・【LoL】League of Legends ARAMスレ Part96 ・【LoL】League of Legends ARAMスレ Part99 ・【LoL】League of Legends ARAMスレ Part79 ・【LoL】League of Legends ARAMスレ Part76 ・【LoL】League of Legends 初心者スレ Part380 ・【LoL】League of Legends 初心者スレ Part286 ・【LoL】League of Legends 初心者スレ Part300 ・【LoL】League of Legends 初心者スレ Part259 ・【LoL】League of Legends 初心者スレ Part323 ・【LoL】League of Legends 初心者スレ Part315 ・【LoL】League of Legends 初心者スレ Part342 ・【LoL】League of Legends 初心者スレ Part281 ・【LoL】League of Legends 初心者スレ Part272 ・【LoL】League of Legends : Wild Rift Part48【ワイルドリフト】
13:54:55 up 4 days, 14:58, 2 users, load average: 77.05, 61.70, 55.68
in 0.054808855056763 sec
@0.054808855056763@0b7 on 011803