サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大阪万博
qiita.com/tenntenn
はじめに どうもナレッジワークのtenntennです。 Goのinternalパッケージはご存知でしょうか? 本記事では、うまく使うととても便利なinternalパッケージについてご紹介します。 internalパッケージとは Goパッケージは、基本的には外部のモジュールに公開されます。 パッケージ内のどの識別子を公開するかは、先頭の文字を大文字にするかどうかで決まりますが、パッケージにはその機能はありません。 しかし、Goにはinternalパッケージ(内部パッケージ)という特別なパッケージがあります。internalパッケージは、モジュール外には公開されません。 また、internalパッケージの親パッケージおよびその子パッケージ以下からしか参照できません。 たとえば、以下のようなパッケージ構成があった場合を考えます。 a/b/internalパッケージ直下の識別子やa/b/inter
コメントディレクティブ どうもナレッジワークのtenntennです。 Goには、//go:noescapeや//go:linknameなどのコメントでコンパイラへの指示を記述するコメントディレクティブがあります。一応、ドキュメントには記載がありますが、多くのGoエンジニアはあまり機会はないでしょう。 ドキュメントを読むと//lineで始まるコメントは特別な意味を持つことが分かります。ここではこのlineディレクティブについて解説します。 lineディレクティブ ドキュメントには、以下のように記述した場合に、lineディレクティブとして認識されるようです。行コメントだけはなく、ブロックコメントも対象となります。//や/*の後ろにスペースを含んでは行けなかったり、:が必ず含まれていなければならなかったりと、細かなルールがあります。 //line :line //line :line:col /
Gopher塾をきっかけ どうもナレッジワークのtenntennです。 2022年の10月よりGopher塾という有料の講義を始めました。参加頂いた方は、ありがとうございました! 『チャンスは待たずに自分で作る ─ ソフトウェアエンジニアが「好きな技術」で生きていくための技術とは』という記事にも書いた通り、有料にした理由は家族との時間を減らして行う個人活動の時間に一定の意味をもたせることです。 有料で行うからには、参加者が参加して良かったと思えるものにしなければいけません。#1はテストに関して、#2はGoらしいコードの書き方について扱っています(#2は開催予定)。 単なる使い方だけではなく、10年以上Goコミュニティで学んだ知識や開発経験、技術顧問などで複数社の設計・実装を見た経験を基に講義を構成しています。 また、私は内部構造を調べるのが好きなので、たとえばgo testの仕組みやカバレ
どうもナレッジワークのtenntennです。 本記事は、Gopher塾で扱ったテストの話で、参加者の方から質問が出た並列テストにおけるよくあるバグについての解説とGo 1.20以降で入る対策について書きます。 並列テストとサブテスト Goでは、テスト関数内で(*testing.T).Parallelメソッドを呼び出すとテストを並列に実行できます。テストを並列に実行することでテストを効率よく行い、実行時間の削減が見込めます。 また、*testing.T型には、サブテスト(子テスト)を実行するためのRunメソッドがあり、サブテストを並列に実行できます。Goではテーブル駆動テストがよく用いられため、各テストケースがサブテストとして実行されます。テストの効率化を考えて、各テストケースをParallelメソッドを用いて並列に実行することが多いです。 並列テストでよくあるバグ サブテストを並列に実行す
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
はじめに 知られているようで、案外知られてないことをQiitaに投稿していくのも良いと思い、軽いネタですがinit関数についてまとめたいと思います。 init関数とは init関数は特殊な関数で、パッケージの初期化に使われます。 以下のようにmainパッケージに書くとmain関数より先に実行されます。 mainパッケージでない場合は、importするだけで呼び出されます。 Playgroundで動かす init関数は何に使うのか? 上記では、初期化に使うと書きました。名前からしてそれは想像できますよね。 init関数は基本的にはパッケージ変数の初期化に用いられます。なぜならば、何かしらの副作用をパッケージに変数に与えなければ、呼んでも意味がないからです。もちろん、外部のリソースに何かしらの副作用を与える場合(サーバに何かリクエストしたり、ファイルに書き込んだり)もありますが、基本的にはパッ
この記事はGopher道場アドベントカレンダーの24日目の記事です。 型情報を取得する 静的解析を行う際に型情報を取得するには、go/typesパッケージを用います。 golang.org/x/tools/go/analysisパッケージを使っている場合は、自分で型チェックのプロセスを行う必要がなく、analysis.Pass構造体のTypesInfoフィールドから簡単に取得できます。 なお、analysisパッケージについては、メルカリのアドベントカレンダーに「Goにおける静的解析のモジュール化について」という記事を書いてますので、そちらをご覧ください。 Pass構造体のTypesInfoフィールドの型は*types.Infoです。types.Info構造体のTypesフィールドから式(ast.Expr)の型と値の情報であるtypes.TypeAndValue型の値が取得できます。 型(
Goの変数は必ず初期化される 組込み型のゼロ値 Goの変数は必ず初期化されることをご存知でしょうか? 例えば、int型の場合は0で、string型の場合は""で初期化されています。 次のように、代入せずにfmt.Printfで表示させてみましょう。 package main import "fmt" func main() { var n int var f float64 var s string var b bool fmt.Printf("%#v %#v %#v %#v", n, f, s, b) }
はじめに メルペイ エキスパートチームの@tenntennです。 この記事は技術書典4で頒布した"こうして僕らは、書籍を売るアプリを作った 2.0.1"の一部を少し改定したものです。 Google App Engine for Go (GAE/Go)で開発する上で付き合っていかないといけない問題として、GAEのSDKのバージョンやそこで使用されるGo自体のバージョンアップが挙げられます。 GAE/Goはクラウドサービスであるため、SDKや言語のバージョンアップは必ず追従して行く必要のある問題です。 バージョンアップしなくても、一定期間はそのまま使えることが多いでしょう。 しかし、場合によっては非推奨になり、その後使えなくなる可能性もあり得ます。 そのため、特に大きな問題がない場合は積極的にバージョンアップをしていくとよいでしょう。 Goのバージョンを上げることによって、次のような恩恵を受け
はじめに 2018年2月にリリース予定のGo1.10では、strings.Builderという型が(CL74931)が入ります。 このstrings.Builderを用いると、効率良く文字列を生成することができます。 この記事では、まずstrings.Builderの使い方を説明し、次に同様の使い方ができるbytes.Bufferとベンチマークを取ってパフォーマンスを比較してみます。 そしてさらに、strings.Builderの実装をソースコードから読み解き、そこで使われているテクニックを解説します。 使い方 まずは使い方をみていきましょう。 strings.Builderはゼロ値で扱える型です。そのため、使用するのに初期化は特にいらず、次のように変数を定義するだけで使用することができます。
はじめに Goには、標準パッケージ以外にも準標準にあたるgolang.org/x/以下で管理されているパッケージが存在します。ここで管理されているパッケージは、Go本体と同様にGoチームによって管理され、コントリビュートの方法も概ね同じです。 この準標準パッケージには、さまざまなパッケージが存在します。これらは標準パッケージになるほど汎用的だったり、完成度は高くないはないですが、それでも十分に有用です。golang.org/x/tools/go/ast/astutilパッケージ(以降、astutilパッケージと表記)もそのひとつです。 astutilパッケージは静的解析で使用すると便利なパッケージで、抽象構文木(Abstract Syntax Tree, AST)に関連する便利な機能を提供します。静的解析や抽象構文木については、"goパッケージで簡単に静的解析して世界を広げよう"という記事
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? はじめに Goの標準パッケージには、goパッケージというものがあり、Goのソースコードを静的解析するのに便利な機能が提供されています。 goパッケージを使うと、以下のようなツールが簡単に作れます。 ソースコードを自動生成するツール ソースコードに対してlintやフォーマットを行うツール リファクタリングツール ソースコードから特定の何かを検索するツール ミニ言語の処理系 また、goパッケージを学ぶとコンパイラや言語処理系の知識も学べるので、他の標準パッケージとはまた少し違った知識を得ることができ、プログラミングの知識の幅が広がります。
はじめに Go Advent Calendar 2016にて、「簡単な式の評価機を作ってみる」という記事を書きました。 そこでは、抽象構文木(AST)を解析し、go/constantパッケージの機能を使って式の評価器を作るという話を書きました。 この記事では、go/typesパッケージの機能を使うことで、もっと楽して式の評価を行うプログラムを作ってみたいと思います。 なお、この記事を書いた時点におけるGoの最新バージョンは1.7.4です。 定数の評価 「Goのスコープについて考えてみよう」という記事でも触れましたが、go/typesパッケージには、以下のような機能が提供されています。 識別子の解決(identifier resolution) 型推論(type deduction) 定数の評価(constant evaluation) 「go/types: The Go Type Chec
はじめに 筆者が以前書いた「簡単な式の評価機を作ってみる」や「【実践goパッケージ】文字列から複素数型の値をパースする」などの記事では、文字列で表された式から抽象構文木(AST)を取得し、ASTのノードの種類ごとに再帰的に処理する関数を書きました。 この記事では、go/astパッケージに用意されている、ast.Inspect関数やast.Walk関数を使って、ASTをトラバースする方法について解説します。 なお、ASTを取得する方法については、「ASTを取得する方法を調べる」という記事を書いていますので、そちらを参考にしてください。 この記事で扱っているGoのバージョンは1.7.4です。 ast.Inspect関数 ast.Inspectは、ASTを深さ優先でトラバースする関数で、以下のようなシグニチャを持ちます。
はじめに みなさん、メリークリスマス! 22日の枠に欠員が出たので、go/parserパッケージを使ってAST(抽象構文木)を取得する方法についてまとめたいと思います。 goパッケージについては、簡単な式の評価機を作ってみるという記事も書いているので、そちらもぜひ読んで下さい。 なお、この記事を執筆時点のGoの最新バージョンは1.7.4です。 ノード go/parserパッケージでは、いくつかのParseと名前のついた関数でAST(抽象構文木)を取得することができます。ASTの各ノードを表す型は、go/astパッケージで提供されています。そしてそれらの型は、以下のast.Nodeインタフェースを実装するように定義されています。 ast.Nodeインタフェースは、PosメソッドとEndメソッドを持ち、共にtoken.Pos型の値を返します。token.Posはノードのコード上の位置を表します
はじめに みなさんはGAE/GoのSDKがどうやってコードをビルドしているのか知っていますか? 私は正直ふわっとしか理解できておらず、きっと小人さんがビルドしてるんだろうなくらいに思ってました。 当然、小人さんじゃなくて、どこかにgoapp buildとかを呼んでいるコードがあるんだろうとは思っていましたが、どうやらgo-app-builderというツールがそれをやっていることを知ったので、調べてみることにしました。 今回は、ソースコードを読んでいく過程で分かったことをまとめたいと思います。 なお、ここではSDKのバージョンはappengine-1.9.48を使っています。 ソースコードはどこにあるのか さて、go-app-builderはどこにあるんでしょうか。きっとSDKのディレクトリのどこかです。 実はSDK以下にあるgorootの中に入っています。
はじめに 皆さんはgoパッケージを使ったことはありますか?私は、Go!Go!言いながら、恥ずかしながら、あまりまともに使ったことがありませんでした。最近は、仕事でもAST(抽象構文木)を弄り倒すことがあるので、今回はgoパッケージに触れたいと思います。 ここでは、簡単な四則演算などを評価し、結果を返すREPLを作ってみます。一見難しそうですが、ほとんどgoパッケージの機能を使うので、非常に簡単です。 ASTへパースする まずは入力された文字列をパースし、ASTを生成してみます。ここでは、式の評価なので式単位でパースします。パースには、parser.ParseExprを用います。 たとえば、以下のように使用できます。 expr, err := parser.ParseExpr("1+1") if err != nil { panic(err) } ast.Inspect(expr, func
はじめに 皆さんはgorenameというツールをご存知でしょうか? golang.org/x/tools/cmd/gorenameで公開されている、Goのリファクタリングツールです。 ここでは、このツールを自分のコード上でライブラリとして使う方法と使いやすいリファクタリングツールの形について説明できればと思います。 なお、ここで扱う話はVimConf 2016において、エディタの壁を越えるGoの開発ツールの文化と作成法(ビデオ)というタイトルで話したものと、一部重複していますので、そちらもよかったら見て下さい。 gorenameを使ってみる まずは、gorenameをインストールして使ってみましょう。すでに使ったことある方はここは飛ばしてもらって構いません。 もしかすると、お使いのIDEやエディタによってすでにインストールされているかもしれません。 vim-goをお使いの方は、:GoRe
はじめに 知られているようで、案外知られてないことをQiitaに投稿していくのも良いと思い、軽いネタですがinit関数についてまとめたいと思います。 init関数とは init関数は特殊な関数で、パッケージの初期化に使われます。 以下のようにmainパッケージに書くとmain関数より先に実行されます。 mainパッケージでない場合は、importするだけで呼び出されます。 package main import ( "fmt" ) func init() { fmt.Println("hello, init") } func main() { fmt.Println("Hello, main") } Playgroundで動かす init関数は何に使うのか? 上記では、初期化に使うと書きました。名前からしてそれは想像できますよね。 init関数は基本的にはパッケージ変数の初期化に用いられま
新しく入ったReverse Binding機能を使ってPure GoでAndroidアプリを作ってみる #golang #gomobileAndroidGogomobile はじめに Go MobileというGoをモバイルアプリ開発に用いるというGoのサブリポジトリであるgolang.org/x以下で進められているプロジェクトがあります。 Go Mobile には、NativeアプリとSDKアプリという2種類の開発方法があり、NativeアプリはすべてをGoで書き、SDKアプリはJavaやObjective-CからGoの関数などを呼び出すというものでした。 これらの違いや詳しいやり方については、DroidKaigi 2016の資料やGopherCon 2016の資料(ビデオ)などを確認していただければと思います。 Go MobileのNativeアプリでは、Goですべてを書けるものの、UI
はじめに go test(GAE/Goの場合はgoapp test)で、自身のプロジェクトのテストを走らせる際、非常に時間がかかってしまいテストの実行が億劫になることがあります。 特にGAEだとaetestパッケージを使わなくてもそれなりに時間がかかります。 GAE/Goのテストを早くするには、favclip/testeratorを使ってインスタンスを使いまわすという方法もあります。 しかしながら、それでもそれなりに時間がかかるので、どうにか更新のあったソースコードに関わるテストだけ実行できないかと考えました。 なお、この記事ではgitなどを使ってバージョン管理している前提で書いています。 また、おそらくちゃんと動くだろうとは思いますが、まだ検証中なのでデプロイする前には、ちゃんとすべてのテストを実行することをオススメします。 coverprofileを使う go testのオプションには
次のページ
このページを最初にブックマークしてみませんか?
『@tenntennのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く