goに関するbehironのブックマーク (15)

  • research!rsc: Go Data Structures: Interfaces

    Go's interfaces—static, checked at compile time, dynamic when asked for—are, for me, the most exciting part of Go from a language design point of view. If I could export one feature of Go into other languages, it would be interfaces. This post is my take on the implementation of interface values in the “gc” compilers: 6g, 8g, and 5g. Over at Airs, Ian Lance Taylor has written two posts about the i

    behiron
    behiron 2021/05/11
  • Try Golang! Sliceってポインタなの?それともポインタじゃないの?

    ある程度Goを書いているプログラマであれば、下記のようなコードに出くわしたことがあるのではないでしょうか。 そうそう、Mapはポインタだから、関数内で変更した内容は呼び出し元に反映されるけど、Sliceはポインタじゃないから反映されないんだよね。呼び出し元に反映させるためには、Sliceをポインタで渡してあげないといけないね。 と、今までは理解していたのですが、この理解は半分正解で半分間違いでした。今日は、この挙動の原因と、その調査過程で見つけたnilなSliceのおもしろい(?)特徴の2点について、整理したいと思います。 原因は「Sliceはポインタじゃないから」ではなかった実は、追加ではなく、単純な値の変更であれば反映されます。 Sliceの実装を見てみると、Sliceの実体(array)はポインタ型となっています。つまり、Slice自体は構造体ですが、実際の配列はポインタで参照してい

    Try Golang! Sliceってポインタなの?それともポインタじゃないの?
    behiron
    behiron 2021/01/11
  • 実装して理解するスライス #golang - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?

    実装して理解するスライス #golang - Qiita
    behiron
    behiron 2021/01/10
  • GoでHTTP Trailerを扱う - Qiita

    HTTP Trailer Gonet/httpパッケージはHTTP Trailerの送信および受信に対応しています。Trailerとは、HTTPリクエストBodyの末尾に付与できるヘッダと同様の構造です。Transfer-Encoding: chunkedのときのみ利用可能で、Body送信後にしか分からないチェックサムなどをリクエストに付与したいときに便利です。 なお、Go 1.4時点ではサーバレスポンスへのTrailer付与には対応していないようです(Hijackすれば可能)。 使い方 HTTPクライアントリクエスト側でのポイントは以下の通りです リクエストをTransferEncoding: chunked に設定する req.ContentLength = 0 or -1 でも設定可 送信する前にreq.Trailerをアロケーションしておく 送信後、BodyがEOFになる前のタイ

    GoでHTTP Trailerを扱う - Qiita
    behiron
    behiron 2021/01/06
  • GopherCon 2016: Understanding nil - Francesc Campoy

    GopherCon 2016: Understanding nil - Francesc Campoy
    behiron
    behiron 2021/01/02
  • Goでchannelがcloseしてるかどうか知りたい というアンチパターン - beatsync.net

    そういえば金沢に行って来た話の2〜4日目をかいてる途中で2ヶ月くらい経ったことに気付きましたが、まぁその話はおいておいて今日はGoの話です。 さて、このタイトルを見てGoに詳しく賢明な読者の方々は「あぁまたこの話題だよ、Goでchannelがcloseしてるかどうか知りたいようなパターンはだいたい書いてるアプリの設計とかchannelの使い方が間違ってるんだからやめとけ」と眉をひそめるかもしれません。まぁちょっとまって! オレもそうなんじゃないかなぁという気はしているし、ハマリどころがありそうということはうすうす分かってるけど一応調べて考えてみてもいいじゃないか。 結局の所調べて「こうすればいいね!」ってことは分かったんですが、それも破綻する場合があるので、アンチパターンだなぁと思いつつこの記事を書くことにしました。 まずGoのchannelのナイーブさを再確認する そもそもGoのchan

    Goでchannelがcloseしてるかどうか知りたい というアンチパターン - beatsync.net
    behiron
    behiron 2021/01/02
  • The Go Memory Model - The Go Programming Language

    Introduction The Go memory model specifies the conditions under which reads of a variable in one goroutine can be guaranteed to observe values produced by writes to the same variable in a different goroutine. Advice Programs that modify data being simultaneously accessed by multiple goroutines must serialize such access. To serialize access, protect the data with channel operations or other synchr

    The Go Memory Model - The Go Programming Language
    behiron
    behiron 2020/12/26
  • 結局、Go言語をやめる理由はなかった件 - Qiita

    この記事は Go 2 Advent Calendar 14日目の穴埋め記事です。 はじめに @okdyy75 さんによる Go 5 Advent Calendar 14日目の の記事「だから僕はGo言語を辞めた」 が「ベンチマークっていうのはこうやるんだよ」というのを説明するために反面教師的な意味で良い教材だと思ったので、反証記事を書きたいと思います。 ベンチマークを取りながらコードを改善して、最終的にGoは遅くないからやめる必要はないということ、そして、なぜ遅いという結論になってしまったのかを掘り下げていきたいと思います。 下準備 幸いなことに、ベンチマークのソースコードがGitHubにある ので、こちらを実行しながら問題点を改善していきましょう。 ちゃんとコードが上がっているのは素晴らしいですね! 一方で、元記事には測定環境が明記されていませんでしたので、同じ環境で測定することはできま

    結局、Go言語をやめる理由はなかった件 - Qiita
    behiron
    behiron 2020/12/17
  • The empty struct | Dave Cheney

    Introduction This post explores the properties of my favourite Go data type, the empty struct. The empty struct is a struct type that has no fields. Here are a few examples in named and anonymous forms type Q struct{} var q struct{} So, if an empty struct contains no fields, contains no data, what use is it ? What can we do with it ? Width Before diving into the empty struct itself, I wanted to ta

    behiron
    behiron 2020/11/24
  • Three bugs in the Go MySQL Driver

    AI & MLLearn about artificial intelligence and machine learning across the GitHub ecosystem and the wider industry. Generative AILearn how to build with generative AI. GitHub CopilotChange how you work with GitHub Copilot. LLMsEverything developers need to know about LLMs. Machine learningMachine learning tips, tricks, and best practices. How AI code generation worksExplore the capabilities and be

    Three bugs in the Go MySQL Driver
    behiron
    behiron 2020/10/10
  • GoはネットワークI/Oをどう実現しているか - 日記マン

    goroutine自体はOSスレッドに多重化してスケジュールされる。 ランタイムでは goroutine関数をG、OSスレッドをM、GをMに割り当てるスケジューラをP、と名称し実装されている。 qiita.com ではG全てがI/O実行を行いブロック状態になった場合、Gに紐づかれたMがそのままブロック状態になるのだろうか。 100個のgoroutineが同時にI/O待ちのときに、100個のOSスレッドがI/O待ちの状態になっているのか。 結論からいうとならない。なぜならラインタイム以下で非同期I/Oを実現している。 ネットワークI/Oの場合はGoの標準ライブラリではあたかもブロッキングI/Oのようなインターフェイスを提供しているが、 Goランタイム(で動くsysmonという特別なワーカー)が待ち状態のgoroutineのI/Oを非同期I/Oに変換している。 (Linux環境ではepoll(

    GoはネットワークI/Oをどう実現しているか - 日記マン
    behiron
    behiron 2020/08/05
  • Golangのスケジューラあたりの話 - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに 今年に入ってから仕事Golang書いてるのでスケジューラあたりについて調べた。ググってもあんまり資料が多くなかったんでまとめる。ソースコードを参照する時はGo 1.9.3を見た。わかりやすさを重視してあえて雑に説明しているところがあるけどご了承ください。 多分間違ってるところあるんで詳しい人は優しく教えてください。 goroutineあたりの基的な話 goroutineはグリーンスレッド、つまりOSのスレッドは直接使ってない。なので、goroutineを作ることはネイティブスレッドを作る処理よりもはるかにコストが安い。この

    Golangのスケジューラあたりの話 - Qiita
    behiron
    behiron 2020/08/05
  • Golangでtestingことはじめ(1)〜testingパッケージを使ったユニットテスト〜 - DeNA Testing Blog

    こんにちは。 Golangが一般的に使われるようになってきてもう久しいですね。 最近作られたSWET製のツールでも、Golangを採用したものがあります。 そこで、Golangの標準テストパッケージtestingやその他についてまとめたいと思います。 今回から3回にわたり、 testingパッケージを使ったユニットテスト(testing) テストにおける共通処理(testing) アプリケーションのテスト(gomock, httptest) を紹介します。 この記事を読んで一通りGolangでテストがかけるようになると嬉しいです。 この文章中に登場するサンプルは GitHub にありますので、実際に動作させることが可能です。 $ go get github.com/duck8823/sample-go-testing $ cd $GOPATH/src/github.com/duck8823

    Golangでtestingことはじめ(1)〜testingパッケージを使ったユニットテスト〜 - DeNA Testing Blog
  • 不具合から見る go の database/sql の挙動 - UUUMエンジニアブログ

    nazoです。 先日、とある go で書かれたWebサーバーで、too many open files が出て死ぬ、という問題が発生しました。今回はその点に関して調査した内容を紹介したいと思います。 調査内容と結果 too many open files は、言うまでもなく、ファイルの開きすぎで出るエラーですが、 lsof してみたところ、 can't identify protocol 状態のものが大量に存在していました。ソケットが正常に閉じられずに放置されていたようです。 さらに調査をしていると、トランザクションの Begin 〜 Commit をコメントアウトすると発生しなくなることが判明し、そこから以下のバグが発見できました。(gorm を使用しています。また実際のコードとは違います) tx := db.Begin() db.Model(&user).Where("id = ?",

    不具合から見る go の database/sql の挙動 - UUUMエンジニアブログ
    behiron
    behiron 2020/03/24
    “空きコネクションがない状態でコネクションを取ろうとすると、コネクションを取れるまで時間無制限で待つ”
  • Go Fridayこぼれ話:非公開(unexported)な機能を使ったテスト #golang | メルカリエンジニアリング

    はじめに メルペイ エキスパートチームのtenntennです。 メルカリグループでは、毎週金曜日にGo Fridayという社内勉強会を開催しています。 毎週やっているとそれなりに知見が溜まってくるので、定期的に”こぼれ話”としてブログを書こうという話になりました。 今回の記事では、先日のGo Fridayで話題にあがった非公開な機能を使ったテストについて扱いたいと思います。 なお、Goにおけるテストの手法やテストしやすいコードの書き方については、GopherCon 2017でも発表があったmitchellhさんの”Advanced Testing with Go”(スライド/動画)が参考になります。テーブル駆動テストやテストヘルパーなど非常に勉強になるので、まだ見たことのない方はぜひスライドや動画をご覧ください。 TL;DR Goのテストではテスト対象とテストコードを別パッケージにできる

    Go Fridayこぼれ話:非公開(unexported)な機能を使ったテスト #golang | メルカリエンジニアリング
    behiron
    behiron 2020/01/05
  • 1