タグ

golangに関するyuzu441のブックマーク (57)

  • Go Command Line Tool Packagesをざっと試す

    Go言語でコマンドラインツールを作ろうと思いましたが、サブコマンドが必要になりそうだったので調べました。 書きやすいものを探したいので次のコマンドを作るという前提で比較していきます。 ./cmd foo -name=foo args ./cmd bar -name=bar args 対象は標準パッケージと、みんなのGo言語にピックアップされている3rd packageも試してみます。 flag (標準) 大変わかりやすかったので、Go by Example: Command-Line Subcommandsをベースに簡略化して考えたいと思います。 package main import ( "flag" "fmt" "os" ) func main() { fooCmd := flag.NewFlagSet("foo", flag.ExitOnError) fooName := fooCm

  • Go 言語でスライスから要素を消すには

    の様に直感的な操作ができるはずです。しかし Go 言語の場合、スライスの伸長にて発生するメモリアロケーションを append 関数と代入を使う事で透過的に行える仕組みを採用しています。例えばスライスの伸長は この様に行います。C言語をかじった事のある方や、プログラミング言語の内部データ構造をご存じの方であれば、リストといった物が伸長の度にメモリを再確保する様な事をやっていない事はご存じだと思います。Go 言語のスライスも同様で、スライスには長さとキャパシティを持っており、キャパシティを超えない範囲で長さだけが増えていき、キャパシティを超えるとメモリが再確保されるという作りになっています。ですので、上記のコードであれば、スライス(実際は SliceHeader)が内部で持っているポインタ、長さ、キャパシティを、代入してやる事で上書きしています。 スライスから要素を消す スライスの伸長と同様に

    Go 言語でスライスから要素を消すには
  • Voicyのバックエンドを支えるGoのアーキテクチャを全公開

    こんにちは!! 最近はGogRPCKubernetesばかり触っている、フロントエンドエンジニアのぱんでぃーです!! このエントリーでは、以前の記事で紹介したバックエンドの中核を担うGoの汎用APIサーバーのアーキテクチャを公開したいと思います! MySQLやElasticsearchなどのミドルウェアと直接やり取りを行うのはモノリシックな共通APIのみ。

    Voicyのバックエンドを支えるGoのアーキテクチャを全公開
  • Go言語の記述の迷いどころについて

    この記事はGoのコードをいくらか書いていてもっとGoらしい書き方に興味を持ってからみてね!(Go初見で読んでも響かない内容です) Goは「シンプルで迷いなく書ける」というのが売りではあるのですが、 実際書き始めると、「あれ?これどうやって書くほうがいいの?」ってポイントにちょくちょく巡り合います。そのようなポイントを思い出しながら今思うベターな書き方を紹介しようと思う。 err変数束縛について err変数の受け取りを複数回繰り返していると「:=」だけで書けないという状況に出会うでしょう。 err := funcA() if err != nil { ... } err := funcB() // <- コンパイルエラー: "no new variables on left side of :=" if err != nil { ... }

    Go言語の記述の迷いどころについて
  • 【改訂版】文字列連結はどれが速い?

    今回も小ネタでお送りしております。 2015年に「文字列連結はどれが速い?」という記事を書いた。 あれから文字連結に関してどう変わったのか。 特に Go 1.10 で strings.Builder が追加されているので,その辺も含めて再検証してみる。 今回検証するコードは以下の通り。 package join import ( "bytes" "strings" ) var sz8k = 8 * 1024 func JoinStringPlus(ss []string) { var str string for _, s := range ss { str += s + "\n" } } func JoinStringJoin(ss []string) { strings.Join(ss, "\n") } func JoinStringByteAppend(ss []string) {

    【改訂版】文字列連結はどれが速い?
  • あなたのGoアプリ/ライブラリのパッケージ構成もっとシンプルでよくない? | フューチャー技術ブログ

    2023.10.5追記: Goチームからプロジェクトの目的に応じたディレクトリ構造についてのドキュメントが公式に公開されています。 https://go.dev/doc/modules/layout Goプロジェクトのフォルダ構成どうしよう、とググると見つかるStandard Go Project Layout。とはいえ、これはかなりコード量を増やしてしまう恐れがありますので、導入する場合のデメリットも考えておく方が良いです。 特に、プログラマーは、最初にみたプログラミング言語のフォルダ構成を親だと思う特性があり、Javaや.NETに影響されるとかなり細かくフォルダを切りたくなったり、package privateなど細かく可視性を制御しようとしたりして、なおかつ「privateのテストってどうすべきなんですか?」とか議論を始めたりもしますが、Go先生によればこれぐらいは1パッケージにフ

    あなたのGoアプリ/ライブラリのパッケージ構成もっとシンプルでよくない? | フューチャー技術ブログ
  • Gormが本番テーブルの数億件のデータを消そうとした話 - keroxpのScrapbox

    MySQLの場合、--safe-updatesオプションを利用することでこういった不慮のUPDATE/DELETEを防げるようです

    Gormが本番テーブルの数億件のデータを消そうとした話 - keroxpのScrapbox
  • GoのDBライブラリと俺たち、それからsqlla - KAYAC engineers' blog

    年末ですね。カヤックでは360度評価の時期でもあるので、みんな振り返りだとか内省などの言葉がいたるところで飛んでいます。この記事でも今年の出来事を振り返りしてみたいと思います。どうも、ソーシャルゲーム事業部ゲーム技研の谷脇です。 この記事はTech KAYAC Advent Calendar 2019 Migration Trackの20日目の記事です。19日目はAWS Lambda Node.js runtime の EoL に疲れたので Go にしていっている話でした。 この記事のあらまし あるWebサービスを作るプロジェクトORMを切り替えた 開発言語はGo言語 DBライブラリ/ORMgithub.com/xo/xoを使っていました ですが開発途中から、私が作成したライブラリであるgithub.com/mackee/go-sqllaに乗り換えました どっちもコード生成系だけれど、

    GoのDBライブラリと俺たち、それからsqlla - KAYAC engineers' blog
  • Goモジュールでツールもバージョン管理する - Plan 9とGo言語のブログ

    Goモジュール管理下では、プロジェクトで使うGo製ツールのバージョンも管理できます。今までの経験では、ツールのバージョンが上がって困ることは記憶にないですが、とはいえ2018年5月ごろにprotoc-gen-goが大きめの変更を入れたこともあるので、バージョン管理しておいて損はないでしょう。このハックは、割とGoモジュール初期からあったようですが、最近使ったので書きました。 Go 1.11 Modules - How can I track tool dependencies for a module? Go modules by example - Tools as dependencies 使い方 ツールを追加する Go 1.13時点では、モジュール管理しているリポジトリでgoimportsなどのツールをgo getすると、go.modが書き換えられて管理対象に入ります*1が、恒久的に

    Goモジュールでツールもバージョン管理する - Plan 9とGo言語のブログ
  • Goのパッケージ構成の失敗遍歴と現状確認

    この記事は Gunosy Advent Calendar 2017の5日目の記事です。前回の記事はGunosyのパーソナライズを支える技術 -ワークフロー編-でした。 GoAPIを書くときの問題僕の在籍するGunosyはGoを昔(?)から番採用しておりまして、ノウハウも潤沢に溜まっている企業だと言えます。 しかし、contextの扱いやベストなパッケージ構成、テスト、net/httpでAPIを書くノウハウなどなど、迷うことは多々あります。 これは弊社特有の事情ではなく、Goのサーバーサイドエンジニア全員にとっての問題です。中でも、パッケージ構成をどうすればいいのか(相互参照せずに快適に開発を進められるパッケージ構成とは)を見つけるのは結構難しく、各々のチームにお任せ、という状況です。 今回は上記の問題のうち、パッケージ構成に踏みこんで見たいとおもいます。会社でもよくパッケージ構成をどう

    Goのパッケージ構成の失敗遍歴と現状確認
  • Big Sky :: Go で型がインタフェースを実装している事を保証するには

    « C++ な WebServer 実装 crow と TensorFlow Lite を使って Object Detection の API サーバを書いた。 | Main | Go で大文字小文字無視の文字列比較ベンチマーク » Go は Ducktype をサポートしたプログラミング言語です。interface で宣言されたメソッドを型に強制したり問い合わせたり出来ます。メソッドの実装を保証する為に以下の様に struct に interface を embedded する事も出来ます。 package main type I interface { doSomething() } type foo struct { I } func (f *foo) doSomething() { } func callSomething(i I) { i.doSomething() } func

    Big Sky :: Go で型がインタフェースを実装している事を保証するには
  • 最近のGo Modulesプラクティス ~ ghqユーザーの場合も添えて | おそらくはそれさえも平凡な日々

    最近Go Modulesを使っていて、だいたいプラクティスが定まってきたのでまとめてみる。 個人的な結論 Go Modulesは積極的に使っていけばいい 幾つか課題はある $GOPATH から出る必要もない $GO111MODULE を適宜設定すればよい どうせ次のGo 1.13からはどこに置こうが関係なくなる 2つのモード $GOPATH/src にプロジェクトを置いていると、今(Go 1.12)の標準動作はGOPATHモードになる。これは、$GOPATH/src 以下からサードパーティパッケージを読み込むこれまでのGoと同様の動作になるということ。 それ以外の場所では go mod コマンドを使ってGo Modulesを利用することができる。これをmodule-awareモードという。go.mod と go.sum を使って依存ライブラリを管理する方式になる。これらのファイルはgo m

    最近のGo Modulesプラクティス ~ ghqユーザーの場合も添えて | おそらくはそれさえも平凡な日々
  • Goでオブジェクト生成の返り値にinterfaceを使うとnil Pointer Receiverができないという話 - Qiita

    package main import ( "fmt" "reflect" ) type Fooer interface { Foo() } type Fooo struct{} func (f *Fooo) Foo() { if f == nil { fmt.Println("nil!!") } else { fmt.Println("not nil!!") } } func newFooer() Fooer { return &Fooo{} } func bar(f Fooer) { f.Foo() } func main() { // 型を代入したあとnilを入れても型情報は消えない z := &Fooo{} fmt.Println(reflect.TypeOf(z)) // *main.Fooo z = nil fmt.Println(reflect.TypeOf(z)) // *

    Goでオブジェクト生成の返り値にinterfaceを使うとnil Pointer Receiverができないという話 - Qiita
  • AWS Lambda Node.js runtime の EoL に疲れたので Go にしていっている話 - KAYAC engineers' blog

    SREチームの藤原です。Tech Kayac Advent Calendar Migration Track 19日目の記事です。いよいよ年も押し詰まってきましたね…! AWS Lambda、使ってますか?最近はサーバーレスという文脈で取り上げられることも多い Lambda ですが、カヤックではそこまでサーバーレスにこだわることはせず、主にイベントドリブンな処理に適切なユースケースに使用しています。 Lambda のリリース当初に用意されていたランタイムは Node.js のみでした。カヤックで最近使うことが多い言語である Go, Ruby のランタイムがサポートされたのが比較的最近だったということもあり、Node.js の Lambda function が比較的多く存在している状況でした。 Node.js EoL (End of Life) ところで、技術基盤チームのリポジトリで「La

    AWS Lambda Node.js runtime の EoL に疲れたので Go にしていっている話 - KAYAC engineers' blog
  • Go初心者が気を付けること

    Go初心者がやってしまいがちなやらない方がいいことを書き出してみました。 情報検索や環境構築 golang.jpを見に行ってしまう Golang(ごーらんぐ)と呼んでしまう(by hogedigo) depが最新推奨のパッケージマネージャだと勘違いする(Go標準の「go mod」を使おう) 「GO???」環境変数を理解せずに設定しまくる(わからない場合は一切設定しないのが正しい) しょっぱなからgvm,gobrew,goenvなどのマルチバージョンのマネージャを入れようとしてエディタ連携環境構築に失敗する (複数バージョンのGoの運用は既に標準のGoだけでできるようになっている) エディタにgoimportsやgolintを設定し忘れる OSのパッケージマネージャまかせで古いGoやgccgoをインストールしてしまう エラーハンドリング周り err変数名のバリエーションを増やしすぎる(ほとん

  • Go の命名規則 | micnncim

    記事は Go Advent Calendar 2019 11 日目の記事です。 Go はシンプルな言語機能・シンタックスが特徴であり、命名規則にもそのシンプルさが表れています。 記事では、公式や著名な Go エンジニア、OSS などから見られる Go らしい命名規則を紹介します。 今更なテーマかもしれませんが、意外にも公私共々で命名規則が意識されていないコードを時折見かけるので、自戒も込めて記します。 誤った内容があれば Twitter でご指摘いただければと思います。 パッケージ名簡潔にするEffective Go では、short, concise, evocative なパッケージ名が望ましいとされます。 これはパッケージ名に限らずほとんどあらゆる命名において役立つ指針だと思います。 また、「パッケージ名は一言で何をするかを表すエレベーターピッチだ」という Dave Cheney

    Go の命名規則 | micnncim
  • Go言語らしいLoggingについて - Qiita

    Go言語でlogを扱う場合、サードパーティのロギングライブラリを使う人は少なくないと思います。 理由としては標準のlogパッケージの機能の貧弱さ、特にレベルが無いというのが多いと思います。 しかしGo言語原理主義的にはやっぱり標準を使いたいですよね。 安心してください、標準logパッケージにはレベルがありませんがレベルについて考慮していないというわけではありません。 ロギングパッケージとしての役割が他の言語でも見られる通常のログライブラリと異なるだけです。 ログレベルについてですが そもそもログレベルは基的に統一されていません、DebugLevelがなかったりWarningLevelがなかったり文字列で表現したり色々あると思います。 統一されていないのが問題なのでなく、プログラムの対象によって必要なログの機能というのは異なるのは当然なので 来必要なレベルは自分で宣言できるべきです。 例

    Go言語らしいLoggingについて - 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
  • Go 1.13 と 1.14 (Go 2 へ向けて)

    8月に正式リリースされる Go 1.13 の主な機能 Go 1.13 のベータ版が登場したようだ。 リリースノートも併せて公開されている。 Go 1.13 Beta 1 is released - Google Group Go 1.13 Release Notes - The Go Programming Language Go 1.13 では数値のリテラル表現(2進数表現や浮動小数点数の16進数表現)など色々と重要な機能追加があるが,主なものは以下の通り。 errors パッケージへの機能追加 以前に紹介した golang.org/x/xerrors の機能が正式に errors パッケージに組み込まれるようだ。 階層化 Error パッケージ “xerrors” を試してみる golang.org/x/xerrors の機能をほぼ踏襲しているみたいなので,既に golang.org/

    Go 1.13 と 1.14 (Go 2 へ向けて)
  • [Go] レイヤードアーキテクチャの階層構造を守らないimportを警告するlinterを作った - My External Storage

    Goでクリーンアーキテクチャ等のレイヤードアーキテクチャを実装するための静的解析ツールを作った。 「webhandlerパッケージからusecaseパッケージを使わずに直接domainパッケージを使わないで!」というような、やってほしくないimportをエラーにできる。 https://github.com/budougumi0617/layer TL;DR クリーンアーキテクチャなどのレイヤードアーキテクチャでは、利用できるパッケージに制限がある レイヤー間の依存関係は一方向のみ 同じ層、あるいは1つ下の層のパッケージしか利用してはいけない https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html Goは循環importができないので、自然に単方向依存は満たしやすい しかし、層を飛び越して、2

    [Go] レイヤードアーキテクチャの階層構造を守らないimportを警告するlinterを作った - My External Storage