Go language part 3

■ このスレッドは過去ログ倉庫に格納されています
2019/10/17(木) 21:38:04.78ID:wMsZ+t6y
Goについて扱うスレッドです。
GoはGoogleによって開発された言語です。

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

日本語訳
http://golang.jp

※前スレ
Go language part 2
https://mevius.5ch.net/test/read.cgi/tech/1510395926/
2019/11/02(土) 10:54:34.41ID:ZFvN4ynw
Most Popular Programming Languages 1965 - 2019
https://www.youtube.com/watch?v=Og847HVwRSI
2019/11/09(土) 14:40:29.85ID:LmK44fG0
Go 10周年

https://blog.golang.org/10years
71デフォルトの名無しさん
垢版 |
2019/11/09(土) 14:45:47.99ID:BZG37V3w
おめでとう
そして 10年で 3 スレ
2019/11/10(日) 16:35:00.71ID:AlAC5EvK
>>67
狙ったgoroutineにってのが推奨されてるかはわからんけど、レシーバなり関数のパラメータなりにid持たせて、終了通知channelにそのidを送って受け取った側で処理する、とか
2019/11/12(火) 18:31:22.40ID:1W50Wecq
継承、関数オーバーライド、多態性を実装したサンプルをまとめてみた
https://play.golang.org/p/4_p8gXLRJ1j

今後のバージョンアップで機能しなくなったりとか、現状でもマズイ部分って、どれくらいだろうか?
2019/11/12(火) 19:33:54.99ID:gbKk99TD
オーバーライドしたスーパークラスのメソッドを呼び出す例が無かったんでちょっと変更
https://play.golang.org/p/XUfFldlrkqT
75デフォルトの名無しさん
垢版 |
2019/11/13(水) 13:05:15.15ID:OceCV+VL
ローソンやめて・・・
2019/11/14(木) 12:27:37.91ID:DypnJQvv
>>73
それは多態になってない
呼出元が直接Sub.Msgを呼んでるだろ
2019/11/14(木) 12:45:55.94ID:OUpVBwEJ
>>76
Inheritance.Msg()じゃないの?
2019/11/15(金) 01:20:51.87ID:mVgFykxZ
>>76
うん、BaseもSubも同じインターフェースに代入してメソッド呼んでるから、ちゃんと多態になってると思う
それとも俺とかレス主が多態性を勘違いしてる?
79デフォルトの名無しさん
垢版 |
2019/11/19(火) 11:45:57.48ID:yN0S2651
新しいサイトのurlゴーデブとか俺をバカにしてんのか?
2019/11/19(火) 13:05:47.04ID:l66aOXt6
go.dev
pkg.go.dev

デヴ乙
2019/11/19(火) 19:24:06.45ID:FmtuL8lJ
新しいサイト?
言語仕様ドキュメントが見つからないから、移行ではないよな?
何のためのサイト何だろうコレ
2019/11/19(火) 19:41:52.54ID:nsf/4FCJ
ごーでぶキュレーションサイトなのかな
https://japan.zdnet.com/article/35145511/
2019/11/19(火) 19:55:13.02ID:FmtuL8lJ
ああ、つまり経営者向けの広告サイトなんだな
2019/11/19(火) 20:30:05.61ID:j6UXNqhz
> https://blog.golang.org/go.dev
> Today we are launching go.dev, a new hub for Go developers, to help answer those questions.
開発者向けのハブサイトだと
85デフォルトの名無しさん
垢版 |
2019/11/20(水) 04:14:35.39ID:MuZ0V3fT
デブで経営者向けはないだろw
経営者ならスマート
2019/11/20(水) 05:50:27.81ID:yYpRsUso
ドメインの管理者は…
2019/11/20(水) 21:31:46.92ID:TfJaRLfE
>>48
Go言語を採用して開発をしている会社一覧
https://web.archive.org/web/20191120013540/https://qiita.com/muchi/items/018c81c27f637797fcf3
2019/11/21(木) 22:11:47.49ID:zCme0Fkr
なぜかVScodeでmain.goだけ"fmt"とか全くimportできなくなってしまった
language serverのリスタートもWindowsの再起動も駄目
なんじゃこりゃ、まいったね
2019/11/22(金) 22:15:46.73ID:meXSLknH
>>88
コマンドラインからは叩けるの?
同じ現象なってたわ
2019/11/23(土) 08:06:54.73ID:5HHeTBXj
>>89
コマンドラインでgolintとか叩いても何も出ないね
今は出なくなってるけど、原因がわからない
ちなみに1.13.1
2019/11/23(土) 12:27:33.32ID:1tA3t0n1
>>90
俺もvscodeの再起動で治ったけど、module周りはちょいちょい不具合でるなあ。
importの警告がいきなりでてきたり
2019/11/23(土) 14:07:25.44ID:5HHeTBXj
>>91
また modules か
modules ってどうなるのかな?
godoc が動かない issue も目処が立っていないらしいし
2019/11/23(土) 20:04:06.92ID:1tA3t0n1
>>92
バグのあるバージョンがミラーに乗っかっちゃったらポイズニングするしかないのとかもなんとかしてほしい。
コンパチがゆえの弊害が出ている気はする。
2019/11/23(土) 20:37:12.05ID:5HHeTBXj
>>88
import "./internal/config"
とか相対パス参照を止めて完全パスでインポートしたらエラーが消えた
別マシンだと1.12だったからなのか動いてたんだけど、なんだこりや
2019/11/23(土) 21:02:17.64ID:zPKhdy+L
環境変数 GO111MODULE を off にセットしてみたら
2019/11/23(土) 21:13:40.13ID:pGKd1Nh3
言語自体はそれなりに良いんだが開発状況見てるとと将来が不安。rubyに似てる。
2019/11/23(土) 21:21:33.69ID:3Nj772W5
>>96
最初からコンセプトがシンプルだから、rubyとまではならないんじゃないかな。と、思いたい。
あとケツ持ちがでかい
2019/11/23(土) 21:44:02.36ID:zPKhdy+L
>>94
go.mod に

replace internal/config => ./internal/config

と書いておくと

import "internal/config"

と書ける。 ./internal/config ディレクトリ内にも go.mod を作っておく必要があるけど
2019/11/23(土) 21:57:18.51ID:5HHeTBXj
>>95
環境変数見てもgo env見ても
GO111MODULE=
と設定されていませんね
Goを始めたのが1.12だったから、そもそも必要なかったし
2019/11/23(土) 22:02:32.31ID:5HHeTBXj
>>95
ん、off?空指定とは違う挙動になるのかな?
2019/11/23(土) 22:08:43.74ID:5HHeTBXj
>>98
internal以下のパッケージの全てにgo.modを入れるのはちょっと…
2019/11/23(土) 22:12:34.14ID:zPKhdy+L
>>100
1.13 からデフォルトは on
2019/11/23(土) 22:13:50.79ID:5HHeTBXj
シンプルなのはいいんだけど
golintでチェックされる命名規則が嫌すぎる
キャメルでgetJsonDataとかだったか関数定義したら"JSON"と大文字で書けとか怒られた
お前は姑か!
2019/11/23(土) 22:19:49.28ID:5HHeTBXj
>>102
むしろoffじゃ駄目じゃん、modules 使ってる環境だから
go.exe env GO111MDULE=on
してみた
2019/11/23(土) 22:22:02.56ID:5HHeTBXj
>>102
あ、書き忘れ
1.13からのデフォルト変更は無しになってautoのままらしい
2019/11/23(土) 22:24:43.43ID:zPKhdy+L
off にして modules 捨てたらいいんじゃないかな
2019/11/23(土) 22:29:30.47ID:zPKhdy+L
後は import "hoge-project/internal/config" って書くとか
これなら go.mod を作ったり弄くらなくて済む
2019/11/23(土) 22:40:38.71ID:5HHeTBXj
>>107
まさにそれ
完全パスで書いたら通る
109デフォルトの名無しさん
垢版 |
2019/11/25(月) 21:36:43.85ID:aLYZ9MFJ
初心者なんだがcontextの使い道がいまいちわからん。
cancelとかなんかいいサンプルないかな。
2019/11/25(月) 22:24:43.09ID:ELiIkdft
>>109
パッケージドキュメントのExampleが、自分としては分かりやすかった
WithCancelしか使ってないけど

あと、go vet がバグっていて親contextのCancel関数があるのに
子供のCancel関数を_で捨てると怒られる
https://github.com/golang/go/issues/29587
暫定的な解決法は一旦変数に取ってから_に代入
2019/11/25(月) 22:34:45.60ID:ELiIkdft
>>109
使い方じゃなくて使い道かー
んー、goroutineをポコポコ作る場面で、処理をキャンセルしたい事ってあるけど、作り散らしたgoroutineに通知しないとキャンセルできない
そんなとき自前で仕掛けを作らなくてもcontextを使えばいい
あとは、そういった処理にタイムアウトを実装したい時にも、タイマーが組み込まれてるcontextがある

Valueは使ったこと無い
2019/11/25(月) 22:57:11.50ID:0VXwuJZP
ありがちなのはsigintしたときにすぐにプログラムを止めずに子のゴルーチンの処理が一区切りついてから止める場合とかかな🤔
2019/11/26(火) 02:26:32.95ID:RC9c8z2p
改訂2版 みんなのGo言語、2019/8/1

買ってきた。
これは、文法以外の開発に関する本
2019/11/26(火) 07:37:44.38ID:wNKG8xXd
>>112
んだね、自分はちゃんと後始末していることを保証するためにWaitGroupと組み合わせてる
115デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:25:52.87ID:+MieSoC5
>>111
回答ありがとう
そういうケースって、親がcancelしたら、goroutineはDoneを受信したら終了、って認識なんだけど、それって終了するためにfor、select前提、になるのかな
116デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:27:45.16ID:+MieSoC5
>>112
それも考えてはみたんだけど、waitgroupか、キャパ付きのerrorChannelで事足りてしまうような。
context難しい。。
117デフォルトの名無しさん
垢版 |
2019/11/26(火) 15:32:27.05ID:+MieSoC5
>>110
パッケージドキュメントだと、やはり基本的にループ待受なのね

なんかイメージ的に、その文脈から派生した処理を上手いことその派生分だけ切り上げる、みたいな感じだったけど、contextWithCancel使う=ループ処理がある、なのかな
2019/11/26(火) 18:34:43.56ID:8XlTLgEr
>>115
そうなる
各goroutineではチャネルを読まないといけない
んでもコード的に汚いから、裏技がないかと>67で質問したけど無いみたい
interrupt panic とか起こせたらなぁ
119デフォルトの名無しさん
垢版 |
2019/11/26(火) 20:40:53.47ID:+MieSoC5
>>118
なるほど。参考になる。
channel読むの前提ってことは、やっぱり汚くなるよね。
selectで終了待受したいなら、中でさらにgoroutine生成してselectまで進めておく、しかないと
なんかこう、WithCancelで生成したcontext渡してcancelしたらなにも考えることなく終わってほしいなー。
120デフォルトの名無しさん
垢版 |
2019/11/26(火) 21:33:38.25ID:+iLBHaU9
>>114
便乗して更に質問で申し訳ないが聞きたい。waitgroupって、個人的にはworkerの数が決まってるなら使うべき?
wg使わずにキャパシティ付きchannelに放り込む、クロージャでdefer closeしてその後channelをrangeで回す。というのもソースコードではよく見る。

ここら辺なにが正解なのかわからんのよね
2019/11/26(火) 22:53:16.65ID:wNKG8xXd
>>120
workerの数が決まらないほど、使うべきなんじゃない?
要するに全部のgoroutineが終わったかどうか判断する仕組みだから
ちなみに自分はgoroutineを二段構えで呼んでて、WaitGroupは隠してる
https://github.com/XORveRCOM/util/blob/master/pkg/easywork/easywork.go
2019/11/26(火) 22:57:07.00ID:eptCat3v
workerの数決まっていないでチャンネル使うとキャパシティ以上にワーカーできたとき詰まって死にそう🤔
123デフォルトの名無しさん
垢版 |
2019/11/26(火) 23:23:09.81ID:Gw3sx8bp
>>121
回答とサンプルありがとう。
質問の日本語がおかしかった。。
なるほど、こうすればchannelで送受信しなくても逐次的に処理できるということか。

ちなみにworkerの数が決まらないケースって、どんな場面で遭遇する?

常駐してて死なないアプリ以外にあんまり思いつかず
2019/11/26(火) 23:23:41.57ID:wNKG8xXd
>>122
WaitGroupのソースを参照
125デフォルトの名無しさん
垢版 |
2019/11/26(火) 23:29:52.93ID:Gw3sx8bp
>>122
受信側は無限に待ち受ける想定だとどうかな?というか、waitgroupを使わないユースケースがそれぐらいしか思いつかないんだよね

waitgroupが有効なケース、だけどwaitgroupを使わないケースってどんなんがあるのかな。
2019/11/26(火) 23:36:45.35ID:wNKG8xXd
>>123
常駐じゃなくても並列処理で足並み揃える時とかに使うかな
例えば並列で別のダウンロードさせたり
127デフォルトの名無しさん
垢版 |
2019/11/26(火) 23:46:52.62ID:+iLBHaU9
>>126
そうか、パッと見ダウンロード処理を開始する時にwg.Add(len())すれば、とおもったけど、よく考えたら何をダウンロードするのかを取得する処理自体が並列化してる場合は、ソースみたいに自分でAdd(1)しないと並列化できないね。
とても勉強になった。ありがとう。
2019/11/26(火) 23:59:49.88ID:eptCat3v
>>124
WaitGroupのソース見る限りAddされた数と待っている数を保持していてチャンネルを使っていないっぽいけど…
チャンネルを使うと詰まることあるけどWaitGroupならないんじゃないかな
https://golang.org/src/sync/waitgroup.go?s=574:929
129113
垢版 |
2019/12/02(月) 22:40:03.04ID:H5nAExhM
>>113
改訂2版 みんなのGo言語、2019/8/1

半分ぐらい読んだけど、これは、文法以外の開発に関する本で、

テスト・デザインパターンなど、
各言語の中級者向け「Effective 何々」に相当する本
130デフォルトの名無しさん
垢版 |
2019/12/03(火) 08:47:37.15ID:+IyagjW2
effective goは無料で読めるけど全然似てない。適当こくでねぇ。
2019/12/05(木) 11:52:28.33ID:a2pVpta0
シマンテックのSEPがgolintを誤検知してさくっと削除
2019/12/06(金) 09:12:39.72ID:f1K6IxOi
誤検知じゃないかも
133デフォルトの名無しさん
垢版 |
2019/12/08(日) 01:05:14.90ID:XpO05MF4
ジェネリクスとnnbdは入ったの?
134デフォルトの名無しさん
垢版 |
2019/12/12(木) 01:16:12.28ID:8N8BhmJA
>>133
入ってない。
ジェネリクス欲しいよね
2019/12/14(土) 02:29:56.08ID:yWRsmPzk
ジェネリックよりインターフェースのメソッド名をリファクタリングする機能が欲しい
それとファイル内に閉じたスコープの新設
2019/12/14(土) 12:20:22.72ID:txh4qI7o
サクッとwebサーバー建てる時お前らエコー使うだろ?
後輩がジン一択言って譲らんのよ
2019/12/14(土) 12:25:23.49ID:yWRsmPzk
ごめんnet/http一択
138デフォルトの名無しさん
垢版 |
2019/12/14(土) 18:57:44.23ID:SoAE2obC
サクッと立てたい時にフレームワークは使わない
2019/12/14(土) 21:25:16.45ID:yWRsmPzk
さくっと欲しいときは
https://play.golang.org/p/LtYjxcomguJ
を使ってる
2019/12/14(土) 21:32:58.33ID:b2AnHSwF
>>139
お、イイネ!
2019/12/16(月) 01:49:06.93ID:tdYdVSGI
go初心者です。
田中、佐藤、加藤からランダム(重複なし)で3つ抽出するにはどうすればいいでしょうか?
2019/12/16(月) 01:56:43.58ID:oBdKFKCd
取り出す数が配列の大きさと同じならシャッフルすれば良さそう
https://golang.org/pkg/math/rand/#Shuffle
2019/12/16(月) 02:11:32.44ID:tdYdVSGI
>>142
なるほど。
ただ実際は配列の大きさは100個くらいあって取り出す配列は5つなんですよね...
2019/12/16(月) 02:29:03.91ID:oBdKFKCd
>>143
重複なしならシャッフルして前から5個取れば良さそう
2019/12/16(月) 02:37:03.68ID:tdYdVSGI
>>144
すみません、前から5個取るにはどうすればいいのでしょうか?
2019/12/16(月) 02:44:37.15ID:F1oitXIE
https://play.golang.org/p/RWZYkJYabd2

Playground だと時間が止まってるから常に同じ結果しか表示しないけどね…
2019/12/16(月) 02:50:18.86ID:tdYdVSGI
>>146
おー!これでいけそうです。
ありがとうございます。
2019/12/16(月) 18:22:41.60ID:e0hK5sZz
おんぶに抱っこやんけ
149デフォルトの名無しさん
垢版 |
2019/12/16(月) 20:24:54.73ID:4cesp02J
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)
}
2019/12/16(月) 20:25:53.67ID:4cesp02J
リフレクション使えば判別出来るのは知ってる
2019/12/16(月) 20:35:08.46ID:F1oitXIE
まぁ、こんなんかなぁ…

if a, ok1 := x.(int); ok1 {
if b, ok2 := y.(int); ok2 {
fmt.Println(a, b)
}
}
2019/12/16(月) 20:41:01.13ID:F1oitXIE
reflection ならこうかな

import "reflect"

if reflect.ValueOf(x).Type() == reflect.ValueOf(y).Type() {
 fmt.Println(x, y)
}
2019/12/16(月) 23:14:32.24ID:xtOX+BoM
型アサーション使っていいなら、型スイッチという手段も
2019/12/18(水) 18:41:56.85ID:q6G7SevV
golang関係ないんだが、50000番台ポートをlistenで開きまくるアプリ書いてるんだが、テスト実行毎にデバッグexeのパスが変わってWindowsDefenderがブロックしましたダイアログ出してきてウザいよぅ
うちはSEPなんでお呼びじゃないし、更にブロックされてると主張してるがテストコードはガンガン通ってるからブロックしてねーし

ともかく、デバッグexeの一時フォルダを固定する設定ってある?そうすりゃ例外設定書ける
155デフォルトの名無しさん
垢版 |
2019/12/19(木) 17:58:01.30ID:E0rD8pHx
go testの内部処理を追ってどうぞ


https://go.googlesource.com/go/+/refs/heads/master/src/cmd/go/go_test.go
156デフォルトの名無しさん
垢版 |
2019/12/19(木) 18:04:48.44ID:E0rD8pHx
>>155
リンクミス
こっち
https://go.googlesource.com/go/+/refs/heads/master/src/cmd/go/internal/test/
2019/12/21(土) 20:16:12.25ID:YQ48l2e3
ep8 ー ep7で雑に投げられた謎を雑に処理、端から解決する気無し。既存キャラの大幅劣化に加え、ローズ、紫バァ、暗号破りの新キャラ3人がヘイトの対象に(主にローズ)

ep9 ー ep8の出来事はほぼ無かったことに…。大味極まりないが逆にそれが功を奏し、SWファンからの評価は概ね高い。興収でエンドゲームを超えられるか注目
2019/12/21(土) 20:17:39.18ID:YQ48l2e3
ごめん、完全誤爆
159デフォルトの名無しさん
垢版 |
2019/12/26(木) 23:28:38.63ID:mrZiX212
名前付き引数ってこんな感じでいいの?

https://play.golang.org/p/dckMhAXN5Ve
2019/12/26(木) 23:57:38.99ID:oc05wxay
>>159
知らんのでググって、最初にヒットした奴の方が良いな

具体的にはオプションはそれぞれ対象の構造体ポインタを受けとるシグネチャを持つ関数
そのメソッドのスライスを順に呼ぶと、関数が特定フィールドに値をセットするという作り
まず、その方式だと型switchがいらない
オプションを増やしたければセット用の関数を増やす

他の利点として、設定する関数では他のフィールドも参照できるから、矛盾のある設定を防ぐとか柔軟な設定もできそう

ぱっと見、visitパターンっぽいアイデアに見えた
(個人的な初見の感想なんで深く考えて言ってる訳じゃない
なんだっけ、二重呼び出し?
2019/12/26(木) 23:58:56.08ID:uIk/XshQ
まぁ、interface{} で良いんじゃないかな

https://play.golang.org/p/MekSknA7SOd
2019/12/27(金) 00:43:24.50ID:3vrV+39v
>>160
https://play.golang.org/p/IPFXvijbxKY
2019/12/27(金) 18:28:35.28ID:Ppw19SXV
ひさしぶりにGO触ったら仕様変更の真っ最中なのね...
暫く冬眠しとくわ                         
2019/12/27(金) 18:35:37.18ID:DR+ZCW3w
いつでも仕様変更
ジェネリックス欲しがってる層って、何のクラスタの人なんだろ
165デフォルトの名無しさん
垢版 |
2019/12/27(金) 20:14:12.67ID:MjAsf7uH
Java
2019/12/27(金) 20:24:26.71ID:ttsY8Nqp
Java 原人、生きていたのか
2019/12/28(土) 00:46:09.91ID:zIP3TdeH
ていうか Java のジェネリクスもおもくそ後付けやん
2019/12/28(土) 13:38:22.34ID:bI9Nn/0L
golangのゆるふわなinterface機構の上でジェネリックスの出番なんてそうそうあるものなのかな?
2019/12/28(土) 13:43:53.42ID:c5TG1bir
ちょっと凝ったことをしようとすると interface{} まみれになるところが改善できれば。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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