タグ

golangとコードに関するslay-tのブックマーク (31)

  • 【golang】sqlcコマンドで「SQLクエリから型安全なGoコードを生成」し、生産性を上げたい

    golangsqlcコマンドで「SQLクエリから型安全なGoコードを生成」し、生産性を上げたい by nao · 2022年6月25日 前書き:sqlcとは 記事は、kyleconroy/sqlcの基的な情報を紹介します。 sqlcは、DBスキーマ(DBテーブル定義)、SQLクエリ定義、設定ファイルの3点をインプットとして、型安全なCRUDコード + DBテーブルに対応したモデル(構造体)を自動生成します。ここでのモデルの自動生成には、複数テーブルをJOINしたクエリ用の構造体も含まれます。 個人的な視点では、sqlcは「SQLクエリを検証してから、そのクエリを実行するGolangコードを書いて、クエリ結果を受け取るための構造体を書くのが大変」という課題を解決するツールです。独自のDSL(Domain Specific Language)は殆ど登場しないので、SQLをゴリゴリ書ける

    【golang】sqlcコマンドで「SQLクエリから型安全なGoコードを生成」し、生産性を上げたい
  • golangでHTTP3を試してみる

    はじめに つい先日、HTTP3がRFC9114として正式に発表されました。 RFC読むよりとりあえずパケット見る派なので、とりあえずコード書いて動かしてキャプチャしたいところです。 quic-goは http3 ディレクトリがあり、対応してそうなのでサンプルコードを書いてみました。 数日前にcommitが入っていて開発も活発そうですね。 サンプルのサーバ側コードを試す時はお手数ですが、opensslやmkcertコマンドなどでご自分で公開鍵&秘密鍵を生成してください。 クライアント まずはクライアントのコードを書いてみます。 go.docを見ると、RoundTrip という関数に *http.Request を渡すとHTTP3のクライアントコードになりそうです。 こんなコードになりました。 package main import ( "crypto/tls" "fmt" "github.c

    golangでHTTP3を試してみる
  • Golangでいい設計を実践するための6つのツール

    概要 Golangを書くにあたり、いい設計のコードを書くための手助けとなるツールを調べたのでまとめます。 想定読者 Golangの使い方をある程度わかっている(チュートリアルはやった) いい設計をするための具体的なノウハウに興味がある 記事を書いたきっかけ 引用: https://www.amazon.co.jp/dp/B09Y1MWK9N 最近設計に関して勉強するために「良いコード/悪いコードで学ぶ設計入門」を読みました。 の中では マジックナンバーを使うな 一つのメソッドの中で多くのことをやりすぎるな などの言われてみると基的な注意点が書いてありました。 一方で以下のように、確かにそうなんだけど実際は守れていない注意点にも書かれていました。 単一責任の原則を守ってクラス設計しよう 高凝集なクラスを作ろう を読んでわかった気になって今までと同じように悪い設計のコードを書くままではい

    Golangでいい設計を実践するための6つのツール
  • golangで作るTCPIPプロトコル

    はじめに とりあえずIT業界に入ったら読んでおけという名著はいろいろありますが、その中の1冊がマスタリングTCP/IP入門編でしょう。 僕も買ってはいたものの読むのを途中で挫折していたので、今回しっかり読んでTCP/IPを再勉強してみたいと思います。 マスタリングTCP/IPを読みながらその他わからんことはググりつつ、golangでTCPIPプロトコルそのものを自作してみます。 方針は以下のようにします。 ethernetから作る データのやり取りにnetパッケージは一切使わない (訂正、PCのIPやMacアドレスを取るのにだけ使用しますた) データのやり取りに使うのはsyscallのsendtoとrecvfromだけ socketはRAW_SOCKETを使う golangやネットワークについても初心者の駆け出しですので間違えや実装ミス、変なコードがあるかもですが、生暖かい目でよろしゅうお

    golangで作るTCPIPプロトコル
  • Genericsを使いミスを防ぐSQL Builder「GenORM」

    Go 1.18がリリースされましたね。 Go 1.18の新機能の中で最も注目を集めている機能はやはりジェネリクスだと思います。 そのジェネリクスを使用してSQLに関するミスをできる限りコンパイルの段階で防ぐことを目指すSQL Builder「GenORM」を作ったので、この記事ではその紹介をしていきます。 リポジトリ: https://github.com/mazrean/genorm ドキュメント: https://mazrean.github.io/genorm-docs/ja/ コード例 仕組みの説明の前に、GenORMのコード例を見ていただきたいと思います。 今回は以下のようなテーブルを使用します。 CREATE TABLE `users` ( `id` char(36) NOT NULL, `name` varchar(64) NOT NULL, `password` char(

    Genericsを使いミスを防ぐSQL Builder「GenORM」
  • 他言語ユーザがRust言語をガチめに使っての雑感 - 分散KVSを書いてみて - - Qiita

    どうも ryo_grid です。 昨年はRustを覚えたいと思い、題材としてRESTインタフェースを持った分散KVS(実質はいわゆる分散ハッシュテーブル)を書いたりしました。 FunnelKVS: Rust implementation of autonomous distributed key-value store which has REST interfaces この記事では、他言語を使ってきた私が、経験のないRustを用いてそこそこのコード規模・複雑さのシステムソフトウェアを書いてみた上で、Rustについて感じたことを、独断と偏見で述べます。 Rustってなんか流行りそうな雰囲気あるけど難しいとも聞くし、どうなんだろ?と考えている方や、Rustガチ勢の方々に、「初学者はこう感じるんだな」「ここらへんに苦労するんだな」というところを伝えることで、Rustのスムーズな普及に少しでも寄

    他言語ユーザがRust言語をガチめに使っての雑感 - 分散KVSを書いてみて - - Qiita
  • SQLファイルから型安全なコードを生成するsqlc | フューチャー技術ブログ

    TIGの辻です。GoのORマッパー連載8日目です。記事では sqlc を紹介します。早速ですが、結論から行きましょう。 sqlc まとめ SQLファイルからデータベースにアクセスできる型安全なGoのコードを生成するライブラリ 構造体のモデルの手書き実装不要 複数テーブルをJOINしたときのマッパー実装不要 生成されるコードは不要なリフレクションなし SQLをがんがん書きたい、でも面倒なマッパー構造体は書きたくない、という開発者にとっては大きな味方になります。 sqlc の紹介 sqlc はSQLファイルからGoのアプリケーションコードを生成するライブラリです。2020/2に v1.0.0 をリリースし、着々とスターを伸ばしています。2021/08現在は v1.8.0 をリリースしています。資料で生成しているコードも v1.8.0 を用いています。 https://star-histor

    SQLファイルから型安全なコードを生成するsqlc | フューチャー技術ブログ
  • アセンブラをゼロから作って自作コンパイラをアセンブルするまで(日記)

    GNU Assembler互換(サブセット)のアセンブラをGo言語でフルスクラッチで作ってみました。 開発22日目で自作Goコンパイラ(をセルフホストしたときに出力される20万行のアセンブリ)をアセンブルすることに成功しました。 どうやって作ったかというと、小さいコードを GNU Assembler (以下 as) にわせて出力されたバイナリを観察する、を繰り返して中のロジックを推定し再現しました。as の実装は見ていません。(一瞬見たけど巨大すぎて何もわからなかった) アセンブラ自作は、やってみるとコンパイラ自作よりだいぶ簡単でハマりポイントも少ないので、学習テーマとしてはおすすめです。2箇所ほど難所(命令エンコーディングのルールを理解するのと、ジャンプ命令の最適化)がありましたがそれ以外はさくさく楽しく作れました。 作ってみた結果、アセンブリ言語の理解が深まったのはもちろんのこと、E

    アセンブラをゼロから作って自作コンパイラをアセンブルするまで(日記)
  • PostgreSQL と ORM と Logging と

    少し前に PostgreSQL サービスに Go でアクセスする方法についてちょっとした調べものをした。そのときの作業メモをブログ記事として残そうと思ったのだが,単ページで収まりそうになかったので Zenn の体裁で書き記しておく。体裁は「」だが,中身はただの作業記録である。ちゃんとした解説をご所望の方にはあしからずご了承のほどを。 講釈はいいから動くコードをくれ! という方には多少なりと参考になるかもしれない。

    PostgreSQL と ORM と Logging と
  • Goのパッケージドキュメントが便利 - tenntenn.dev

    pkg.go.devへの移行 これまでGoでは標準パッケージのドキュメントはgolang.org/pkgから閲覧できました。また、サードパーティ製のパッケージは、godoc.orgで閲覧できました。Goはソースコードにすべての依存関係をインポートパスとして記述します。そのため、インポートパスさえあれば簡単にパッケージドキュメントが生成でき、https://godoc.org/github.com/tenntenn/greetingのようなURLをブラウザで開くだけで閲覧が可能でした。 godoc.orgの存在によってREADMEにパッケージドキュメントへのリンクを貼るだけで済むようになりました。簡単にドキュメントが生成できるため、ソースコードにドキュメントコメント書く文化の浸透にも寄与したのかなと思います。 Go Modulesが登場し、パッケージを束ね、バージョン管理をする単位としてモジ

  • スレッドセーフなテスト用の時間を固定するライブラリを作った - tenntenn.dev

    はじめに time.Now関数を用いたコードをテストする場合、テスト対象のコードに次のような変更を加える必要があります。 引数に現在時刻を渡す パッケージ変数やフィールドなどに現在時刻を返す関数やインタフェースを設定する context.WithValue関数でコンテキストに現在時刻を設ける どの方法を用いてもプロジェクトの初期から考慮する必要があります。途中で変更するとなると修正が箇所を漏れなく探し出す必要があります。また、パッケージ変数に現在時刻を返す関数を設定した場合、テストを並列に実行することを諦める必要が出てくるでしょう。 このような課題を解決するために、testtimeというライブラリを作成しました。 テストの並列実行と時刻の固定 次のようにパッケージ変数を使ってtime.Now関数のラッパーの挙動を変えてテストする手法があります。 var nowFunc func() tim

  • Goアセンブリの書き方 - Plan 9とGo言語のブログ

    Goアセンブリの書き方からビルド方法までを一通り調べました。Goアセンブリを書いたことのない人がコードを書いてリンクできるところまでは一通り書いているつもりですが、Goアセンブリの言語仕様を網羅してはいないので、興味があれば最後に書いた参考情報も読んでみてください。 この記事ではGo 1.16.xでAMD64命令セットを扱いますが、具体的な命令や値のサイズ以外は、他のアーキテクチャを使う場合でもだいたい同じだと思います。 アセンブリコードの書き方 GoのアセンブリはPlan 9アセンブリを概ね踏襲していて、AT&T記法です。整数を受け取って、それに2を加算した値を返す関数func add2(i int32) int32を書いてみましょう。アセンブリのコードは.sファイルに書きます。また、アセンブリはアーキテクチャに強く依存するので、Goの習慣にしたがってファイル名にはアーキテクチャ名も入れ

    Goアセンブリの書き方 - Plan 9とGo言語のブログ
  • Go コンパイラのコードを読んでみよう - kosui

    はじめに 記事は、 DeNA Advent Calendar 2020 の 11 日目の記事です。 突然ですが、「コンパイラのコードを読んでみよう」なんて言われても、「どうせ巨大で難解で複雑なロジックを理解しないと読めないんでしょ?」と思いませんか。 コンパイラの構造を理解しようとしても聞いたことのないような専門用語がずらりと並び、コードを読もうとしたらそれらをすべて完全に理解してないと一行も理解できないんじゃないか...。Go のコンパイラ gc のソースコードを読むまでは、私もそう思っていました。 しかし、あまりにも暇な休日のある日、思い立って gc のコードを読んでみました。すると、「コンパイル」という難解な響きの処理も、一つひとつを小さなタスクに分解することで、少しずつ読み進めることができると分かったのです! 何よりも感動したことは、 gc そのものが全て Go で書かれていて、

    Go コンパイラのコードを読んでみよう - kosui
  • 実用 Generics: Python の itertools を Go 2 に移植してみた - Zopfcode

    この記事は Go 4 Advent Calendar 2020 1日目の記事です。 激しい議論を呼んだことで有名な Go 2 の type generics は、Go 2 → Go 1 translator である "go2go" を介して既にお試しできる状態になっている。 この記事は、Go 2 における type generics のありようについて述べたり議論したりするものではない。お試しできるようになった今、それがどのような雰囲気で、どのように実用できそうかといった個人的感想を紹介する。どうぞ気軽に読んでほしい。 tl;dr Type generics の使い心地は思ったより良い 各種制限も妥当に設定されているように思える Go 1 に translate されたソースコードの見た目は素朴で直感的 今まで冗長に書かざるを得なかった部分を安全に短くするのに使えそう Python の i

    実用 Generics: Python の itertools を Go 2 に移植してみた - Zopfcode
  • Goの良さをまとめてみた

    よく知られる良さ ネイティブコード出力で実行効率が良い コードの可読性を重視している 開発でよく使うツールがバンドル クロスビルドが簡単にできる コンパイルが遅くない(LLライクにrunできる) 並行処理の抽象化を組み込み言語仕様にもつ メモリ安全である 上記の一部に解説を加えつつあまり言及されない良さを以下にまとめます。 依存解決が最小限で決定的 ここにも書きましたが、Goの依存解決は常に 最小限のダウンロード 最小の範囲でのみビルドを実行 だけが走ります。これを一度体験すると、従来のパッケージ依存管理が冗長で余計なものをビルドしすぎることに気づくでしょう。これらに相当の時間を奪われているのです。 また、Goモジュール機構によりそのバージョン選択は決定的に安定動作するバージョンに決められます。このことのメリットは数ヶ月後のリビルドで安定してビルドできることで実感できるでしょう。 開発環境

    Goの良さをまとめてみた
  • Goのヌル安全について

    「ヌル参照の考案は10億ドル単位の過ち」と語ったホーア氏(Goの並列処理モデルCSPの考案者でもあります)。そしてモダンな言語処理系は「ヌル安全」を持つのが流行です。しかし、Goには完全な「ヌル安全」の仕組みを持ちません。 Goのメモリ安全機能 もちろんGoは完全なヌル安全とは言えないまでもヌルポ参照対策や不正なメモリ参照を防ぐいくつか考慮した仕組みや慣習を持っています。 ポインタの算術移動を許さない言語仕様 確保するメモリは全てゼロ値で初期化済み エラーがnilなら有効な値を返すという慣習 必須のエラーチェックがヌルチェックを兼ねている これらによりGoは完全に「メモリ安全」であり、「ヌル安全まであと一歩」までの仕組みを持っています。それでもヌルポ参照は「ランタイムパニック」という形で現れます。 ランタイムパニック Goでは「ランタイムパニック=コードの不備の通知」です。 多くのコードの

    Goのヌル安全について
  • Goが未使用のパッケージインポートをエラーとする理由

    Goが未使用のパッケージインポートの記述をエラーにするという挙動は多くの非難を浴びました。 「コンパイルエラーでなく警告にすべき」 または 「コンパイルオプションで選べる様にして欲しい」 というような意見はたくさん寄せられましたがGo開発コアメンバーはこれらの要望に応えることはありませんでした。その理由を解説します。 Goの依存解決のアプローチ Goの依存ツリーはコードの中に記述します。これはメジャーなパッケージマネージャとは異なる手法です。 多くの処理系では依存解決に必要な情報を言語仕様には含めず、別途ファイルに依存情報を列挙して記述しておき、それらの情報を辿ることで依存ツリーを構築しそのツリーに基づいて依存を解決するというアプローチを採用しているものがほとんどです。 Goは依存解決に必要な情報をコードの中に記述するというレアなアプローチを採りました。 ESモジュールのアイディアに近い考

    Goが未使用のパッケージインポートをエラーとする理由
  • Go Tips連載4: GoDocの読み方 | フューチャー技術ブログ

    今回は、GoDocについて取り上げます。 長いので3行にまとめると GoDocのリファレンスはライブラリにとっては一次情報だが、使い方などはリポジトリのREADMEに書かれることも多い 構造体やインタフェースは、リファレンスだけを見ても使い方がわからないこともあるので、分からないからといって落ち込まないでください サンプルコードも合わせて確認して使い方を確認すると良いです GoDocGoDocは標準ライブラリや、他のサードパティ製ライブラリのドキュメントをホストしているウェブサイトになります。チュートリアルなどは一度クリアしたら見返すこともあまりないでしょうけども、GoDocはGoで開発している限り、ずっと参照し続けることになります。GoDocの読み方を知っておくことは、Go力をあげるには必須なスキルだと思います。 GoDocのURLは以下の通りの場所 https://pkg.go.dev

    Go Tips連載4: GoDocの読み方 | フューチャー技術ブログ
  • sync.Cond/コンディション変数についての解説

    sync.Cond(コンディション変数)について、Goをよく使ってる人たちですら「うまく説明できん」という話がmercarigoで出てたので、あとで誰かの役に立てばよいな、という気持ちで新たな解説記事を書いてみたいと思います。 自分はPerl5をバリバリ書いていた時代ではAE::Cond、Goを使うようになってからはsync.Condと、とにかく非同期処理でピタゴラ装置を作らないといけない時はこの仕組みがあったことでロジックを無駄に小難しくしないで実装することができたので、この仕組みは是非広く知られて欲しいのです。 というわけでまたあらたにGoのsync.Condを解説してみます。 なお、Web+DB Press vol 113の私の連載、「Goにいりては…」でもこの話を書いていますが、あちらの記事では Broadcast を使った方法ではなく、 Signal を使った方法について書いてあ

    sync.Cond/コンディション変数についての解説
  • Go プログラミング言語仕様

    Go プログラミング言語仕様 文書は,The Go Programming Language Specification version 2021/02/10 のなんちゃって日語訳である. 原文ソース:https://github.com/golang/go/blob/master/doc/go_spec.html 訳文ソース:https://github.com/hiwane/gospec-ja.誤訳・誤字脱字などは issue かプルリクで https://hiwane.github.io/gospec-ja/ 訳注 valid/invalid は有効/無効, legal/illegal は正当/不当と訳す. letter と character を区別するため,letter は英字,character は文字と訳す. signed/unsigned 符号付き,符号なし sourc