タグ

ブックマーク / qiita.com/tenntenn (28)

  • fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golang - Qiita

    fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golangGo fmtパッケージのインタフェース fmtパッケージにはいくつかインタフェースがあります。 例えば、ここではフォーマットに関わる以下の3つについて説明していきましょう。 Stringer GoStringer Formatter Stringerインタフェース fmt.Stringerインタフェースは有名でしょう。 定義は以下のようになっています。

    fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golang - Qiita
  • ゼロ値を使おう #golang

    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) }

    ゼロ値を使おう #golang
  • Google App EngineでGoのバージョンアップを行う #golang #gae - Qiita

    はじめに メルペイ エキスパートチームの@tenntennです。 この記事は技術書典4で頒布した"こうして僕らは、書籍を売るアプリを作った 2.0.1"の一部を少し改定したものです。 Google App Engine for Go (GAE/Go)で開発する上で付き合っていかないといけない問題として、GAEのSDKのバージョンやそこで使用されるGo自体のバージョンアップが挙げられます。 GAE/Goはクラウドサービスであるため、SDKや言語のバージョンアップは必ず追従して行く必要のある問題です。 バージョンアップしなくても、一定期間はそのまま使えることが多いでしょう。 しかし、場合によっては非推奨になり、その後使えなくなる可能性もあり得ます。 そのため、特に大きな問題がない場合は積極的にバージョンアップをしていくとよいでしょう。 Goのバージョンを上げることによって、次のような恩恵を受け

    Google App EngineでGoのバージョンアップを行う #golang #gae - Qiita
  • Go1.10で入るstrings.Builderを検証した #golang - Qiita

    package main import ( "bytes" "fmt" "strings" "testing" ) func stringsBuilder(b *testing.B, n int, grow bool) { for i := 0; i < b.N; i++ { var builder strings.Builder b.StopTimer() if grow { builder.Grow(n * 4) } b.StartTimer() for j := 0; j < n; j++ { fmt.Fprint(&builder, "TEST") } _ = builder.String() } } func bytesBuffer(b *testing.B, n int, grow bool) { for i := 0; i < b.N; i++ { var buf bytes

    Go1.10で入るstrings.Builderを検証した #golang - Qiita
  • astutil.Applyで抽象構文木を置き換える #golang - Qiita

    はじめに Goには、標準パッケージ以外にも準標準にあたるgolang.org/x/以下で管理されているパッケージが存在します。ここで管理されているパッケージは、Go体と同様にGoチームによって管理され、コントリビュートの方法も概ね同じです。 この準標準パッケージには、さまざまなパッケージが存在します。これらは標準パッケージになるほど汎用的だったり、完成度は高くないはないですが、それでも十分に有用です。golang.org/x/tools/go/ast/astutilパッケージ(以降、astutilパッケージと表記)もそのひとつです。 astutilパッケージは静的解析で使用すると便利なパッケージで、抽象構文木(Abstract Syntax Tree, AST)に関連する便利な機能を提供します。静的解析や抽象構文木については、"goパッケージで簡単に静的解析して世界を広げよう"という記事

    astutil.Applyで抽象構文木を置き換える #golang - Qiita
  • Goの初心者が見ると幸せになれる場所 #golang - Qiita

    公式サイト A Tour of Go Web上で実行しながら学ぶことができる公式のチュートリアルです。 チュートリアル 公式のチュートリアルです。初学者向けからジェネリクスのチュートリアルなども用意されています。 A Tour of Goが終わった後に取り組むと良いでしょう。 Go Wiki Go Code Review Commentsなどが掲載されているGitHub上のWikiです。 パッケージドキュメント 標準パッケージやサードパーティ製のパッケージのドキュメントが見れるサイトです。検索もできます。 入門 プログラミング言語Go完全入門 筆者が作っている巨大なGoの入門資料です。なぜGoが作られたのか、から最新のジェネリクスの情報、静的解析まで扱っています。 Gopher道場 Goを体系的に学べる場です。10時間くらいある動画教材(自習室から入手可)もあります。 Go の最初の手順

    Goの初心者が見ると幸せになれる場所 #golang - Qiita
  • init関数のふしぎ #golang - Qiita

    はじめに 知られているようで、案外知られてないことを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関数は基的にはパッケージ変数の初期化に用いられま

    init関数のふしぎ #golang - Qiita
  • goパッケージで簡単に静的解析して世界を広げよう #golang - Qiita

    はじめに Goの標準パッケージには、goパッケージというものがあり、Goのソースコードを静的解析するのに便利な機能が提供されています。 goパッケージを使うと、以下のようなツールが簡単に作れます。 ソースコードを自動生成するツール ソースコードに対してlintやフォーマットを行うツール リファクタリングツール ソースコードから特定の何かを検索するツール ミニ言語の処理系 また、goパッケージを学ぶとコンパイラや言語処理系の知識も学べるので、他の標準パッケージとはまた少し違った知識を得ることができ、プログラミングの知識の幅が広がります。 しかしながら、goパッケージに関する日語の文献は少なく、学習しづらいのが辛いところです。 私もこれまでgoパッケージについて、Qiita上でいくつか記事を書いてきましたが、どの記事が何をするときに役に立つのか分かりづらくなっていました。 そこでこの記事では

    goパッケージで簡単に静的解析して世界を広げよう #golang - Qiita
  • Goの抽象構文木(AST)を手入力してHello, Worldを作る #golang - Qiita

    はじめに タイトルを見て、「はて?何を言ってるんだろう」と思った方もいるでしょう。 その通りです。通常、抽象構文木(AST)を取得するには、「ASTを取得する方法を調べる」で解説したように、go/parserパッケージの関数を使ってソースコードをパースする必要があります。 しかし、この記事では温かみのある手入力をすることで、日頃なんとなく取得しているASTがどういうノードで構築されているのか、最低限必要なフィールドは何なのかということを改めて知ることを目的としています。 なお、この記事を書いた時のGoの最新バージョンは1.7.4です。 今回作るコード 今回はかのプログラム言語Cやプログラミング言語Goで有名なHello, Worldを出力するプログラムを作りたいと思います。 具体的には、以下のようなコードです。 なお、せっかくなので、ここではGoっぽく、Hello, 世界としています。 p

    Goの抽象構文木(AST)を手入力してHello, Worldを作る #golang - Qiita
  • Goのスコープについて考えてみよう #golang - Qiita

    はじめに Twitterで以下のような投稿をしてみました。 https://twitter.com/tenntenn/status/815807925222412292 この問題は、以下のコード中に存在するスコープの数を聞いている問題です。 package main import "fmt" func main() { const message = "hello, world" fmt.Println(message) }

    Goのスコープについて考えてみよう #golang - Qiita
  • 抽象構文木(AST)をトラバースする #golang - Qiita

    はじめに 筆者が以前書いた「簡単な式の評価機を作ってみる」や「【実践goパッケージ】文字列から複素数型の値をパースする」などの記事では、文字列で表された式から抽象構文木(AST)を取得し、ASTのノードの種類ごとに再帰的に処理する関数を書きました。 この記事では、go/astパッケージに用意されている、ast.Inspect関数やast.Walk関数を使って、ASTをトラバースする方法について解説します。 なお、ASTを取得する方法については、「ASTを取得する方法を調べる」という記事を書いていますので、そちらを参考にしてください。 この記事で扱っているGoのバージョンは1.7.4です。 ast.Inspect関数 ast.Inspectは、ASTを深さ優先でトラバースする関数で、以下のようなシグニチャを持ちます。 第1引数のnodeは、トラバースするASTのルートノードを表し、第2引数の

    抽象構文木(AST)をトラバースする #golang - Qiita
  • ASTを取得する方法を調べる #golang - Qiita

    はじめに みなさん、メリークリスマス! 22日の枠に欠員が出たので、go/parserパッケージを使ってAST(抽象構文木)を取得する方法についてまとめたいと思います。 goパッケージについては、簡単な式の評価機を作ってみるという記事も書いているので、そちらもぜひ読んで下さい。 なお、この記事を執筆時点のGoの最新バージョンは1.7.4です。 ノード go/parserパッケージでは、いくつかのParseと名前のついた関数でAST(抽象構文木)を取得することができます。ASTの各ノードを表す型は、go/astパッケージで提供されています。そしてそれらの型は、以下のast.Nodeインタフェースを実装するように定義されています。 type Node interface { Pos() token.Pos // position of first character belonging to

    ASTを取得する方法を調べる #golang - Qiita
  • go-app-builderのソースコードを読む #golang #gae - Qiita

    はじめに みなさんはGAE/GoのSDKがどうやってコードをビルドしているのか知っていますか? 私は正直ふわっとしか理解できておらず、きっと小人さんがビルドしてるんだろうなくらいに思ってました。 当然、小人さんじゃなくて、どこかにgoapp buildとかを呼んでいるコードがあるんだろうとは思っていましたが、どうやらgo-app-builderというツールがそれをやっていることを知ったので、調べてみることにしました。 今回は、ソースコードを読んでいく過程で分かったことをまとめたいと思います。 なお、ここではSDKのバージョンはappengine-1.9.48を使っています。 ソースコードはどこにあるのか さて、go-app-builderはどこにあるんでしょうか。きっとSDKのディレクトリのどこかです。 実はSDK以下にあるgorootの中に入っています。 $ ls $(goapp env

    go-app-builderのソースコードを読む #golang #gae - Qiita
  • 簡単な式の評価機を作ってみる #golang - Qiita

    はじめに 皆さんはgoパッケージを使ったことはありますか?私は、GoGo!言いながら、恥ずかしながら、あまりまともに使ったことがありませんでした。最近は、仕事でもAST(抽象構文木)を弄り倒すことがあるので、今回はgoパッケージに触れたいと思います。 ここでは、簡単な四則演算などを評価し、結果を返すREPLを作ってみます。一見難しそうですが、ほとんどgoパッケージの機能を使うので、非常に簡単です。 ASTへパースする まずは入力された文字列をパースし、ASTを生成してみます。ここでは、式の評価なので式単位でパースします。パースには、parser.ParseExprを用います。 たとえば、以下のように使用できます。 expr, err := parser.ParseExpr("1+1") if err != nil { panic(err) } ast.Inspect(expr, func

    簡単な式の評価機を作ってみる #golang - Qiita
  • gorenameをライブラリとして使う #golang - Qiita

    はじめに 皆さんはgorenameというツールをご存知でしょうか? golang.org/x/tools/cmd/gorenameで公開されている、Goのリファクタリングツールです。 ここでは、このツールを自分のコード上でライブラリとして使う方法と使いやすいリファクタリングツールの形について説明できればと思います。 なお、ここで扱う話はVimConf 2016において、エディタの壁を越えるGoの開発ツールの文化と作成法(ビデオ)というタイトルで話したものと、一部重複していますので、そちらもよかったら見て下さい。 gorenameを使ってみる まずは、gorenameをインストールして使ってみましょう。すでに使ったことある方はここは飛ばしてもらって構いません。 もしかすると、お使いのIDEやエディタによってすでにインストールされているかもしれません。 vim-goをお使いの方は、:GoRe

    gorenameをライブラリとして使う #golang - Qiita
  • Goを学びたての人が誤解しがちなtypeと構造体について #golang - Qiita

    はじめに タイトルをキャッチーかつ若干煽り気味にしたのは、そもそも記事を見てもらう確率を上げるためで他意はありません。なぜ読んでほしいのかというと、typeとstructについて、一部の機能に着目して、それがtypeとstructの全てだと誤解されるとマズいなと感じることが最近多いためです。 この記事で書いてあることは過去にもインタフェースの実装パターンや2016年度Go研修で取り上げていますが、今回は端的に分かりやすくなるようにまとめたいと思います。

    Goを学びたての人が誤解しがちなtypeと構造体について #golang - Qiita
  • 新しく入ったReverse Binding機能を使ってPure GoでAndroidアプリを作ってみる #golang #gomobile - Qiita

    新しく入ったReverse Binding機能を使ってPure GoAndroidアプリを作ってみる #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

    新しく入ったReverse Binding機能を使ってPure GoでAndroidアプリを作ってみる #golang #gomobile - Qiita
  • [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae - Qiita

    はじめに go test(GAE/Goの場合はgoapp test)で、自身のプロジェクトのテストを走らせる際、非常に時間がかかってしまいテストの実行が億劫になることがあります。 特にGAEだとaetestパッケージを使わなくてもそれなりに時間がかかります。 GAE/Goのテストを早くするには、favclip/testeratorを使ってインスタンスを使いまわすという方法もあります。 しかしながら、それでもそれなりに時間がかかるので、どうにか更新のあったソースコードに関わるテストだけ実行できないかと考えました。 なお、この記事ではgitなどを使ってバージョン管理している前提で書いています。 また、おそらくちゃんと動くだろうとは思いますが、まだ検証中なのでデプロイする前には、ちゃんとすべてのテストを実行することをオススメします。 coverprofileを使う go testのオプションには

    [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae - Qiita
  • 終了したことを他の複数のゴルーチンに伝えるのにチャネルのcloseを使う #golang - Qiita

    複数のゴルーチンに対して、何かしらの処理が終了したことを伝えるのにチャネルのcloseが使えます。 これはruiさんの以下の記事にも書かれていることですが、ここでは閉じれたチャネルの挙動を見つつ、例を挙げて説明していきます。 Goでチャネルにブロードキャストするにはcloseを使う 閉じられたチャネルの挙動 閉じられたチャネルは、受信したり送信したりした場合、どのような挙動をするのでしょうか? 実際に送信や受信を行ってみて挙動を確かめてみましょう。 送信 閉じられたチャネルに対して送信してみましょう。 Go Playgroundで見る package main func main() { ch := make(chan struct{}) close(ch) ch <- struct{}{} }

    終了したことを他の複数のゴルーチンに伝えるのにチャネルのcloseを使う #golang - Qiita
  • Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE - Qiita

    はじめに Google App Engine for Go (GAE/Go) を使っていて、ローカルでデバッグがしたくなることがあるかと思います。 Goにはいくつかデバッガがあり、IDEが対応しているものもあります。 ここでは Delve というデバッガを使ってデバッグする方法を紹介します。 Delveは動いているGoのプロセスにアタッチしてデバッグすることができます。 そのため、GAE/Goのローカルサーバのプロセスにもアタッチしてデバッグすることができます。 しかし、GAE/Goのローカルサーバのプロセスは、複数動いていたり、切り替わったりするため、一筋縄ではいきません。 ここでは、以下の記事を基に、ターミナル上でローカルサーバのデバッグをやってみます。 Debugging Golang Appengine module with Visual Studio Code Delveのイン

    Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE - Qiita