タグ

関連タグで絞り込む (250)

タグの絞り込みを解除

golangに関するa2ikmのブックマーク (450)

  • GoのWebアプリ開発でフラットパッケージにした話 | フューチャー技術ブログ

    2023.10.5追記: Goチームからプロジェクトの目的に応じたディレクトリ構造についてのドキュメントが公式に公開されています。 https://go.dev/doc/modules/layout 2020/11/13 「やってみてよかったことまとめ」、「やってみて困ったこと」、「外部モックサービスを使ったユニットテストの未来」の章を追記 2020/11/18 「やってみてよかったことまとめ」にSNSでもらったフィードバック内容を追記 はじめにこんにちは、TIG 真野です。秋のブログ週間連載の第9弾です。 1年弱ほどGo言語でWebAPIアプリケーション開発を行っていますが、かなり割り切った構成・テスト方針を採用しました。そろそろ1年弱になり機能開発も比較的落ち着き、保守運用フェーズの割合も徐々に増えてきた頃合いなので、やったこと・学び・反省といった振り返りを共有します。 Goのパッケー

    GoのWebアプリ開発でフラットパッケージにした話 | フューチャー技術ブログ
    a2ikm
    a2ikm 2020/11/20
  • Goの良さをまとめてみた

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

    Goの良さをまとめてみた
    a2ikm
    a2ikm 2020/11/13
    “Goの真骨頂はさっくり9割だせてもっと処理性能が欲しいのなら環境に投資して引き上げることができる「マルチコアスプレッド性能」があること”
  • Dive deep into Go 1.15 changes to testing package

  • GoのGCを10分で学ぼう  - Qiita

    はじめに GoのGC(Garbage Collection)を調べる中で学んだことをなるべく分かりやすく簡潔にまとめたものです。 GCのアルゴリズムやメモリ割り当てについてまとめています。 記事内で使われている「オブジェクト」という用語はGoにおいては適切でないかもしれませんが、説明のしやすさから使用しています。 概要を把握しやすいように単純化しているため細部は正確でない部分があります。 GC基 用語集 前提となる用語です。 ルート ルートとは、オブジェクトが到達可能か(生存しているか)を判定するための始点です。 プログラミング言語にもよりますが、基的にメモリのスタック領域がルートになります。 フラグメンテーション フラグメンテーションとは、使用可能なメモリが断片化し途切れ途切れになっている状態です。 フラグメンテーションになってしまうと、総量的にはメモリが空いていてもアプリケーション

    GoのGCを10分で学ぼう  - Qiita
  • Goで作るテキストエディタ - Sansan Tech Blog

    はじめに みなさんこんにちは。Sansan事業部プロダクト開発部のiOSエンジニア荒川です。 以前はRDBMSの記事*1を寄稿し、好評いただいたこともあり、定期的に車輪の再発明系の記事を書いていこうと思います。 さて日はタイトルの通り、VimEmacsに代表されるターミナルで動作するインラインテキストエディタをGoで開発してみました。 ソースコードは以下のリポジトリに置いているため、ぜひ参考にしてください。 github.com 完成品 文字だけだとイメージも湧きにくいので、まずは完成品をお見せします。 最低限エディタの動きは出来ている、というレベルの完成度ですね🙏 特徴 1000行インラインエディタ 文字入力/挿入/削除 画面スクロール キーボードショートカット ファイル読み込み/保存 Goのコードハイライト機能 実装の方針 今回はただ開発するだけではなく、いくつかのこだわりポイン

    Goで作るテキストエディタ - Sansan Tech Blog
  • bmf-tech.com - GolangでgoblinというURLルーターを自作した

    概要GolangでURLルーターを自作したので実装するまでの過程をメモしておく。 準備URLルーターを実装する際に行った下準備をまとめる。 データ構造とアルゴリズムURLをどのようにマッチングさせるか、というロジックについて検討する。 多くのライブラリでは、データ構造として木構造がよく扱われているので、どんな種類の木構造を採用するかを考えてみた。 文字列探索に特化した木の中で、時間的・メモリ的計算量がよりベストなものを選定しようとすると、基数木というのが良さそうに見えるので最初はそれを採用しようとしていたのだが、実装が難し過ぎて挫折をした。 もう少し身近でシンプルなものをということでトライ木を採用することにした。 net/httpのコードリーディングnet/httpが持つマルチプレクサの拡張として実装を行うため、内部の仕組みについてある程度理解しておく必要がある。 GolangのHTTPサ

    bmf-tech.com - GolangでgoblinというURLルーターを自作した
  • Goのソースコード内のトリビア - YAMAGUCHI::weblog

    はじめに こんにちは、StackdriverあらためGoogle Cloud Operations担当者です。Google Cloud Operationsもさることながら、Go Conferenceの運営など、長らくGoコミュニティに関わってきましたが、まだまだ知らないことがあったということを昨日今日で知ったので共有します。 time.minWall time.minWall という値があります。 src/time/time.go - go - Git at Google const ( hasMonotonic = 1 << 63 maxWall = wallToInternal + (1<<33 - 1) // year 2157 minWall = wallToInternal // year 1885 nsecMask = 1<<30 - 1 nsecShift = 30 ) こ

    Goのソースコード内のトリビア - YAMAGUCHI::weblog
    a2ikm
    a2ikm 2020/07/18
  • Golang でファイルを書き込んだ時に古い内容が末尾に残る件 - stamemo

    File に Write して、ちゃんと Flush もしてるのに、なぜかゴミが append されているような挙動になる。ゴミデータはどうも「前回そのファイルに存在していた内容」っぽい。つまり古いファイル内容が残ったままになっている?……という、よくわからない挙動に遭遇。 os.OpenFile やら bufio.NewWriter やら I/O まわりに何かしら問題があることは特定したが、その先がわからない。半日くらいハマって、ようやく解決できたのでまとめる。 結論 試行過程 1 問題だったコード 2 原因は Truncate? 3 os.OpenFile で Truncate するには? 4 そもそも OpenFile の必要ある?という話 5 最終的なコード 所感やら反省やら 結論 ファイル書き込み時(特に毎回指定内容で丸々新たに書き込むような使い方の時)は os.OpenFile

    Golang でファイルを書き込んだ時に古い内容が末尾に残る件 - stamemo
    a2ikm
    a2ikm 2020/07/15
    遥か昔、perlで書いた掲示板のログを上書きするのに先頭から書き出してからtruncateで切り詰める必要があったのを思い出した。
  • gojqのパーサーを書き直しました - プログラムモグモグ

    jqはJSONを絞り込むツールですが、実はれっきとしたプログラミング言語です。 算術演算子、論理演算子、分岐構文、try・catch、そして関数定義があり、ループは再帰関数で実装します。 単に .foo とか .[0] とかでJSONを辿るだけのツールだと思われている方は、builtin関数の定義を見ていただくと良いかと思います。 selectやmapのように、よく使われる関数でさえ内部実装になっていない (Cで書かれていない) のは面白いですね。 jqのクエリを思ったように書けないという経験から、jqをより深く知るためにGo言語で再実装したのがgojqです。 去年の4月から開発を始め、8月にブログ記事を書きました。 jqのほぼすべての機能を実装しており、pure Goで書かれているのでGo言語のツールに簡単に組み込むことができます。 この記事公開以降も開発を続けています。 --arg,

    gojqのパーサーを書き直しました - プログラムモグモグ
    a2ikm
    a2ikm 2020/07/10
    面白い
  • golang.org/x/text 配下のパッケージをいくつか紹介する - Qiita

    はじめに 今回は準標準の golang.org/x/text 配下のパッケージを紹介します。 ここではは主に多言語、多locale対応の際の文字列操作をサポートするパッケージが管理されています。 アジア圏などの文字管理に考慮事項が多いlocaleに関してはそれ向けに特化したパッケージなども提供されています。 今日はその中からいくつかのパッケージを紹介したいと思います。 これは Go6 Advent Calendar 2019 の投稿です(ちょっと遅刻しました) golang.org/x/text/number doc: https://golang.org/x/text/number このパッケージは、言語による数値表現の差分を吸収してくれます。 出力の際は同じく準標準のパッケージである https://golang.org/x/text/message をつかって出力できます。 例えば英

    golang.org/x/text 配下のパッケージをいくつか紹介する - Qiita
    a2ikm
    a2ikm 2020/07/08
  • goroutineがスイッチされるタイミング - Qiita

    goroutineがスイッチされるタイミングについて調べていました。 結論 Go言語で、goroutineは 必ずしも スイッチされるわけではない。 スタックに触れないような、「for(){}」みたいなビジーループをGOMAXPROCSの指定数以上に含ませるとスイッチされなくなる。 goroutineがスイッチされる(主な)条件はこれらと思われる。 - goroutineの関数が最適化でinline化されていない - スタックを操作するような処理を行った - (その他の契機もあるようなので「経緯」で書く) 経緯 処理のないビジーループが有ると、goroutineがスイッチされず処理が止まることに気づきました。 # 処理の中身を全部コメントアウトしてデバッグしていたら気づいた package main func busy() { for { } } func main() { go busy

    goroutineがスイッチされるタイミング - Qiita
  • OpenBSD system-call-origin verification [LWN.net]

    Please consider subscribing to LWNSubscriptions are the lifeblood of LWN.net. If you appreciate this content and would like to see more of it, your subscription will help to ensure that LWN continues to thrive. Please visit this page to join up and keep LWN on the net. A new mechanism to help thwart return-oriented programming (ROP) and similar attacks has recently been added to the OpenBSD kernel

  • Goのインターフェース抽象度を美しく保つ為の思考 - 好奇心に殺される。

    Go Goのインターフェース抽象度を美しく保つ為の思考 Goで抽象化を適切に、そして美しく保つ為の自分の考えやTipsを紹介します。 Overview とある場面でGoのinterfaceが持つ振る舞いの抽象度について議論があり、今回はそれをアウトプットしておきます。Go初心者でinterfaceを使った設計に苦手意識を持つ人向けです。 目次 今回の目次です!下記について自分の考えをお話しします! 振る舞いの抽象化の度合いを意識する 抽象度をどこまであげるか 引数や返り値から発生する「抽象化の漏れ」 抽象度をあげる為の統合 Getter/Setterと抽象度 それではいってみましょう! 振る舞いの抽象化の度合いを意識する 振る舞いをinterfaceとして定義していくのがGoの抽象化ですが、そもそも 抽象化は度合いのある概念です 。この度合いを意識しないと適切なinterfaceの設計は困

    Goのインターフェース抽象度を美しく保つ為の思考 - 好奇心に殺される。
    a2ikm
    a2ikm 2020/06/22
  • Go: Memory Management and Allocation

  • インタフェースの実装パターン #golang - Qiita

    はじめに この記事は,以下の過去にQiitaに投稿したインタフェースの実装パターンの記事に,typeやメソッド,インタフェースの基的な説明を追加してわかりやすくしたものです. Go言語における埋め込みによるインタフェースの部分実装パターン structにinterfaceを埋め込んで,動的に入れ替えるパターン まずtypeとメソッド,基的なインタフェースの実装方法についておさらいすることで,さまざまなインタフェースの実装パターンを扱う準備をしましょう. typeで型を宣言する まずはじめに,Go言語における型の宣言方法をおさらいします.Go言語をはじめたばかりの方の中に,typeの使い方を限定的にしか理解していない方をよく見かけます.ご存知のとおり,typeは型を宣言するために使うキーワードです.以下のように,構造体型やインタフェース型の宣言の際に,使用することが多いでしょう. //

    インタフェースの実装パターン #golang - Qiita
  • High Performance Go Workshop

    The goal for this workshop is to give you the tools you need to diagnose performance problems in your Go applications and fix them. Through the day we’ll work from the small — learning how to write benchmarks, then profiling a small piece of code. Then step out and talk about the execution tracer, the garbage collector and tracing running applications. The remainder of the day will be a chance for

  • Practical Go | Dave Cheney

    A collection of real world advice for writing maintainable Go programs. Presentations QCon Shanghai 2018GopherCon Singapore 2019 Fundamentals What is the zero value, and why is it useful?The empty structOn declaring variablesGo has both make and new functions; what gives?Should methods be declared on T or *T?Slices from the ground upIf a map isn’t a reference, what is it?A variable’s name should b

    a2ikm
    a2ikm 2020/06/13
  • 【追記】C と Go で for 文のループでのスタックフレームの積み方が違うという気付き → 変数の確保の方法が違うだけだった

    この記事を読んでいて、不思議に感じたのでメモ。 blog.p1ass.com というのも、 低レイヤを知りたい人のためのCコンパイラ作成入門 を読みながら for 文を作っていたときにループごとにスタックフレームを新しく積むことはなかったので、別の変数に再代入しただけで結果が変わることに違和感を覚えた。もしかして C と Go で扱いが違うのかもと思って、ループ変数とループ内で宣言した変数のアドレスを書き出してみた。 C の場合はループ変数もループ内で宣言した変数もアドレスは毎回一致していた。ということは、毎回同じスタック領域をスタックフレームを使っていることになる。( for の初期化文などと同じフレームかまではわからないけど、 for 文のあとで i を参照することができないことを考えると、 for 文に入ったところで新しく積んでいるのかもしれない) $ cat <<"EOF" >ma

    【追記】C と Go で for 文のループでのスタックフレームの積み方が違うという気付き → 変数の確保の方法が違うだけだった
    a2ikm
    a2ikm 2020/06/13
    CもGoもわからないので、とりあえず実験してメモった。//さらに調べて追記した
  • [Go] スライスのfor rangeループ内で新しいスライスにappendしたらバグらせた - ぷらすのブログ

    久々にポインタ関連でバグらせてしまったので、自戒のためにメモしておく。 tl;dr for range ループの value は常に同じアドレス値を取る。 バグらせた実装 あるスライスから特定の条件を満たす値だけを抽出した新しいスライスを作ろうをして以下のようなコードを書いた。 type User struct { id int } func filter(users []User) []*User{ var filtered []*User for _, v := range users { if v.id % 2 == 0{ filtered = append(filtered, &v) } } return users } このコードを実行したとき filtered のスライスはどのような値になるだろうか? 結果はこのようになる。 users := []User{{1}, {2},

    [Go] スライスのfor rangeループ内で新しいスライスにappendしたらバグらせた - ぷらすのブログ
    a2ikm
    a2ikm 2020/06/13
  • atomicパッケージが必要な理由と使い方 - Plan 9とGo言語のブログ

    この記事はQiitaで公開されていました 以下のコードは通常分かりづらいバグを持っています。 package main import ( "fmt" "runtime" "sync" ) type Counter int32 func (c *Counter) Inc() { *c++ } func main() { var c Counter var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { c.Inc() wg.Done() }() } wg.Wait() fmt.Println("Count =", c, "GOMAXPROCS =", runtime.GOMAXPROCS(0)) } このコードは、GOMAXPROCS の値が2以上の場合、最後にプリントされるカウンタが1000にならない場

    atomicパッケージが必要な理由と使い方 - Plan 9とGo言語のブログ