SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
The Go gopher was designed by Renée French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0 Attributions license.
エディタの壁を超える
Goの開発ツールの
文化と作成法
2016/11/05(土)
@VimConf 2016
あまりVimの話はしません
アジェンダ
● 自己紹介
● この発表の目的
● Goの特徴と言語思想
● エディタとGoの開発ツール
● 開発ツールを支えるGoの特徴
● まとめ
自己紹介
メルカリ/ソウゾウ
上田拓也
twitter: @tenntenn
■ 好きな言語
Go, JavaScript, Lua
■ 業務
GAE/Goでメルカリアッテを作ってます
Goのコミュニティを盛り上げる仕事
Gopherを描く仕事
この発表の目的
VimmerをGo界隈に...
この発表の目的
● Goの面白い文化について知ってもらう
● Goのツールの作りやすさを知ってもらう
● Goで開発ツールを作ってもらう
○ delveプラグインほしい
Goとは?
Googleが開発しているプログラミング言語
■ 特徴
● 強力でシンプルな言語設計と文法
● 並行プログラミング
● 豊富な標準ライブラリ群
● 開発ツールの充実
● シングルバイナリ/クロスコンパイル
7
GoのSimpleとEasyの実現
■ Simple:言語自体
● 文法や言語思想
● GoroutineとChannel
■ Easy:ライブラリや開発環境
● シングルバイナリ/クロスコンパイル
● 豊富な標準パッケージ
● 開発ツール充実
各言語の構成要素が
直交するように
Goのエンジニアは
Vimをつかってるの?
Goのエディタ・IDE事情
■ 決まったものはない
● Vim
● Emacs
● IntelliJ
● VSCode
● Atom
好きなエディタ/IDEを
使うことができる!
エディタ間に差はないの?
統一感のあるコード
画像引用
:https://medium.com/@hoffa/400-000-github-repositories-1-billion-files-14-terabytes-of-
code-spaces-or-tabs-7cfe0b5dd7fd#.far3hwyby
ほとんどタブ派!
開発ツールが標準であるメリット
■ みんな同じものを使う
● 同じformatter
● 同じlinter
● 同じtestingツール
● 同じドキュメント生成ツール
■ 安心の標準ツール
● メンテされる安心感
■ エディタやIDEとの連携
● 標準だとプラグインが作られやすい
開発ツールの充実 その1
■ 開発ツールが充実している
● go build
○ ビルドを行うコマンド
● go test
○ xxxx_test.goに書かれたテストコードの実行
● go doc/godoc
○ ドキュメント生成
● gofmt/goimports
○ コードフォーマッター
● go vet/golint
○ コードチェッカー、リンター
開発ツールの充実 その2
■ 開発ツールが充実している
● guru
○ 静的解析
● gocode
○ コード補完
● errcheck
○ エラー処理のチェック
● gorename/gomvpkg
○ リファクタリングツール
開発ツールとエディタ/IDEの関係
エディタ/IDE
プラグイン
開発ツール
ここが同じなので、
あまり差分が出ない
開発ツールとして独立している利点
● エディタ間の差が少ない
● イチから作るよりプラグイン開発が容易
● ターミナルからも叩ける
● ライブラリとしても提供できる
開発ツールが作りやすい理由
■ シングルバイナリ
● 配布のしやすさ
■ クロスコンパイル
● OSに依存しないツールの作成
■ 豊富な標準パッケージ
● コマンドライン引数:flag
● ネットワーク:net
● ファイル操作:os,ioutil
● テキスト処理:bufio,strings
● ソースコード解析:go
シングルバイナリ/クロスコンパイル
■ 環境変数のGOOSとGOARCHを指定する
開発環境とは違うOSやアーキテクチャ向けに
クロスコンパイルできる
# Windows(32ビット)向けにコンパイル
$ GOOS=windows GOARCH=386 go build
# Linux(64ビット)向けにコンパイル
$ GOOS=linux GOARCH=amd64 go build
シングルバイナリになるので
動作環境を用意しなくてよい
go buildはコンパイルするコマンド
flagパッケージ
■ 簡単にコマンドライン引数を扱える
var msg string
func init() {
flag.StringVar(&msg,"m","hello","message")
}
func main() {
flag.Parse()
fmt.Println(msg)
}
フラグのパース
フラグの登録
$ ./main -m hi
hi
ファイル操作とテキスト処理
■ 簡単にコマンドライン引数を扱える
f, _ := os.Open("my.txt")
defer f.Close()
s := bufio.NewScanner(f)
for i := 1; s.Scan(); i++ {
fmt.Println(i, strings.TrimSpace(s.Text()))
}
ファイルを開く
$ echo -e " hello n world" > my.txt
$ ./main
1 hello
2 world
Playgroundで動かす
ファイルを読み込む
左右の空白を取り除く
ソースコードの静的解析
go/ast 抽象構文木(AST)を提供
go/build パッケージに関する情報を集める
go/constant 定数に関する型を提供
go/doc ドキュメントをASTから取り出す
go/format コードフォーマッタの機能を提供
go/importer コンパイラに適したImporterを提供
go/parser 構文解析の機能を提供
go/printer ASTの表示機能を提供
go/scanner 字句解析の機能を提供
go/token トークンに関する型を提供
go/types 型チェックに関する機能を提供
静的解析できて何が嬉しいのか?
● リファクタリングツール
○ 変数の宣言位置や使用箇所の抽出
○ パッケージの解析
● コードジェネレーター
○ コメントによるアノテーションの抽出
○ コードフォーマッタ
● Goのサブセットとなる言語の処理系
○ ASTの解析
○ 定数の扱い
式の構文解析
n, _ := parser.ParseExpr(`v + 1`)
ast.Inspect(n, func(n ast.Node) bool {
if n != nil { fmt.Printf("%Tn", n) }
return true
})
printer.Fprint(os.Stdout, token.NewFileSet(), n)
*ast.BinaryExpr
*ast.Ident
*ast.BasicLit
v + 1
+
v 1
構文解析
抽象構文木(AST)を探索
抽象構文木(AST)を出力
BinaryExpr
Ident BasicLit
Playgroundで動かす
コメントの抽出
const src = `package main
func main() {v := 100 /*comment for v*/}`
fs := token.NewFileSet()
f, _ := parser.ParseFile(fs,"my.go",src, parser.ParseComments)
cmap := ast.NewCommentMap(fs, f, f.Comments)
for n, cgs := range cmap {
printer.Fprint(os.Stdout, fs, n)
fmt.Println()
for _, cg := range cgs { fmt.Println(cg.Text()) }
}
v := 100
comment for v
Playgroundで動かす
構文解析
コメントと
ノードの対応を取得
宣言場所の取得
const src = `package main
var v = 100
func main() { fmt.Println(v+1) }`
fs := token.NewFileSet()
f, _ := parser.ParseFile(fs, "my.go", src, 0)
i := &types.Info{Defs: map[*ast.Ident]types.Object{}}
(&types.Config{}).Check("main", fs, []*ast.File{f}, i)
for n, o := range i.Defs { fmt.Println(n, o) }
main <nil>
v var main.v int
main func main.main()
Playgroundで動かす 宣言の取得
Usesを使えば
使用箇所も調べられる
x/tools/go
ポインタ解析
SSA
Static Single Assignment form
Goで開発ツールを作る際のポイント
■ どのOSでも動くように
● OS依存の処理を極力入れない
■ コマンドラインだけでも動く
● エディタやIDEがなくても動くようにする
■ ライブラリとしても提供する
● gofmtやgorenameみたいに公開する
ライブラリとしても提供する
■ Main関数を用意する(gorenameの例)
■ main関数からそれを利用する
ライブラリとして提供する利点
■ 他のツール内で利用しやすい
● gorenameを利用したツールを作る場合
type User struct {
Id int64
Name string
}
type User struct {
ID int64 `datastore:"Id"`
Name string `datastore:"Name"`
}
フィールド名をリファクタリングしたいけど、
データストア上のカラム名は変えたくない!
gorenameを自作ツールから呼び出して
リネームしつつstructタグを付けていくイチから作る必要がない!
まとめ
■ Goは開発ツールが充実している
● 標準で多くのツールがあり、統一感がある
■ GoはエディタやIDEを選ばない
● 開発ツールが同じなので、差が起きにくい
■ Goは開発ツールが作りやすい
● 標準/準標準パッケージに静的解析の機能が豊富
● コマンドラインツールが作りやすい
● いろんなOSのユーザにやさしい
Goでエディタに依存しない
開発ツールを作ろう
Thank you!
twitter: @tenntenn
Qiita: tenntenn
connpass: tenntenn
follow me

Mais conteúdo relacionado

Mais procurados

今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
Takuya Ueda
 

Mais procurados (20)

メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化
 
Go入門
Go入門Go入門
Go入門
 
GoによるiOSアプリの開発
GoによるiOSアプリの開発GoによるiOSアプリの開発
GoによるiOSアプリの開発
 
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
 
Cloud Functionsの紹介
Cloud Functionsの紹介Cloud Functionsの紹介
Cloud Functionsの紹介
 
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
Goとテスト
GoとテストGoとテスト
Goとテスト
 
今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋今日から始めるGopher - スタートGo #0 @GDG名古屋
今日から始めるGopher - スタートGo #0 @GDG名古屋
 
粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法
 
GAE/Goとsyncパッケージ
GAE/GoとsyncパッケージGAE/Goとsyncパッケージ
GAE/Goとsyncパッケージ
 
Goだけでモバイルアプリを作ろう
Goだけでモバイルアプリを作ろうGoだけでモバイルアプリを作ろう
Goだけでモバイルアプリを作ろう
 
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
PyCon JP 2016 ビギナーセッション
PyCon JP 2016 ビギナーセッションPyCon JP 2016 ビギナーセッション
PyCon JP 2016 ビギナーセッション
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
go.mobile で Android 開発
go.mobile で Android 開発go.mobile で Android 開発
go.mobile で Android 開発
 
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 SummerGoのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGo
 

Semelhante a エディタの壁を越えるGoの開発ツールの文化と作成法

Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろう
Esehara Shigeo
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
kyon mm
 

Semelhante a エディタの壁を越えるGoの開発ツールの文化と作成法 (20)

Go静的解析ハンズオン
Go静的解析ハンズオンGo静的解析ハンズオン
Go静的解析ハンズオン
 
Go Friday 傑作選
Go Friday 傑作選Go Friday 傑作選
Go Friday 傑作選
 
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
 
Goで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろうGoで言語処理系(の途中まで)を作ろう
Goで言語処理系(の途中まで)を作ろう
 
初心者向けGo言語勉強会
初心者向けGo言語勉強会初心者向けGo言語勉強会
初心者向けGo言語勉強会
 
ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01ドキュメントの話、しませんか? #428rk01
ドキュメントの話、しませんか? #428rk01
 
Go言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンドGo言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンド
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
 
TechDo Goハンズオン#3
TechDo Goハンズオン#3TechDo Goハンズオン#3
TechDo Goハンズオン#3
 
20160730 fluentd meetup in matsue slide
20160730 fluentd meetup in matsue slide20160730 fluentd meetup in matsue slide
20160730 fluentd meetup in matsue slide
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
 
OSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツールOSSで楽に作るGo言語クライアントツール
OSSで楽に作るGo言語クライアントツール
 
20130316 プログラミング言語Go
20130316 プログラミング言語Go20130316 プログラミング言語Go
20130316 プログラミング言語Go
 
Python界隈の翻訳プロジェクト
Python界隈の翻訳プロジェクトPython界隈の翻訳プロジェクト
Python界隈の翻訳プロジェクト
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
 
Mugbot bot
Mugbot botMugbot bot
Mugbot bot
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
Easy scripting in Go
Easy scripting in GoEasy scripting in Go
Easy scripting in Go
 
実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで
 

Mais de Takuya Ueda

Mais de Takuya Ueda (11)

Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −
 
WebAssembly with Go
WebAssembly with GoWebAssembly with Go
WebAssembly with Go
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
そうだ、Goを始めよう
そうだ、Goを始めようそうだ、Goを始めよう
そうだ、Goを始めよう
 
マスター・オブ・goパッケージ
マスター・オブ・goパッケージマスター・オブ・goパッケージ
マスター・オブ・goパッケージ
 
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新
 
Static Analysis in Go
Static Analysis in GoStatic Analysis in Go
Static Analysis in Go
 
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
 
Google Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめGoogle Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめ
 
Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践
 
Mobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse BindingMobile Apps by Pure Go with Reverse Binding
Mobile Apps by Pure Go with Reverse Binding
 

Último

Último (7)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

エディタの壁を越えるGoの開発ツールの文化と作成法