タグ

goに関するfbisのブックマーク (110)

  • Goのerrorがスタックトレースを含まない理由 - methaneのブログ

    Twitterでこんな記事を見かけたので。 zenn.dev ジェネリクスの件もそうですが、Goの言語設計は現実主義なのになにか特別なポリシーによるものだと宗教化されてしまって、ファンには勝手に崇拝されてアンチにはディスられがちだなーと感じます。 Goのエラー処理を改善する実験プロジェクトxerrorsがGo体のerrorsにマージされた時、 errors.New() はスタックトレースを取得していました。しかしGo 1.13がリリースされる前に削除されました。 削除された理由の1つは、今までの errors.New() のパフォーマンスに依存していたコードの速度が低下しアロケーションが増えることです。 github.com しかし、これが理由だと今まで思ってたのですが、実際にはもう1つより重要な理由がありました。エラーのフォーマットです。エラーに複数のフォーマットを持たせようという提案

    Goのerrorがスタックトレースを含まない理由 - methaneのブログ
    fbis
    fbis 2024/04/03
  • 【Go】新しいORM「Bun」を使ってみる(MySQL)

    はじめに Goの新しいORMを見かけたので、使ってみました。 今回はCRUDだけです。 「Bun」とは Bunは、Go用のSQLファーストのデータベースクライアントです。SQLファーストとは、ほとんどのSQLクエリを自動的にBun式にコンパイルでき、Bun式はSQLクエリのように見えることを意味します。 Bunの目的は、古き良きSQLを使用してクエリを記述できるようにし、結果を一般的なGo型(構造体、マップ、スライス、スカラー)にスキャンできるようにすることです。 らしいです。 ※公式より引用 GORMよりも早いみたいです。 Bunの良いところは公式にPlayGroundがあり、そこにSQL文を貼り付けると自動的にBunのコードに変換してくれるところが素晴らしい!(ただし取得のみ) サブクエリとかJoinしまくりの複雑な取得も一発で解決します!!(これは当に凄い!) 環境 go 1.17

    【Go】新しいORM「Bun」を使ってみる(MySQL)
    fbis
    fbis 2023/12/12
  • Gormにおける「仕様通り」なSQLインジェクションの恐れのある実装についての注意喚起 - ANDPAD Tech Blog

    ANDPADボードチームの原田(tomtwinkle)です。 Node.jsの mysqljs/mysql の仕様に起因するSQLインジェクションが話題に上がっていたので、それGolangORMであるGormでも同じような「仕様」があるよ! という注意喚起の意味も込めて筆を執りました。 ※ 2022/02/21追記 コードレビューを自動化して指摘してもらう記事を公開しました! tech.andpad.co.jp Node.jsのMySQLパッケージにおけるエスケープ処理だけでは防げない「隠れた」SQLインジェクション | 株式会社Flatt Security TL;DR GormのQuery Conditions関数に関する危険な仕様 対策 締め TL;DR GormのConditions関数(Find, First, Delete...)を使用する際、第2引数の値にStringを引き渡

    Gormにおける「仕様通り」なSQLインジェクションの恐れのある実装についての注意喚起 - ANDPAD Tech Blog
    fbis
    fbis 2023/10/27
  • Goのテーブル駆動テストではテストケースの定義位置を知りたいのでライブラリを書いた - 詩と創作・思索のひろば

    Go言語でテストを書く際のベストプラクティスとして、テーブル駆動テスト(Table dirven tests) というのが推奨されている。ようはデータとふるまいを分離しましょうという話で、正直わざわざ名前をつけるようなものでもなかろうという気持ちもないではないが、まあ話がはやくていいね。 けどみんなほんとにこれで満足してるの? と疑問に思うところはある。テストが落ちたときに表示される行番号がテストケースによらず一定で、どのテストが落ちたのかを探すのに一手間かかってしまう。 たとえば以下のコードをテストする際、 package eg import "testing" func TestExample(t *testing.T) { testcases := []struct { name string a, b int sum int }{ {"1+1", 1, 1, 99}, {"2+2"

    Goのテーブル駆動テストではテストケースの定義位置を知りたいのでライブラリを書いた - 詩と創作・思索のひろば
    fbis
    fbis 2023/10/12
  • Goで非推奨(Deprecated)や撤回(Retracted)を明示する方法 - Plan 9とGo言語のブログ

    最近のGoには、関数やパッケージを非推奨と扱う方法があります。まとまっていると便利かなと思うので、種類ごとにまとめてみました。GoDocコメントを多用するので、GoDocを書き慣れていない場合は以下も参考にしてください。 blog.lufia.org 関数と型を非推奨にする 関数コメントに、// Deprecated: ではじまる段落を追加します。 // Parse parses a string of the form <status>=<status>. // // Deprecated: Use ParseStatusMap instead. func Parse(src string) (map[Status]Status, error) { ... } 型の場合も同様に。 // Error is the interface that wraps Error method. //

    Goで非推奨(Deprecated)や撤回(Retracted)を明示する方法 - Plan 9とGo言語のブログ
    fbis
    fbis 2023/10/12
  • GoでSQLの複雑なクエリのテストを書いてみた - ZOZO TECH BLOG

    はじめに こんにちは。ブランドソリューション開発部FAANSバックエンドブロックの佐野です。普段はサーバーサイドエンジニアとして、FAANSのバックエンドシステムを開発しています。 FAANSとは、弊社が2022年8月に正式ローンチした、アパレル店舗で働くショップスタッフの販売サポートツールです。例えば、コーディネート投稿機能や成果確認機能などを備えています。投稿されたコーディネートはZOZOTOWNやWEAR、Yahoo!ショッピング、ブランド様のECサイトへの連携が可能です。成果確認機能では、投稿されたコーディネート経由のEC売上やコーディネート閲覧数などの成果を可視化しています。 記事では、成果データの集計処理におけるBigQueryのクエリ実行処理のユニットテストをGoで実装した取り組みと、その際の工夫についてご紹介します。 目次 はじめに 目次 成果データの集計処理とは 抱え

    GoでSQLの複雑なクエリのテストを書いてみた - ZOZO TECH BLOG
    fbis
    fbis 2023/10/10
  • History of applied migrations · Issue #179 · golang-migrate/migrate

    fbis
    fbis 2023/10/06
  • [Go] 埋め込みフィールドを使ったラッパー構造体定義 - My External Storage

    Goである構造体(例:サードパーティのクライアント)のラッパーを書くときは埋込みフィールドを使うといいよという話。 TL;DR 埋め込みフィールド(embedded field)を使うとラッパー構造体を簡単に実装できる https://golang.org/ref/spec#Struct_types インターフェイスを使った埋め込みフィールドも定義可能 https://play.golang.org/p/FWiWDdozeIl 初期化を忘れると初期化関数を作っておく https://golang.org/doc/effective_go.html#composite_literals ある構造体をラップしたい デコレータパターンのようにある構造体のラッパーを作りたいときがある。 たとえばサードパーティのクライアントをラップして一部のメソッドの動きだけ少し変えたいときだ。 今回は次のような構

    [Go] 埋め込みフィールドを使ったラッパー構造体定義 - My External Storage
    fbis
    fbis 2023/09/11
    ポインタ構造体埋め込み
  • なぜ Go ではロガーをコンストラクタ DI してはならないのか

    問題のある実装パターン 共通実装 以下のような applog パッケージ上のロガー実装を考えましょう。ここでは Go 標準の log.Logger をラップしていますが,様々な実装に拡張できることを想定しています。 package applog import ( "fmt" "log" "os" ) type Logger interface { Info(message string) Error(message string) } func NewLogger() Logger { return &logger{ inner: log.New(os.Stdout, "", log.LstdFlags), } } var _ Logger = (*logger)(nil) type logger struct { inner *log.Logger } func (l *logger)

    なぜ Go ではロガーをコンストラクタ DI してはならないのか
    fbis
    fbis 2023/09/07
  • 【Go言語】クリーンアーキテクチャで作るREST API – 株式会社ライトコード

    参考:https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html クリーンアーキテクチャで調べるとよく出てくる例の円ですね。 ざっくり説明すると、円の中の各項目は矢印の向き(内側)に依存(参照)するようにして、特定の項目の仕様変更が他の項目に影響を及ぼさないようにしています。 それによってそれぞれが外部の項目を気にすることなくテストできたり、仕様変更の影響範囲が少なくなったりといった利点があります。 実装:クリーンアーキテクチャ化では早速、クリーンアーキテクチャ化を進めていきましょう! Entities外側は内側の参照を持つため、内側から順に実装していきます。

    【Go言語】クリーンアーキテクチャで作るREST API – 株式会社ライトコード
    fbis
    fbis 2023/09/06
  • Go言語のmapをrangeでループすると、取り出す順番はランダムになる

    なぜ順番がランダムになるのか 古い言語仕様では、マップの反復順序が定義しておらず、ハードウェアプラットフォーム間で実行順が異なっていた。 反復順序に依存すると移植性がなくなるため、ランダム性を持たせている。 というのがこの挙動の理由みたいです。 順番を固定したい場合 mapのキーをsliceに入れて、それを基準にループする、といった実装をすればmapの順序を固定することができます。 package main import ( "fmt" "sort" ) func main() { m := map[int]string{ 1: "value1", 2: "value2", 3: "value3", } var keys []int for k := range m { keys = append(keys, k) } sort.Ints(keys) for _, k := range k

    Go言語のmapをrangeでループすると、取り出す順番はランダムになる
    fbis
    fbis 2023/09/04
  • Go http.RoundTripper 実装ガイド - Qiita

    こんにちわ、ワカルのアドベントカレンダー2日目を担当する包です。 最近はGoばかり書いているので、Goネタです。 外部への http アクセスをする時に構造を理解しておくと便利な、http.RoundTripper について書きます。 http.RoundTripper とは Go で、外部にhttpアクセスするときには、 net/http パッケージにある、 http.Client を使います。 また、いろいろなAPIのクライアントライブラリの中でも殆どの場合 http.Client が使われていて、定義は以下のようになっています。(一部コメント省略) type Client struct { // Transport specifies the mechanism by which individual // HTTP requests are made. // If nil, Def

    Go http.RoundTripper 実装ガイド - Qiita
    fbis
    fbis 2023/08/31
  • styleguide

    Go Style Decisions https://google.github.io/styleguide/go/decisions Overview | Guide | Decisions | Best practices Note: This is part of a series of documents that outline Go Style at Google. This document is normative but not canonical, and is subordinate to the core style guide. See the overview for more information. About This document contains style decisions intended to unify and provide stand

    fbis
    fbis 2023/08/25
  • google/wireを使ってGoでDI(dependency injection)してみる | ビジネスとIT活用に役立つ情報(株式会社アーティス)

    フローを把握する wireを使ってのDIは、以下のフローになります。 「DIしたい対象を生成する関数」を生成する関数を定義する wireコマンドで、上記のファイルから「DIしたい対象を生成する関数」をジェネレートする その関数を利用する 他の言語のDIコンテナと比べると、すこしフローが違うので最初は戸惑うかもしれません。 DIコンテナ(とその設定)を、メタ的に自動生成するイメージに近いかと思います。 チュートリアルで動きを確認する こちらの公式のチュートリアルを動かしながら動作を確認していきます。 https://github.com/google/wire/blob/master/_tutorial/README.md まずは、手動でDIするコードで動きを理解しておきます。(予習は大事です) main.go を作りその中に以下のコードを書き込みます。 package main impor

    google/wireを使ってGoでDI(dependency injection)してみる | ビジネスとIT活用に役立つ情報(株式会社アーティス)
    fbis
    fbis 2023/08/23
  • GoのDIツールwireで知っておくと良いこと - Carpe Diem

    概要 christina04.hatenablog.com こういった設計のようにレイヤ間の依存関係を抽象化していると、DIの初期化処理が段々冗長になっていきます。 google/wireはそういったDIの初期化を自動的にやってくれるコード生成ツールです。 今回はwireを使う上で知っていると便利なところをまとめます。 環境 golang 1.13.5 wire 0.4.0 wireの使い方知らない人 以下のチュートリアルが非常に分かりやすいので一度やってみてください。 github.com 実務で知っておくと良いポイント Injectorの用意の手順 小さい依存関係であれば頭の中で把握できてサクッとかけますが、巨大なリポジトリになってくると何が何に依存しているか分からなくなってきます。 そういった場合まず最終的に用意するInjectorを生成するProviderだけwire.Build

    GoのDIツールwireで知っておくと良いこと - Carpe Diem
    fbis
    fbis 2023/08/23
  • データベースへの接続を伴うGoの並列テスト | Money Forward Kessai TECH BLOG

    こんにちは、MF KESSAIでバックエンドのエンジニアのgarsueです。 2019年もあっという間すぎて戦慄しています。 今回はMF KESSAIでのGoのテストについて、ちょっと工夫してる点を書いてみようと思います。 並列テストによる問題 Go標準のテスト実行コマンドgo testはデフォルトでパッケージごとにテストを並列実行します。 通常は何もしなくてもテストが並列実行されてうれしいのですが、たまに困るケースがあります。 ファイルやDBなどの外部のリソースを触るテストが並列実行されて競合してしまうケースです。 MF KESSAIでは、テスト用のMySQLに接続して実際に読み書きを行うテストを多数書いています。 それらが並列実行されることで、各テストのテストデータ同士が競合してしまうという問題がありました。 開発初期はとりあえずgo test -p 1として並列実行を諦め、問題を回避

    データベースへの接続を伴うGoの並列テスト | Money Forward Kessai TECH BLOG
    fbis
    fbis 2023/08/22
  • Go1.21 New Features

    Go1.21 が 2023年8月9日(JST) にリリースされ、そのリリースノートやブログが公開されています。この記事では前回の Go1.20 New Features に引き続き、Go1.21 の新機能の中から気になった機能を解説していきます。 spec Go1.20 までは、メジャーリリースの一番最初のバージョンの末尾にパッチバージョンが付いておらず、次のバージョンからはパッチバージョンが付くようになっていました。 例えば Go1.20 の最初のバージョンは go1.20 で、次のバージョンからは go1.20.1, go1.20.2, ... のようにパッチバージョンがついていました。 Go1.21 からは、一番最初のバージョンが go1.21.0 のようにパッチバージョンの .0 が付くようになります。 import している package を初期化する順序が Spec に明記さ

    Go1.21 New Features
    fbis
    fbis 2023/08/17
  • GitHub - samber/lo: 💥 A Lodash-style Go library based on Go 1.18+ Generics (map, filter, contains, find...)

    ✨ samber/lo is a Lodash-style Go library based on Go 1.18+ Generics. This project started as an experiment with the new generics implementation. It may look like Lodash in some aspects. I used to code with the fantastic "go-funk" package, but "go-funk" uses reflection and therefore is not typesafe. As expected, benchmarks demonstrate that generics are much faster than implementations based on the

    GitHub - samber/lo: 💥 A Lodash-style Go library based on Go 1.18+ Generics (map, filter, contains, find...)
  • Go言語でパス情報から拡張子なしのファイル名を取り出したい - Qiita

    パス情報から拡張子を除去したファイル名を取り出したい! 具体的に言うと以下のようなケースです。 /path/to/file.name.hoge.name から file.name.hoge だけ抜き出したい こういう場面に遭遇したのですが、ピタリとはまる例を見つけられなかったので書いてみました٩( 'ω' )و ※ mattnさんにコメントでいただいた処理で修正しました! package main import ( "fmt" "path/filepath" ) func main() { paths := []string{ filepath.Join("path", "to", "file.name.hoge.name"), filepath.Join("path", "to", "file.name"), filepath.Join("path", "to", "file"), }

    Go言語でパス情報から拡張子なしのファイル名を取り出したい - Qiita
    fbis
    fbis 2023/08/10
  • 【Go】DDD + レイヤードアーキテクチャでREST APIを実装する | みんたく

    Go + DDD + レイヤードアーキテクチャをやネットで調べ、実際に動かしながらREST APIを構築してみました。 ドメイン駆動設計のや記事を読んでも実際に自分の手でやってみないと身につかないと思い、簡易的ですが使えるところまで実装してみました。 DDD(domain driven design)とはDDD(ドメイン駆動設計)とはソフトウェアの設計手法であり、ドメインモデリングに着目してソフトウェアの価値を高める手法です。 ソフトウェアの核心にある複雑さに立ち向かうため、チームの共通言語である「ユビキタス言語」を用いて「ドメインモデル」を構築し、それをコードとして実装します。 また、大規模で密結合なシステムにならないように「ドメイン」と「境界づけられたコンテキスト」にシステムを分割し、「コアドメイン」という最重要領域に集中して開発を行います。 DDDについてはまだ理解が浅いので、今

    【Go】DDD + レイヤードアーキテクチャでREST APIを実装する | みんたく