タグ

ブックマーク / mattn.kaoriya.net (16)

  • Big Sky :: errors.Join が入った。

    errors, fmt: add support for wrapping multiple errors · golang/go@4a0a2b3 · GitHub An error which implements an "Unwrap() []error" method wraps all the non-nil errors in the returned ... https://github.com/golang/go/commit/4a0a2b33dfa3c99250efa222439f2c27d6780e4a Go でエラーを扱う際に、複数のエラーを束ねたい事があります。例えば複数のタスクを実行し、1つでもエラーになれば中断するのではなく、一通りタスクを実施し終えた結果を返したい様なニーズです。 package main import ( "errors" "log" "os"

    Big Sky :: errors.Join が入った。
  • Big Sky :: Go の struct は小さくできる(fieldalignment のススメ)

    動的型付けプログラミング言語や、class を持つようなプログラミング言語を使う場合、そのフィールドメンバの定義順などを意識する事は少ないかもしれません。 Go は struct という、C言語が持っている構造体と同じ様にメモリ配置され、構造体そのものをレシーバとして、メソッドを定義しつつプログラミングを行います。struct はデータ構造そのものを示し、それが大きくなるにつれ、当然ながらメモリ使用量も多くなります。 さて、例えば以下のコードを実行すると、struct 100 個分のサイズは幾らになるでしょうか。 package main import ( "fmt" "unsafe" ) type Account struct { TimeZone struct { Name       string `json:"name"` UtcOffset  int    `json:"utc_

    Big Sky :: Go の struct は小さくできる(fieldalignment のススメ)
  • Big Sky :: Go の http パッケージに MaxBytesHandler が入った。

    « text/template と html/template に continue/break が入った。 | Main | 「エキスパートたちのGo言語」を読んだ。 » Go の http パッケージの Request.Body はこれまで最大バイト数を指定できなかったので、巨大なファイルをアップロードするといった DoS 攻撃を心配するのであれば、各ハンドラの中で独自でサイズ制限しながら読み込む必要がありました。Go 1.18 から http.MaxBytesHandler が入ったので簡単にサイズ制限をする事ができる様になりました。 MaxBytesHandler は http.Handler として提供されるので、例えば labstack/echo であれば以下の様に、各ハンドラを直接修正する事なく、簡単に導入して使う事ができます。 package main import ( "

    Big Sky :: Go の http パッケージに MaxBytesHandler が入った。
  • Big Sky :: Go 言語のスライス挿入ベンチマーク

    Go でスライスに挿入する例として Go の Wiki に以下の物が記載されている。 作ろうしているツールで、 Goのスライスのinsertをする必要があって、 スライスの動きを理解するために、自分で実装したあとに、Goの公式Wikiを見て頭いいなと思ったhttps://t.co/vmonuxbjOl a = append(a[:i], append([]T{x}, a[i:]...)...) — ゴリラ@バナナバナナバナナバナナバナナバナナバナナバナナバナナバナナバナナバナナバナナバナナバナナ (@gorilla0513) April 4, 2020 しかしこのコードは、挿入されるスライスから部分スライスを取り出し、そこに挿入するスライスを append に割り当てる為に展開し、さらに残りの部分スライスも append に割り当てる展開を行っている。なので実装コードとしては短いが、実際に

    Big Sky :: Go 言語のスライス挿入ベンチマーク
  • Big Sky :: Vim で Go 言語を書くために行った引越し作業 2020年度版

    はじめに この文章は、普段から Vim を使い、仕事でも趣味でも Go 言語を書いている僕が、最近どの様な環境で書いているかを説明した文章です。ベストプラクティスではありません。 vim-go と僕 元々、Go 言語はリポジトリの misc/vimVimGo 言語を書くための syntax やコマンドを持っていました。今でもそれらは Google のリポジトリに置かれています。ミュージアム的な物なので、実用的ではないと思います。 GitHub - google/vim-ft-go A rudimentary Go filetype plugin. Provides syntax files and basic settings for go files. This is a f... https://github.com/google/vim-ft-go これを Fatih A

    Big Sky :: Vim で Go 言語を書くために行った引越し作業 2020年度版
  • Big Sky :: Go のポインタの躓きやすい点

    Go は最近のプログラミング言語にしては珍しくポインタを扱えるプログラミング言語。とはいってもC言語よりも簡単で、オブジェクトの初期化やメソッドの定義以外の場所ではおおよそポインタを使っている様には見えない。メソッドやフィールドへのアクセスも . で出来るし Duck Type によりインタフェースを満たしていれば実体であろうとポインタであろうとそれほど意識する必要はない。ところがこの便利さに乗っかってしまうと思わぬ所で足をすくわれてしまう。 package main type foo struct { v int } func (f foo) add(v int) { f.v = v } func main() { var a foo a.add(3) println(a.v) } このコードは 0 が表示される。メソッドを呼び出す際にはレシーバのオブジェクトを得る必要があるが、foo

    Big Sky :: Go のポインタの躓きやすい点
  • Big Sky :: clangd を使う時に便利なコマンド compiledb

    先日、Go Advent Calendar の記事の中で Language Server について書きました。 Big Sky :: gocode やめます(そして Language Server へ) はじめに まず始めに言っておかなければなりません。 gocode 今まで当にありがとう この記事は、Go 言語歴10年になる僕がこれまで愛用してきた Go 言語のコード補完ソフトウェア gocode... https://mattn.kaoriya.net/software/lang/go/20181217000056.htm 僕は Vim を使っていて、幾らかの言語の開発環境は vim-lsp に移行できたのですが C/C++ を扱うケースだけ vim-lsp に移行できず vim-clang を使ってきました。C/C++ は clangd という Language Server を使

    Big Sky :: clangd を使う時に便利なコマンド compiledb
    somathor
    somathor 2018/12/26
  • Big Sky :: gocode やめます(そして Language Server へ)

    はじめに まず始めに言っておかなければなりません。 gocode 今まで当にありがとう この記事は、Go 言語歴10年になる僕がこれまで愛用してきた Go 言語のコード補完ソフトウェア gocode の歴史と功績、そして今、gocode 自らがその役割を終えようとしている姿をぜひ皆さんに知って頂きたいという思いから Go Advent Calendar 2018 の記事として起こしました。この記事では gocode が歩んできた歴史と苦悩を少しでも皆さんに分かる様に解説させて頂きつつ、そして次にやってくる Go 言語のコード補完の未来についてご紹介したいと思います。Vim について多めに書かれていますが、Visual Studio Code での Go 開発にも影響する話です。 gocode とは gocode は nsf 氏が開発した Go 言語のコード補完サーバです。 GitHub

    Big Sky :: gocode やめます(そして Language Server へ)
  • Big Sky :: 書評「Go言語による並行処理」

    O'Reilly Japan, Inc. 様に献頂きました。ありがとうございます。 そして献頂く際にお声を掛けて頂いた、書の翻訳を担当された ymotongpoo さんにもお礼を申し上げます。ありがとうございます。 書の訳は非常に素晴らしく、とても原文が英文であったとは思えないほど綺麗で、読んでいく中で「原文でどの様に表現されているんだろう」といった引っかかりも無く、とてもスムーズに読み進められました。 Go 言語に関わって随分と長くなってきました。初めて Go を知ってからユーザがどんどん増える様を見る事が出来るのは正直に言って非常に嬉しいです。 ふと Go の魅力は何かと聞かれたら幾つか挙げる事が出来ますが、間違いなく選ぶのが「非同期処理の簡単さ」です。これまで多くの開発者が OS スレッドで実現してきた非同期処理を、Go 言語は少ないイディオムとインテリジェントなランタイムを

    Big Sky :: 書評「Go言語による並行処理」
  • Big Sky :: VimConf2017 に参加してきた。

    11/04、#vimconf2017 に参加してきました。 Vim の国際会議として開催される VimConf2017 に kaoriya さんからお誘いを受けたので参加してきました。電源は各席に付いていて、WiFi も完備、LAN ケーブルも繋がるし、会場も綺麗、弁当付き、コーヒー飲み放題、白い恋人、懇親会、LT、当に当に盛沢山で素晴らしい国際会議だったと思います。 Vim, Me and Community haya14busa さんの Vim 人生を振り返り。haya14busa さんがコントリビュートしてきた EasyMotion、そして incsearch.vim というプラグインの機能紹介をしつつ、Vim 体への incsearch の実装を分かりやすく説明してくれました。 僕ら古株 Vimmer には思いつかないアイデアだったと思います。Vim 初心者の方にも伝わる発表

    Big Sky :: VimConf2017 に参加してきた。
  • Big Sky :: net/http でレスポンスの内容を確認したいなら io.TeeReader を使おう

    « Golang で物理ファイルの操作に path/filepath でなく path を使うと爆発します。 | Main | VimConf2017 に参加してきた。 » printf デバッグは便利だ。技術の後退と言われようと printf でないと解決できない事はまだまだたくさんあります。 今日は net/http でクライアントが得たレスポンスの JSON を確認したいといった場合に、どうデバッグしたらいいかを書いてみたいと思う。 Go のインタフェースは大よそ io.Reader もしくは io.Writer を使う様に設計されている。こうする事でプログラムがメモリを一度に沢山確保してしまわない様にしています。 package main import ( "encoding/json" "fmt" "log" "net/http" ) type Foo struct { ID  

    Big Sky :: net/http でレスポンスの内容を確認したいなら io.TeeReader を使おう
  • Big Sky :: ログイン認証をマイクロサービス化する「loginsrv」

    認証を持たないウェブアプリケーションをいざ認証に対応させようと思うと案外面倒でモチベーションを無くしてしまうなんて事もよく起きうる話です。特に社内向けのアプリケーションを作っていたら番で使う事になってしまって、なんて話は良くある話です。開発でDB を見るのはちょっと...。でも既存のコードをゴリゴリと触りたくない。そんな場合にログイン認証部分だけマイクロサービス化できると気持ちも幾分和らぎます。今日はそんなちょっと便利なサーバ「loginsrv」を紹介したいと思います。 GitHub - tarent/loginsrv: JWT login microservice with plugable backends such as OAuth2, Github, htpasswd, osiam loginsrv is a standalone minimalistic login se

    Big Sky :: ログイン認証をマイクロサービス化する「loginsrv」
  • Big Sky :: golang と Generics と私

    以下の記事は Java について触れていますが、Java を dis っている訳でもありませんし、冗長に見える例を意図的に使っています。 最近 Twittergolang に Generics が無い事についてずいぶんと盛り上がったのですが、僕の意見をこのブログにも書いておこうと思います。 golang に多相が無いのはアレだとか開発者の怠慢だみたいな話はだいたい他の言語を覚えた人から出る感想で、静的型付言語である golang を見ると確かにそう見えるかもしれない。ただ golangJava や他の言語と違って Duck Type を採用している。 — Vim芸人 (@mattn_jp) March 7, 2017 スクリプト言語の多くに多相が求められないのと同じ様に golang を深く触る人達から多相が欲しいという意見がそれほど出ないのは golang の型が Duck

    Big Sky :: golang と Generics と私
  • Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」

    « Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる | Main | Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか » golang にはパッケージマネージャが無数にあります。 PackageManagementTools · golang/go Wiki · GitHub Home Articles Blogs Books BoundingResourceUse cgo ChromeOS CodeReview CodeReviewComments CodeTools C... https://github.com/golang/go/wiki/PackageManagementTools 僕もその一つの gom というのを開発している

    Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」
  • Big Sky :: golang の sort インタフェース難しい問題が解決した

    golang では配列をソートしたい場合に癖があり、Int や Float64、String といった固定の型であれば sort パッケージが提供する関数でソートが可能でしたが、独自の型や Int64 等といった sort パッケージが用意していない型の配列をソートするには Sorter というインタフェースを備えた型で扱うしかありませんでした。 package main import ( "fmt" "sort" ) type Food struct { Name  string Price int } type Foods []Food func (f Foods) Len() int { return len(f) } func (f Foods) Less(i, j int) bool { return f[i].Price < f[j].Price } func (f Foods

    Big Sky :: golang の sort インタフェース難しい問題が解決した
  • Big Sky :: C言語から使えるJSONパーサ、jansson がとても直感的で良い

    おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。 最速と言われる JSON パーサ「rapidjson」が当に爆速なのか試してみた。 C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。 C言語から使えるJSONパーサ、JSMNを試してみた。 何も見ずにC++でjsonパーサが書けるか試してみた。 ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い! 最近は結構 matsuu さんのブクマから見つけて記事を書いてたけど今日はそうじゃない所からご紹介。 Jansson — C library for working w

    Big Sky :: C言語から使えるJSONパーサ、jansson がとても直感的で良い
  • 1