タグ

Goに関するakatakunのブックマーク (130)

  • 「Go言語で楽しくなるシステム開発:基礎から実践テクニック」mattn × 渋川よしき | Forkwell Press | フォークウェルプレス

    【ちょっと宣伝】上級エンジニア特化のキャリア支援サービスをはじめました! 市場の変動がキャリアへの不確実性をもたらす昨今、これまで以上にエンジニアに寄り添いたいという想いから、上級エンジニア特化のキャリア支援サービスをはじめました。スポーツ選手のエージェントのようにエンジニアの立場で次のキャリアを提案いたします。一般的な転職エージェントのように募集中の案件を紹介するだけでなく、あなたの理想のキャリア実現に向けて、ニーズがありそうな企業へ交渉し、望ましい案件を創出する働きかけも行います。無料で利用できますので、お気軽にお申し込みください。

    「Go言語で楽しくなるシステム開発:基礎から実践テクニック」mattn × 渋川よしき | Forkwell Press | フォークウェルプレス
    akatakun
    akatakun 2023/10/11
    一問一答。なるべく曖昧さを与えない。明示的に開発者がコードで意思決定するプログラミングが方針, error handlingの手間はそのため。全てのエラーを明示的に対処し暗黙をなくし、early returnすることでバグを減らす
  • Should I be able to type assert a slice of string maps?

    akatakun
    akatakun 2022/03/10
    []mapt[string]interface{}へはassertionできない。[]interface{]へassertionしてから各々をmap[string]interface{}でassertionする必要がある。メモリ表現が異なるため
  • Protocol Buffers用 Go言語APIの APIv1 と APIv2 の差異 - Qiita

    この記事について Protocol Buffers用 Go言語API に新しく V2 (APIv2) が出たことにより、import のパス、リポジトリ、protoc-gen-go などに違いがあり混乱したので整理してみた。 [2021/2/13更新] 初回投稿時点(2020/05/11)では APIv2 用の protoc-gen-go-grpc がリリースされてませんでしたが、2020年10月にリリースされたため内容を更新しました。 Protocol Buffers用 Go言語API について Protocol Buffers(以下、protobuf)は言語ニュートラルなデータのシリアライズの仕組みで、Go言語でも protobuf を使うための API が提供されている。 最初の API が提供されたのが 2010年ごろで、これを APIv1 と呼ぶ。 そして、2020年3月に新しい

    Protocol Buffers用 Go言語APIの APIv1 と APIv2 の差異 - Qiita
  • Goにおけるエラーのコンテキストとエラーハンドリング - shiimaxx's blog

    このエントリは Gopher道場 Advent Calendar 2018 5日目の記事です。 Goではエラーをerror型の値として扱います。errorはビルトインのインタフェース型として次のように定義されています。 type error interface { Error() string } https://golang.org/pkg/builtin/#error Goではインタフェース宣言時に定義したメソッドリストを実装することでインタフェースを実装します。 つまり、任意の型にError() stringをメソッドとして実装すれば、独自のエラー型のerrorとして扱うことが可能になります。 標準パッケージ net のエラー型 例えば標準パッケージのnetでは、OpError, DNSErrorなどの様々な独自のエラー型が定義されています。 これらのエラー型は、エラー情報を格納する

    Goにおけるエラーのコンテキストとエラーハンドリング - shiimaxx's blog
    akatakun
    akatakun 2020/06/09
    errorインタフェースの他にnet.Error Interfaceを実装しており、エラーの性質を判別するためのTimeout() bool, Temporary() boolなどのメソッドが定義されている
  • 全然わからない。俺たちは雰囲気でSliceを使っている

    この記事は Go7 Advent Calendar 2019 4日目の記事です。 Go7 Advent Calendar 2019 - QiitaAdvent Calendar for Gophers Go1 https://qiita.com/advent-calendar/2019/go Go2 https://qiita.com/advent-calendar/2019/go2 Go3 https://qiita.com/advent-calendar/2019/go3 Go4 https://qiita.com/advent-calendar/2019/go4 Go5 https://qii...https://qiita.com/advent-calendar/2019/go7 Arrayは固定長で扱いづらいから可変長のSliceを使う。 そのくらいにしか考えていませんでしたが、

    全然わからない。俺たちは雰囲気でSliceを使っている
    akatakun
    akatakun 2020/04/06
    SliceはArrayのPointerをFieldに持つStructure,Capacityは根底となる配列(Array Field)の長さ,LengthはSliceの長さ,Capacityを超える場合、Arrayは作り直される,通常操作はArrayのほうが高速だが、参照渡しはSliceのほうが早い(No Copy)
  • GoでJSONの数字/数値を扱う - 年中アイス

    JSONはデータの表現形式です。表現はできますが、項目があるかや、型が何であるかを検査する仕組みはありません。*1 そのため、システムや実装が分かれている場合に、数値を期待しているが、JSONの表現上、数値か数字かがずれていることが起き得ます。どういうことかというと、"numeric":1234 (数値)なのか、"numeric":"1234" (数字)なのかが違う、または不定ということ。仕様の齟齬や、実装ミスなどで発生します。 動的型付け言語の場合、よしなに扱ってくれたりしますが、Goにそれをやられると型エラーが発生してしまいます。GoでJSONを読み込む場合、encoding/jsonパッケージのjson.Unmarshal()を使って、structに読み込む方法があります。しかし、stringで定義していたら、数値がNG、int系で定義していたら、数字がNGです。 stringは数値

    GoでJSONの数字/数値を扱う - 年中アイス
    akatakun
    akatakun 2019/12/23
    json.Unmarshalしたmap[string]interface{}は数値がstringやnumberで来たりするのでjson.Numberを使う
  • go-swaggerでAPI定義(swagger.yml)からサーバーのコードを生成する - Qiita

    go-swaggerを使って、API定義(swagger.yml)からサーバーのソースコード(Go言語)を生成、APIの中身を実装していく方法についてまとめます。この投稿では、シンプルなEcho APIを実装してみるところまでをやります。 go-swaggerのインストール Macの場合はbrewでインストールできます。

    go-swaggerでAPI定義(swagger.yml)からサーバーのコードを生成する - Qiita
  • 他言語から来た人がGoを使い始めてすぐハマったこととその答え - Qiita

    環境構築するまでに知りたかったこと Golangの最新バージョンは? 1.16.6 (2020/07/12リリース) Goのインストール方法は? macOS の場合は brew で OK この場合、goのsdkは /usr/local/Cellar/go/<バージョン>/libexec にインストールされます。 IntelliJ IDEA や GoLand にような IDE に「GOROOT」というものの指定を求められたら、このパスを使います。 brew で入らないバージョンの go が必要だったり、いくつかのバージョンを併用したい場合は $ go get golang.org/dl/go1.14.4 $ go1.14.4 download # 1.xx.0 の場合 $ go get golang.org/dl/go1.15 $ go1.15 download # 上記でgo getしたg

    他言語から来た人がGoを使い始めてすぐハマったこととその答え - Qiita
  • Goの標準プロジェクトレイアウトを読み解く - Tech Do | メディアドゥの技術ブログ 

    The Go gopher was designed by Renée French and has a CC BY 3.0 license. メディアドゥの沓名と奥野です。 今回は、弊社内での複数のGoプロジェクトの構成を整理する際に参考にした情報をまとめます。 背景 最近、弊社内にてGoで書かれたプロジェクトが増えてきました。 今後もGoプロジェクトは増加する予定のため、プロジェクト間で共有したいコードや、フォルダ構成の統一化を今のうちに行おうと思い立ちました。 ここでは、企業向けに定義された「GitHub - golang-standards/project-layout: Standard Go Project Layout」を参考に、Goプロジェクトのディレクトリ構成のルールについてまとめていきたいと思います。 前提 ここで取り扱う内容は、あくまでGoプロジェクトのディレクトリ

    Goの標準プロジェクトレイアウトを読み解く - Tech Do | メディアドゥの技術ブログ 
    akatakun
    akatakun 2019/07/31
    ディレクトリ構成,ここで取り扱う内容は、あくまでGoのプロジェクトのディレクトリ構成についてであり、パッケージ階層については触れません
  • Goにはディレクトリ構成のスタンダードがあるらしい。 - Qiita

    参考URL 上記リポジトリにはGOプロジェクトでのスタンダードとなるディレクトリ構成の説明が書いてある。一つずつ見ていくことにします。 /cmd 一番メインとなるディレクトリ。このディレクトリの中にアプリケーションのエントリーポイントを作る。 注意点としてはmain.goに多くのことをさせないことである。各処理は基的に後述する/pkgなどで実装していくのでそれをインポートする形を取るべきだとある。 /internal /cmdで作ったエントリポイントで使いたいライブラリをおく。だが、このライブラリは各アプリケーション毎に書かれるものとなるので他のアプリケーションと共有するライブラリは置かない。そうゆうのをおくとすれば、後述の/pkgに置く。

    Goにはディレクトリ構成のスタンダードがあるらしい。 - Qiita
    akatakun
    akatakun 2019/07/31
    ディレクトリ構成
  • Advanced Go Concurrency 3 つのパターン - Block Rockin’ Codes

    intro ちょっと時間が経ってしまいましたが、 Go研 vol.03 では、 Google I/O 2013 で行われてた Go のセッションの 1 つである下記をテーマに研究しました。 Advanced Go Concurrency Patterns 資料は以下です。 https://github.com/goken/goken/blob/master/goken03/goken03.md また、ここから順に実装しながら解説をしますが、その完成品はこちらにあります。 (commit 履歴も、記事にある程度沿っています。) https://gist.github.com/Jxck/5831269 スライドにそってやったのですが、セッションの内容は結構重ためだったので、 2 時間の Go 研だとちょっと消化不良ぎみだったのが反省点です。 そこで、このセッションの要である、並行処理に関する

    Advanced Go Concurrency 3 つのパターン - Block Rockin’ Codes
  • 【Go言語IDE】GoLandことはじめ - Qiita

    ダウンロードしてくる GoLandとは、JetBrains社が開発したGo言語用のIDEです。 ここからダウンロードできます。 使用するためのライセンスに少々お金がかかりますが、学生は無料で使えるのでぜひ申請しましょう。 とりあえず使えるようにする これより、「PreferencesのGoという項目の中のGOPATHという小項目で何かをする」場合、「Go -> GOPATH:何をするかの説明」という形式で書いていきます。 cmd+,でPreferencesを開く。 Go -> GOPATH:GOPATHの設定が適切か確認し、適宜修正する。 Go -> GOROOT:GOROOTの設定が適切化確認し、適宜修正する。 goenvを使っている場合は$HOME/.goenv/versions/1.11.2とかにあるので、cmd+shift+.で隠しファイル・隠しディレクトリを表示しながら探して指定

    【Go言語IDE】GoLandことはじめ - Qiita
  • Go言語での構造体実装パターン

    Go言語での構造体実装は、埋込や独自コンセプトのインターフェースといったGo言語独自の機能を理解して行う必要があります。 今年からGo言語を始めましたが理解が曖昧なままだと実装に迷うことが何度かありました。今回よい機会なので、Go言語での構造体実装パターンとしてまとめてみることにしました。 構造体実装パターン 実装パターンの洗い出しとして、GoFデザインパターンをGo言語で実装する手法をとりました。 その中で繰り返し現れる実装をGo言語での構造体実装パターンとしてまとめてみました。 コンストラクタ関数 エクスポートによるアクセス許可 インターフェースによるポリモフィズム 構造体によるポリモフィズム 構造体によるサブクラス・レスポンシビリティ 構造体による移譲 関数による移譲 以下、それぞれのパターンを解説していきます。 コンストラクタ関数 Go言語には構造体のコンストラクタがないため、構造

    Go言語での構造体実装パターン
    akatakun
    akatakun 2019/07/24
    構造体の生成と同時に行いたい処理や埋蔵構造体を隠す,exportによりsingletonを実装,構造体に共通の実装やmemberを定義したい場合、interaceとconstructorを利用,dispatch backはrecieverにselfを渡しす,委譲はmemberの構造体を呼び出す
  • GolangでAPI Clientを実装する

    特定のAPIを利用するコマンドラインツールやサービスを書く場合はClientパッケージ(SDKと呼ばれることも多いが記事ではClientと呼ぶ)を使うことが多いと思う.広く使われているサービスのAPIであれば大抵はオフィシャルにClientパッケージが提供されている.例えば以下のようなものが挙げられる. https://github.com/aws/aws-sdk-go https://github.com/Azure/azure-sdk-for-go https://github.com/PagerDuty/go-pagerduty https://github.com/hashicorp/atlas-go 特別使いにくい場合を除けば再実装は避けオフィシャルに提供されているものを使ってしまえばよいと思う(まともなものなら互換性などをちゃんと考慮してくれるはずなので).一方で小さなサービ

    akatakun
    akatakun 2018/12/27
    API ClientはHTTPリクエストを抽象化しメソッドに落とし込む.ClientのフィールドはRequestの共通値(http.Client, url.URL, log.Logger, 認証情報など)を持つ,必須でないものはデフォルト値を,Symmetric API testing,aws-sdk-go読むのもいいぞ
  • golang で string を []byte にキャストしてもメモリコピーが走らない方法を考えてみる - Qiita

    package main import ( "unsafe" ) type foo struct { k int64 v int64 } func main() { f := &foo{3,4} // unsafe.Pointer() で匿名ポインタにして // uintptr() で演算可能にして // +8 バイト(64bit)足して // unsafe.Pointer で匿名ポインタに戻して // そこにはフィールド v があるはずなので *int64 にキャストして // デリファレンスすれば出来上がり *(*int64)(unsafe.Pointer((uintptr(unsafe.Pointer(f))+8))) = 5 // グヒヒ println(f.v) // 5 } 0x001c 00028 (stringbytes2.go:8) LEAL go.string."he

    golang で string を []byte にキャストしてもメモリコピーが走らない方法を考えてみる - Qiita
  • Go の並行処理 - Block Rockin’ Codes

    intro 先日の Go のカンファレンス GoCon で、 Go の並行処理周りについて発表させて頂きました。 Go Conference 2013 spring - connpass 具体的には Goroutine や Channel の話ですが、これらの機能は結構面白くて、いじって遊んでるだけでもわくわくします。 Go の並行処理は、設計方針がわりと特殊だと思うのですが、設計がシンプルなので分かるとそこまで難しくはないです。 (使いこなすのは、経験が必要そうですが) 今回話すにあたって色々調べましたが、発表時間の都合上省いたものもあるし、質疑応答で聞かれて応えられなかったこともあるので、 ここでまとめて置こうと思います。 発表資料 今回の発表資料はこちらです。 このブログの内容は、これをベースにします。 http://jxck.node-ninja.com/slides/gocon-

    Go の並行処理 - Block Rockin’ Codes
    akatakun
    akatakun 2018/12/07
    とりあえずこれ読んどけばいい記事。設計方針はMessage Passing方式,読み取り専用のChannelを返す関数を定義することで、このChannelに誤って書き込むことを防ぐ,timeout.Afterでtimeoutを設定
  • Why does the use of an unbuffered channel in the same goroutine result in a deadlock?

    I'm sure that there is a simple explanation to this trivial situation, but I'm new to the go concurrency model. when I run this example package main import "fmt" func main() { c := make(chan int) c <- 1 fmt.Println(<-c) } I get this error : fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]: main.main() /home/tarrsalah/src/go/src/github.com/tarrsalah/tour.golang.org/65.go:8

    Why does the use of an unbuffered channel in the same goroutine result in a deadlock?
    akatakun
    akatakun 2018/12/07
    チャネルがバッファされていない場合、送信側は受信側が値を受け取るまでブロックします。チャネルにバッファがある場合、送信側は値がバッファにコピーされるまでブロックします。バッファがいっぱいであれば、受信
  • go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part2) - Qiita

    前提 go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part1) の続きです。 まずはGo言語の並行処理の方針をEffective Goから引用します。 Do not communicate by sharing memory; instead, share memory by communicating" つまり、ワーカーの間でメッセージパッシングを行う方法が推奨されています。 確かに共有メモリを使う方法は、直感的な気もしますけど、競合とかデッドロックとか、色々と気にしないといけないことが多くて大変です。 メッセージパッシング方式がトレンドなのかもしれません。 go channelはgoroutineの間で値を受け渡しするための配列のようなものです。 channelはバッファを持たせることができて、channelへのデータ送信時にバッファがいっぱいだと

    go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part2) - Qiita
    akatakun
    akatakun 2018/12/07
    unbuffered channelは同期処理に使われる。DualTaskShoriのサンプルがわかりやすかった。
  • go - Convert int32 to string in Golang - Stack Overflow

    akatakun
    akatakun 2018/12/06
    int32 => stringでsprintfを使うのは遅いから自作関数を書くか、それが面倒であればキャストしてstrconv.Itoa(int)を使うのが良さげ
  • Go 言語の ioutil パッケージを使ってみる - 倭マン's BLOG

    Go 言語のいろいろなパッケージを使ってみるシリーズ(目次)。 今回は入出力関連のユーティリティ関数が定義されている ioutil パッケージを見ていきます。 インポートパスは "io/ioutil" です。 【この記事の内容】 ioutil パッケージ ioutil.ReadAll, ioutil.ReadFile 関数 ioutil.ReadDir 関数 ioutil.WriteFile 関数 ioutil.TempFile, ioutil.TempDir 関数 ioutil.NopCloser 関数 変数 ioutil.Discard ioutil パッケージioutil パッケージには以下のような関数(と変数)が定義されています: // 一括読み込み func ReadAll(r io.Reader) ([]byte, error) func ReadFile(filename s

    Go 言語の ioutil パッケージを使ってみる - 倭マン's BLOG
    akatakun
    akatakun 2018/11/29
    ioutil.Discardは書き込んだバイトを全て捨てます。