Go language part 4

■ このスレッドは過去ログ倉庫に格納されています
2020/11/16(月) 04:14:40.64ID:fB5+0hxC
Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。

公式
https://golang.org

公式ドキュメント
https://golang.org/doc/

公式外パッケージドキュメント
https://godoc.org

ブラウザ上で試し書き
https://play.golang.org


※前スレ
Go language part 3
https://mevius.5ch.net/test/read.cgi/tech/1571315884/
2021/02/13(土) 13:27:48.18ID:0tM9M8c+
>>396
そもそも何で型チェック?
メソッドの挙動やらが違うのに同じインターフェースを使ってるのか?
Javaとかの型パラメータでも、まさか中でキャストして使ってるのか?

偶然にインターフェースを実装してしまったケースなんて想定しても仕方ないと思う
それは設計ミスだから
区別用にダミーのメソッド生やしとけば?
2021/02/13(土) 13:30:40.12ID:+kP5eWz9
goは組み込みで要素が型付けされた動的配列と連想配列を持ってるから、他のコレクションはあまり必要ないんだよね
それらでカバーできないようなケースってそもそも大抵は特殊な状況なんで、汎用的なコレクションではなくアプリの要請に合わせて独自に作るのが自然
2021/02/13(土) 13:45:02.72ID:0tM9M8c+
んな意味不明なジェネリクスより
>>251 のバグを直して欲しいんだよな
2021/02/13(土) 13:54:07.96ID:QtTWHsVQ
>>397
ジェネリクスはロジックを使い回すのためだけにあるわけではないと思うよ。
Sortableなんてinterfaceを実装した配列を引数に受ける関数の戻り値の型は何になる?
Sortableの配列が帰ってきても無意味でしょ。

>>398
中でキャストするとかは意味不明じゃないか。
ジェネリクスがない頃のObjectの配列を受けざるをえないメソッドはまた違っただろうけど。
ダミーのメソッドとか完全に意味不明。
2021/02/13(土) 14:07:47.74ID:0tM9M8c+
>>401
Sortableの配列を返すので正しい
文意からソート結果だろ?

君が型チェックしなきゃならんとか意味不明な事を言い出すからエスパーしたんだよさせるなよ
インターフェースならメソッドを呼ぶだけだから型チェックなんて話は出てこない
型チェックするってことは実体に変換しなきゃならんという話だろ

そうでない場合に考えられるケースとして、偶然に同じインターフェースを実装してしまった構造体を、偶然に渡してしまうコーディングミスを考えているとエスパーしてあげた
そんな阿呆な設計をしてるなら、引数としてるインターフェースにダミーのメソッドを生やしとけば、別のインターフェースになるから誤って渡すミスは無くなる
エスパーさせるなよ
2021/02/13(土) 14:21:47.27ID:QtTWHsVQ
>>402
ソート可能なインターフェイスを受けてソート可能なインターフェイスが帰ってきても何も得しない。

[T Sortable]な関数の返り値は[]Tで十分でしょ。
結果がもう一度ソート可能かなんか必要な情報でない。

intがSortableだとして、返り値が[]Sortableだと、結果は型チェックしないとだよね。
[]intが直接帰ってきた方が効率的だし、無駄なコードではないよね。
やってることも自明。

mapとかflattenなんかなんかはジェネリクス使えないと使い物にならんと思うが。

エスパーするならジェネリクスの使いみちをエスパーしなよ。
2021/02/13(土) 14:23:26.25ID:x5WG3KQe
単一の引数だけなら>>395のようにインターフェースで代用できるけど
複数の引数や戻り値の型を合わせたいという場合は型引数が使いたいよね。
405デフォルトの名無しさん
垢版 |
2021/02/13(土) 14:34:17.23ID:qDntuLeS
>>398
キャストしないといけないの理解できてないあたり、型パラメータとインターフェースでの実装の違い理解してなさそう
2021/02/13(土) 15:24:34.05ID:0tM9M8c+
>>404
複数の別のインターフェースを引数に持たせれば問題ないでしょ
それぞれが型パラメータとして機能するんだから

戻り値も同じ………いや、戻り値に関しては一概には言えないのか
でも実体ポインタを返すメソッドは>>251のバグに引っ掛かるんで使いたくない
→ 戻り値の実体ポインタはインターフェースを備えてるならば、本来は反変でアップキャストされてインターフェースを返しているとも判断されるべき
このバグで多態が機能しなくなるから使いたくない
具体的にはシグネチャが違うため、変種をコレクションに混在して格納できない

ジェネリクスを導入して個別に実体ポインタを返せるようにした時に同じ現象になるはず
このメソッドを持つジェネリクスな構造体は、それぞれ可換でないので多態が適用できない
コレクションに混在させられない

インターフェースを返す設計ならば、それらは実体は異なっても多態が機能してコレクションに混在格納できる
よって、インターフェースを返す方が設計として抽象度に優れている

以上の論旨から、ジェネリクスはインターフェースの下位互換だとしか見えない
2021/02/13(土) 15:35:29.60ID:x5WG3KQe
>>406
違くて、2つの引数があるときにその型が同じであってほしい場合とかね。
2021/02/13(土) 15:42:03.45ID:0tM9M8c+
>>407
その場合には同じインターフェースの二つの引数を持つことによって問題がある事例について具体的に指摘してくれ
型が同じことは保証されてるぞ
2021/02/13(土) 15:44:29.17ID:QtTWHsVQ
>>406
インターフェイスはインターフェイスで使えば良くて、ジェネリクスで効率的にできたり型を自明にできる部分はジェネリクスを使えばよいでしょ。
今でもコードジェネレータなんかで作ってる部分もあるだろうし。

どちらかがあれば原理的にどちらかが不要なのと、
どちらかがあれば片方は作ってはいけないのは別。

Sortとか、mapの[T,U]のKeyのみ、Valueのみを([]T,[]U)と、配列として返す関数なんか書こうと思ったらジェネリクスが無いと型チェックの嵐でしょ。
確かにキャストではないけど、型チェックもノーコストではないよ。

ジェネリクスのある言語使った事無いんじゃないの?

>>403のケースなんかはどうするん?型チェックすんの?
2021/02/13(土) 15:45:29.07ID:QtTWHsVQ
>>408
map[T]Uを受けて、[]Tと[]Uを返す関数。
2021/02/13(土) 15:51:17.90ID:0tM9M8c+
とか顔真っ赤にして主張してきたけど、具体的にちょっと面倒な事例に自分で気づいてしまった

new() が厄介だな
new の代わりにインスタンスを生成する factory 一時クラスを外から渡してやれば解決するんだけど面倒ではある
2021/02/13(土) 15:56:48.27ID:x5WG3KQe
>>408
結局は返り値の話に帰着するのかもしれないけど (T, T) -> T な関数が欲しいとかね。
2021/02/13(土) 16:10:36.47ID:QtTWHsVQ
返り値に関係なかったら、Tとそれに対するfunc(x T)を受ける関数とかかなぁ。
2021/02/13(土) 16:10:51.14ID:0tM9M8c+
>>410
納得した

メソッド引数のシグネチャが異なるものを一本化して書けるわけか
確かにインターフェースじゃmap[T]Uを引数とした共通メソッドは書けない
T,Uがインターフェースだとしても、それぞれのインターフェースの組ごとにメソッドが必要になるから
2021/02/13(土) 16:12:52.49ID:QtTWHsVQ
>>414
伝わってよかった。逆もしかり。
[]Tと[]Uを渡してmap[T]Uを返してくれる関数も。
Pythonでいうとzip関数的な。
2021/02/13(土) 17:03:51.51ID:0tM9M8c+
>>415
JavaだとProxyを使って何でも解決するという黒魔術的解決手段があるのが恐ろしい
デバッグ用だよねとか思ってると struts とかwebフレームワークのソース読んだ時に、インタセプターとかで普通に使われていて更にビビる
2021/02/13(土) 17:45:13.81ID:F3GRWro3
>>416
Springの十八番だな。
ただ、ああいう方法だと結局、ランタイムで死ぬかどうかをテストで担保するしかないって方向性に行きがち。
あとパフォーマンスももちろん遅い。
今回のジェネリクスがどう実装されるかが一番気になるけど、俺的には素直に関数たくさん作って欲しい。
2021/02/14(日) 01:42:02.77ID:o9olz+i9
これメソッドには型パラメータ無理なの?
419デフォルトの名無しさん
垢版 |
2021/02/15(月) 02:10:12.40ID:QPKY0Zj9
>>400
どう考えてもバグじゃないと思う。Goのinterfaceとstructの関係はembedしなければほぼ静的方チェックありの
ダックタイピングだから「そのメソッド実装がインタフェースAを実装している」と思い込んでるのは自分であって
実際にはJavaのようなimplementではないです。もっと言うなら、ルックアップが行われるのは、実行時であり
コンパイルは厳密な型チェックが行われます
2021/02/15(月) 07:00:31.98ID:fLCzNLbm
>>419
んじゃ、言語拡張要望と言い直そう
メソッドの戻り値がインターフェースでの戻り値の型に反変できるなら、インターフェースを具備していると判定して欲しい、と
2021/02/15(月) 07:12:07.78ID:E7fw/gtI
ポインタじゃなくてインターフェースを返すのが正しいのでは?
何故ポインタを返す
インターフェースのポインタにはなんの意味もない
2021/02/15(月) 07:45:45.18ID:NOYsfhr4
>>421
いや、インターフェースのポインタじゃなくて、構造体ポインタ
構造体ポインタ*SubがインターフェースISubを具備しているのは代入させて確認

んでISubを返すメソッドを持つ別のインターフェースを具備させようとした時に、戻り値としてISubではなく、ISubに代入可能な*Subを返させると、シグネチャ不一致でエラー
ISub を期待しているのに *Sub を返していると

インターフェースを具備しているかの判定でも、反変を考慮してくれないだろうか、という要望
そうすればインターフェース対応でキャストして返すメソッドと構造体固有のメソッドの二本を作らなくて済むから

作れよ、と言われちゃうか
2021/02/15(月) 08:02:45.25ID:NOYsfhr4
>>421
シグネチャが合わないコンパイルエラーの時だけ、戻り値の型が互換(反変可能)かで追加チェックさせればいいから、パフォーマンスが極端に悪くなることはないはず
という見立て
424デフォルトの名無しさん
垢版 |
2021/02/15(月) 14:32:51.97ID:QPKY0Zj9
>>421
インタフェースを返すのが理論的にも実装にも正しいけど、インターフェースのポインタは埋め込みを
するときにコンパイラが使う。あんまりこれをやるモジュールは(メモリサイズが大きくなるから?)
標準ライブラリ以外見ないけど。
>>423
「 ISub を期待」というのは分からなくも無いけど、実行時じゃなければ分からないチェックを
コンパイルの速度と、言語の厳格性を犠牲にして、(かなり)保守的な言語がやると思えないですね
2021/02/17(水) 21:45:03.79ID:cMG1yy0u
Go 1.16 is released
https://blog.golang.org/go1.16
2021/02/18(木) 00:00:24.35ID:Nj/E13Sa
今回の目玉は embed で、あとは modules がデフォルト利用になったくらいか
96% って、どこから来た数字なんだろ?
2021/02/18(木) 01:11:43.46ID:cGA2Qyj5
ioutilオワコンになったのか
428デフォルトの名無しさん
垢版 |
2021/02/18(木) 01:58:45.29ID:DBnOoZ1k
え、これすごくない?
ファイル内容のバイナリを変数に設定できるのか
クソ便利そう
2021/02/18(木) 02:18:54.53ID:cGA2Qyj5
凄くはないがまた変なものを入れたなあ
2021/02/18(木) 08:15:16.68ID:a7MZxCIG
そんなに変なもの?
結構ニーズあったじゃん。
2021/02/18(木) 10:42:52.64ID:CVa006wI
embed例を交えながら詳しく懇切丁寧に説明してくれ
2021/02/18(木) 10:59:32.89ID:a7MZxCIG
>>431
WebUIを持ったアプリの画像なんかのアセットをバイナリ一つで配布したいとか。
2021/02/18(木) 19:44:54.68ID:13d7fDKM
それはしゅごい
2021/02/19(金) 01:02:34.28ID:h/t0+GoU
それって凄いことなの?逆に今までできなかったの?
435デフォルトの名無しさん
垢版 |
2021/02/19(金) 02:06:27.21ID:C4/TpWTT
外部ライブラリで出来てたから、そんなにインパクトはない。むしろNotifyContextの方が意味ありそう
こういう事は他言語だと非常にやりづらい
2021/02/19(金) 02:54:55.96ID:h/t0+GoU
NotifyContext例を交えながら詳しく懇切丁寧に説明してくれ
2021/02/19(金) 02:57:11.30ID:EqIzDHt7
自分で調べろや
2021/02/20(土) 05:37:00.99ID:b7O3Qybq
android アプリを調べようと、go android 常駐アプリ で検索したんだけど、go の記事が探しづらい
以前からポケモンが引っ掛かっていた上に、次のandroid11はGoエディションなのか?
2021/02/20(土) 10:48:48.97ID:b7O3Qybq
1.16 だと、Deprecation of io/ioutil は面倒に感じるなぁ
一杯使っちゃっていて
2021/02/20(土) 12:08:15.81ID:AdT3uMXC
検索ワードはgolangって言うのはこのスレの常識
2021/02/20(土) 12:48:22.08ID:Gn0QOwDd
そういやgolang.jpってもう活動していないのか
日本のgoコミュニティの総本山たるべきドメイン名を無駄にしやがって
442デフォルトの名無しさん
垢版 |
2021/02/20(土) 16:13:03.32ID:seCRjC7e
ほんと返すがえすも go は名前がクソい
2021/02/20(土) 17:07:51.09ID:QogkRbMK
ほ〜ら〜 あしもとを見〜て golang
2021/02/21(日) 00:08:47.19ID:4ZSApsu7
名前よりもマスコットがキモすぎるのが気になってしかたがない
2021/02/21(日) 00:49:16.30ID:1AmDYpOZ
キモネズミ
2021/02/21(日) 03:58:10.72ID:XsukC5HX
ヽ( ;゚;ж;゚;)ノ ゴーファッ
2021/02/21(日) 07:48:25.22ID:y91K2jdN
俺みたいにゴーファ君を結構可愛いとか思う人間がいるから厄介
2021/02/21(日) 20:35:02.33ID:H/D/EzLk
JAVAのマスコットよりはまし(´・ω・`)
2021/02/21(日) 22:08:56.40ID:RiVq+6hw
c#はマスコットいないんだぞ
クラウディアとか藍澤光とかいたけどな
2021/02/21(日) 22:43:47.36ID:y91K2jdN
マスコット…冴子先生がCortanaとして復職してくれたなら、Cortanaボタンを非表示にしないのに…
2021/02/22(月) 00:06:54.06ID:X+4sJ2iC
マスコットはD言語がカワイイ。LISPが最キモ。
2021/02/22(月) 00:53:22.82ID:vmWIyuyK
LISPにマスコットなんてあったのか・・とおもってググってみたら
たしかにこれはエグい
キモすぎ
2021/02/22(月) 18:22:17.90ID:GfaSrtw3
なんか gui ライブラリで調べるといろいろ出てきてよくわからん
マルチプラットフォームな gui って何がええんや?
Qt は golang で使ってる人おるんかえ?
2021/02/22(月) 18:24:31.58ID:Xis0SD1d
GoでGUIアプリを作っている人はほぼ存在しない
2021/02/22(月) 18:48:30.06ID:GfaSrtw3
>>454
ありがとう、そうなんか
主にバックエンドで使われてる感じなんかな

https://i.imgur.com/pGBnPCA.png

ふむう
2021/02/22(月) 20:26:35.06ID:MldvwhvK
ローカルHTTPD建てて、ブラウザからAPIで操作するアプリは提供してる
2021/02/23(火) 15:36:36.73ID:zz5KyfHR
>>455
ウチはElectronでGUI作ってバックグラウンドにGo使うてる
2021/02/23(火) 16:06:31.74ID:+9qO7MJU
>>457
面白そうだね
オレオレGUIツールだと.netが楽すぎるのでそっちで書いちゃうけどGOで書くのも楽しそうだ
2021/02/23(火) 16:23:00.26ID:ADOMIACK
GUIは俺は普通にブラウザ起こしてるな。
IE使われると辛いけど。
460デフォルトの名無しさん
垢版 |
2021/02/23(火) 17:19:08.91ID:VHVs6NAa
簡単なguiツール作るならlorcaオススメ
2021/02/23(火) 20:02:44.99ID:K/n0XAdC
for (大分類) {
 for (中分類) {
  for (小分類) {

   wg := sync.WaitGroup{}
   cpus := runtime.NumCPU()
   errCh := make(chan error, cpus)
   defer close(errCh)

   for (アイテム) {
    wg.Add(1)

    go func() {
     defer wg.Done()
     errCh <- 他の関数()
    }()
   }

   err := <-errCh
   if err != nil {
    return だめです
   }

   wg.Wait()
  }
 }
}

こんなコードでwaitしっぱなしになるんだけど
なぜなんでしょうか(´・ω・`)
途中の即時関数にwgのポインタ(&wg)渡すのもやってみたけど、
結果変わらなかった
2021/02/23(火) 21:17:47.85ID:PToR0U76
>>461
・errCh <- 他の関数() はバッファが一杯の場合ブロックする
・err := <-errCh はブロックする
goのchannelは初心者が使うと極めてデッドロックを引き起こしやすいので、まずはchannel使わずに正しく動作するものを作れるようになってから手を出すことを強くお勧めする
2021/02/23(火) 21:36:09.19ID:K/n0XAdC
>>462
ありがとうございます
全体としては物はもうできていて、上記の処理は大量にファイルを出力するため重く
速度改善としてgoroutineを入れようと試みてました。
まあファイルシステムのi/oがボトルネックだとそんなに変わらないかもしれませんが…
2021/02/23(火) 22:03:06.71ID:K/n0XAdC
エラー判定をgoroutineと同じ階層で判定することで返ってくるようになりました
一応オチとしてめも
速度改善はならず
2021/02/23(火) 22:38:49.04ID:VENYjQF8
>>461
ぱっと見しただけで検討しないで書くけど
errCh の受付数はcpuの数
errChの読み込みが一回しかしてないからアイテム数が受付数を越えたら書き込みがブロックされてwgがDoneされない
DoneされないからWaitは抜けてこない
のでデッドロックということでは?
2021/02/23(火) 22:41:20.70ID:K/n0XAdC
>>465
ご指摘のとおりでした
なのでgoroutineと同じループの中でerrChを取るようにしたら動作しました

wg作る位置も動かないからだんだんスコープ狭めていったんですが
一番外のforの外で作って動きました
2021/02/23(火) 23:35:24.39ID:yNATq+Pp
それみんな絶対最初ハマるよな
2021/02/26(金) 08:25:09.52ID:Bk6XWue8
Goのグラフィックって、標準だとこんなに低レベル処理なパッケージしかないのか……
JavaScriptで言うならImageDataしかない感じ
誰かのライブラリ使わないと線を引くだけでも大変
2021/02/26(金) 10:33:50.46ID:jNY0Xh1+
Golang でグラフィックやろうと思う時点で変
2021/02/26(金) 12:53:20.65ID:Bk6XWue8
イメージを生成するサービスを考えてたん
2021/02/26(金) 12:57:25.97ID:jNY0Xh1+
      ∧,,,∧
     (・ω・` ) スマンカッタ・・・
     / y/ ヽ
 ━(m)二フ⊂[_ノ
     (ノノノ l l l )
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
472デフォルトの名無しさん
垢版 |
2021/02/27(土) 00:21:54.45ID:vRM0KdjR
標準ライブラリなんて小さい方がええやん。HTML5のCanvas APIみたいのならgithubに腐る程ある
github.com/fogleman/gg
2021/03/01(月) 04:10:54.66ID:TpLFIcMN
Goに期待しすぎだろ
2021/03/01(月) 05:09:43.67ID:slICkU79
まあ、イケイケGoGoジャーンプ!って言葉もあるくらいやし…
2021/03/01(月) 18:31:47.86ID:yHt6Qgj2
姫ちゃん…
2021/03/01(月) 20:51:58.46ID:Uq9hcXch
https://i.imgur.com/2zyfBy2.jpg
goで思い出すのはこれだった
2021/03/03(水) 00:18:59.60ID:p9OW2PxW
golang.jpドメイン譲渡したのね
2021/03/03(水) 22:42:43.62ID:jgL4cdff
本当だ。いまのところ微妙そう
2021/03/04(木) 00:12:11.42ID:zOLUDfBP
bloggerってまじかよ
2021/03/05(金) 23:37:39.02ID:NrMSs+Xp
16がでてしばらくたつけど、何か問題があった人いる?

無かったら入れようとか姑息
2021/03/06(土) 00:21:56.60ID:fsuLBHjt
当初から分かってたがPlan9同様、実用言語ではなく
他の言語のリファレンスとしての研究用言語になったな
2021/03/06(土) 00:38:15.94ID:KM3KYugu
実用してるが…?
2021/03/06(土) 00:40:14.00ID:d8HwcXCo
もともとグーグルの社内言語だったと聞くが
本家では今も活用されているのかね
484デフォルトの名無しさん
垢版 |
2021/03/06(土) 00:45:32.22ID:KIij34oc
Plan9を実用してる物好きもいるわけだし
2021/03/06(土) 01:20:00.90ID:W4toJ95e
モンストの通知サービスの一部でも、他の言語とのトライアルの結果で採用したとのインタビュー記事が、つい先日あったし(日経XTECH)
2021/03/06(土) 01:21:35.92ID:W4toJ95e
学習が簡単というのがデカかったらしい
分かってるな
2021/03/27(土) 12:51:18.06ID:odHdDNPL
CodeZine(コードジン): 2020年のGo言語利用状況が明らかに、9648名の開発者が回答.
https://codezine.jp/article/detail/13819

正直、手前味噌過ぎて萎える
無作為アンケートならともかくなぁ
2021/04/24(土) 03:38:06.28ID:ifUTO7D9
echoでAPIのパラメータの初期値を設定する方法って
ぐぐると構造体作ってコンストラクタで設定しよう!とか出てくるんだけど
なんかすごく面倒な上記述場所が離れててわかりにくい気がしてならないんだけど

例えばこんなのは悪手?
まあ悪手なんだろうけど

func getParam(p string, defaultValue interface{}) interface{} {
 switch defaultValue .(type) {
  case string:
   if p == "" {
    return defaultValue
   } else {
    return p
   }
  case int:
   ret, err := strconv.Atoi(p)
   if err != nil {
    return defaultValue
   }
   return ret
 }
 return nil
}


pageNo := getParam(c.Get("pageNo"), 1).(int)

一般的な方法ってあるのかね
2021/04/28(水) 00:42:58.14ID:1SQ+syPV
勢いないな
特に語ることがないんだろうけど寂しい
2021/04/28(水) 00:50:07.66ID:yDqZolk/
2こないとずっとこうだろな
2021/04/28(水) 20:28:06.34ID:4UCtxfw0
見上げて〜golang〜♪
2021/04/29(木) 01:22:39.54ID:466xktgC
ひさしぶりに書く機会があったが
やっぱクソだなこの言語
493デフォルトの名無しさん
垢版 |
2021/04/29(木) 13:27:14.24ID:VDhRy7EO
>>492
けっこう同意
2021/04/29(木) 17:19:19.73ID:Ir6i0rIh
肝心のグーグルに普及させる気がないように思う
メンテナンスが別組織に移ったにしてもさ
495デフォルトの名無しさん
垢版 |
2021/04/29(木) 20:46:39.37ID:CJL0HvU9
ファンクション実行環境が使い放題のところでは有用かもしれないけど、それ以外だとあまりいいことがない
2021/04/29(木) 22:07:05.66ID:WSQEbpw8
ジェネリクス入ればまた話題になるさ
それ以外では大きな機能追加はなさそうだし
話すことはゼロ
497デフォルトの名無しさん
垢版 |
2021/05/03(月) 07:41:43.88ID:Yuy7LADv
>>496
これまた同意
498デフォルトの名無しさん
垢版 |
2021/05/03(月) 10:42:59.25ID:O7+GYvY4
Ubuntuに最新のfzfを入れるために成り行きでgoも入れてビルドに使ってるんだけど、使い勝手どう?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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