Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
golang.org/x/text/transformを用いた文字列変換のススメ
Search
tom twinkle
December 09, 2022
Programming
14k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
golang.org/x/text/transformを用いた文字列変換のススメ
golang.org/x/text/transformを使ったcustom transformの作成の仕方
tom twinkle
December 09, 2022
More Decks by tom twinkle
See All by tom twinkle
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
940
早すぎ?超先読み Go 1.26 Draft - Preview the contents of the Go 1.26 Draft Release Notes
tomtwinkle
0
800
about #74462 go/token#FileSet
tomtwinkle
1
1.8k
Other Decks in Programming
See All in Programming
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
280
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
220
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
160
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.7k
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
160
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
310
LLM 101
dalinaum
0
470
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
620
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
410
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
300
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
240
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
740
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
1
300
Side Projects
sachag
456
43k
Deep Space Network (abreviated)
tonyrice
0
410
A Soul's Torment
seathinner
8
3.9k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Test your architecture with Archunit
thirion
2
2.5k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
660
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.6k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
590
Transcript
golang.org/x/text/transformを用いた文 字列変換のススメ ANDPAD inc. tomoki.harada (tomtwinkle) Let’s transform!
transform.Transformer使っていますか?
transform.Transformer とは
https://pkg.go.dev/golang.org/x/text @v0.4.0/transform
something output something output io.Writer io.Reader Transformer Transformer https://cs.opensource.google/go/x/text/+/refs/tags/v0.4.0:transform/transform.go;l=110 https://cs.opensource.google/go/x/text/+/refs/tags/v0.4.0:transform/transform.go;l=209
transform.Writer transform.Reader something input something input “abc” [\x97,\x98,\x99] “adc” [\x97,\x100,\x99] “b” -> “d” \x98 -> \x100 全てのbyte列をメモリに載せなくても Streamのまま部分的にbyte列を操作できる
• メモリ使用量を抑える • memory allocation, GCによる速度 低下を避ける
それっぽいキーワードで探してもあまり見つからない
transform.Transformer 実装の仕方
https://cs.opensource.google/go/x/text/+/internal-branch.g o1.19-vendor:transform/transform.go;l=41 byte列の変換処理 Transformer再利用の為のリセットメソッド (Transformer内部state変数の値リセット)
https://cs.opensource.google/go/x/text/+/internal-branch.g o1.19-vendor:transform/transform.go;l=104 Transformer内部でstateを持たない場合はResetの実装が不要なので NopResetterをstructにEmbedded
https://cs.opensource.google/go/x/text/+/internal-branch.g o1.19-vendor:transform/transform.go;l=41
something output something output io.Writer Buffer Transform() Transform() https://cs.opensource.google/go/x/text/+/refs/tags/v0.4.0:transform/transform.go;l=110 https://cs.opensource.google/go/x/text/+/refs/tags/v0.4.0:transform/transform.go;l=209
transform.Writer transform.Reader something input something input Buffer io.Reader srcのbyte列 もっと欲しい → ErrShortSrc dstのbuffer size足りてない → ErrShortDst
Transformの戻り値のerrorについて Error Type 説明 transform.ErrShortDst srcの入力に対してdst bufferが不足している際に返却する Transformerはdst bufferをioに一旦書き込み、またdst bufferを空にしてTransformを呼び出す
これを返さないと4096byte以上処理できない transform.ErrShortSrc Streamでやってきたsrcの入力情報だけでは不足していて処 理出来ず次のsrcも読み込む必要がある場合に返却する (Hello->Hiに変換する処理でHellしかinputにない等) 当然、ErrShortDstとかち合うのでdst bufferよりも小さいの が前提
something output something output io.Writer Buffer Transform() Transform() https://cs.opensource.google/go/x/text/+/refs/tags/v0.4.0:transform/transform.go;l=110 https://cs.opensource.google/go/x/text/+/refs/tags/v0.4.0:transform/transform.go;l=209
transform.Writer transform.Reader something input something input Buffer io.Reader nDst=dstに格 納したbyte数 nSrc=srcから dstにcopyした byte数
https://go.dev/play/p/ezCskczrmlf 何も変換しないNop Transformer
https://go.dev/play/p/T7G8n-kNrNW 何も変換しないNop Transformer
https://github.com/tomtwinkle/garbledreplacer UTF-8からShift-JISに変換する際に出来ない文字を置き換えるTransformer
準パッケージのTransformerは変換出来ないとerrorになってしまう
https://github.com/tomtwinkle/garbledreplacer UTF-8からShift-JISに変換する際に出来ない文字を置き換えるTransformer transformに渡されるbyte列が文字列であるとは限ら ないため文字列かどうかの判定を行う srcが最後のbyte列の場合はatEOF=trueになる このロジック上では無くても動作上問題ないが、余計な処理が走らないよう にearly returnしている runeがShift-JISでencode出来るかチェック encode出来なかったら別の文字に置き換え
変換後のbyte列がdstのbufferからあふれる場合は dstに copyせずにErrShortDstを返して次の処理に回す nDstの値を適切に返していれば次回の処理では未処理の byte列を繋げて返してくれます ←!! マルチバイト文字注意ポイント マルチバイト文字の途中で srcが途切れた場合は そのbyte列をdstにcopyしないように調整が必要です
今まで作成したTransformer • UTF-8をShift-JISに変換し、変換できない文字を置き換 える https://github.com/tomtwinkle/garbledreplacer • UTF-8 BOMを削除する https://github.com/tomtwinkle/utfbomremover •
特定の文字列を別の文字列に変換 https://github.com/tomtwinkle/gostrreplacer
おまけ
私選!Githubで公開されている面白Transformer • 特定の文字列を別の文字列に変換 https://github.com/tenntenn/text ℳ → M • Windows向けのCodePage Decoder
https://github.com/mattn/go-localereader CP932(Shift-JIS), CP1200(UTF-16), CP65001(UTF-8) • ニーモニックEncoder/Decoder(パスワード等の乱数のような意味のな い英数字を理解しやすい単語に変換して電話越しで伝えやすくする) https://github.com/schollz/mnemonicode こんな感じの変換 8f9240688685a1e9 ↔ magic-slang-crimson--inch-calypso-ibiza
面白Transformer番外編 • uber-go/configシェルライクなシークエンス(${hoge}みたいな記述) を展開する実装 https://github.com/uber-go/config/blob/v1.4.0/expand.go#L124 • andybalholm/redwood tgulacsi/go文字列内で重複するスペースを削 除する実装 https://github.com/andybalholm/redwood/blob/v1.7.0/word.go#L53
https://github.com/tgulacsi/go/blob/v0.24.0/stream/trim.go#L39 • BurntSushi/graphics-go 画像をアフィン変換する実装 https://github.com/BurntSushi/graphics-go/blob/master/graphics/affine.go#L61
マルチバイト文字を扱うアジア圏の我々 だからこそTransformerを賢く扱ってい きましょう! (もっと情報が増えて欲しい…!)