Go language part 3
■ このスレッドは過去ログ倉庫に格納されています
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{} どうぞ ttps://play.golang.org/p/JD9lfvYmddM 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 https://www.youtube.com/watch?v=Og847HVwRSI >>67 狙ったgoroutineにってのが推奨されてるかはわからんけど、レシーバなり関数のパラメータなりにid持たせて、終了通知channelにそのidを送って受け取った側で処理する、とか 継承、関数オーバーライド、多態性を実装したサンプルをまとめてみた https://play.golang.org/p/4_p8gXLRJ1j 今後のバージョンアップで機能しなくなったりとか、現状でもマズイ部分って、どれくらいだろうか? オーバーライドしたスーパークラスのメソッドを呼び出す例が無かったんでちょっと変更 https://play.golang.org/p/XUfFldlrkqT >>73 それは多態になってない 呼出元が直接Sub.Msgを呼んでるだろ >>76 Inheritance.Msg()じゃないの? >>76 うん、BaseもSubも同じインターフェースに代入してメソッド呼んでるから、ちゃんと多態になってると思う それとも俺とかレス主が多態性を勘違いしてる? 新しいサイトのurlゴーデブとか俺をバカにしてんのか? 新しいサイト? 言語仕様ドキュメントが見つからないから、移行ではないよな? 何のためのサイト何だろうコレ > https://blog.golang.org/go.dev > Today we are launching go.dev, a new hub for Go developers, to help answer those questions. 開発者向けのハブサイトだと >>48 Go言語を採用して開発をしている会社一覧 https://web.archive.org/web/20191120013540/https ://qiita.com/muchi/items/018c81c27f637797fcf3 なぜか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?空指定とは違う挙動になるのかな? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる