「go:fix」は、インライン化とソースレベルでのインライナー(inliner)を修正します。

2026/03/12 3:39

「go:fix」は、インライン化とソースレベルでのインライナー(inliner)を修正します。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Go 1.26 の

go fix
サブコマンドは、関数呼び出しをその本体のコピーで安全に置き換えることができるソースレベルインラインャーを含むように書き直されました。
インラインャーはソースレベルで引数を更新し、サイドエフェクトの順序、名前の影響(シェドウィング)、未使用変数、および遅延呼び出しといった複雑な問題に対処します。コード量は約 7,000 行です。直接置き換えが意味を変更する場合(例:境界外定数やサイドエフェクトのため)、明示的な「パラメータバインディング」宣言を挿入するか、
defer
ケースでは関数リテラルにフォールバックします。
このインラインャーは Google のモノレポで 18,000 件以上の変更リストを処理し、数十億行にわたるコードから数百万件の非推奨呼び出しを排除しました。同じエンジンが IDE のリファクタリング(「シグネチャ変更」、「未使用パラメータ削除」)や
//go:fix inline
ディレクティブによるセルフサービス API マイグレーション(例:
ioutil.ReadFile
os.ReadFile
に置き換える)を動かしています。
ツールは安全であり、実行される変換がプログラムの振る舞いを変更しないことを保証しますが、スタイル面で最適とは限らないため、一部の保守的な結果については手作業でのクリーンアップが必要になる場合があります。開発者や IDE は対話的または自動でこの機能をトリガーでき、大規模かつ安全なコードマイグレーションを実現し、メンテナンス負荷を削減します。

本文

Go 1.26 では、Go コードを最新かつモダンに保つための go fix サブコマンドが新しく実装されました。
この記事はその中でも特に注目すべき機能 ― ソースレベルでのインライン化 に焦点を当てています。


ソースレベルインライン化とは?

2023 年に、関数呼び出しを呼び出し先(callee)の本体へ置換するアルゴリズムを構築しました。
この変換では引数をパラメータに直接代入し、ソースコードそのものを書き換えます。
コンパイラレベルのインライン化(中間表現で行う)とは異なり、持続的に ソースファイルを更新します。

実際に gopls の「Inline call」リファクタリングや VS Code の「Source Action…」メニューを使うと見たことがあるはずです。
スクリーンショットの before‑after では、関数

six
内で呼び出されていた
sum
がインライン式に変換されます。

このインライナーは多くのソース変換ツールの基盤となっています:

  • gopls は「Change signature」や「Remove unused parameter」といったリファクタリングで使用しています。
  • 新しい
    go fix
    コマンドのアナライザの一つでもあり、
    //go:fix inline
    ディレクティブを使って セルフサービス な API 置換が可能です。

例 1 –
ioutil.ReadFile
のリネーム

Go 1.16 で

ioutil.ReadFile
は非推奨となり、代わりに
os.ReadFile
が使われるようになりました。
古い関数を次のように注釈します。

package ioutil

import "os"

// ReadFile reads the file named by filename…
// Deprecated: As of Go 1.16, this function simply calls [os.ReadFile].
//go:fix inline
func ReadFile(filename string) ([]byte, error) {
    return os.ReadFile(filename)
}

go fix
を実行すると、呼び出し側のコードが次のように変換されます。

-import "io/ioutil"
+import "os"

-   data, err := ioutil.ReadFile("hello.txt")
+   data, err := os.ReadFile("hello.txt")

呼び出しはインライン化され、単に別の関数呼び出しに置き換わるだけなので安全です。


例 2 – API デザイン上の欠陥修正

古いパッケージ

oldmath
に以下のような問題があるとします:

package oldmath

import "newmath"

// Sub returns x - y.
// Deprecated: the parameter order is confusing.
func Sub(y, x int) int {
    return newmath.Sub(x, y)
}

// Inf returns positive infinity.
// Deprecated: there are two infinite values; be explicit.
func Inf() float64 {
    return newmath.Inf(+1)
}

// Neg returns -x.
// Deprecated: this function is unnecessary.
func Neg(x int) int {
    return newmath.Sub(0, x)
}

各関数に

//go:fix inline
を付けると、
go fix
は古い API への呼び出しをすべて置換します。

-import "oldmath"
+import "newmath"

-var nine = oldmath.Sub(1, 10)   // diagnostic: "call of oldmath.Sub should be inlined"
+var nine = newmath.Sub(10, 1)

インラインアナライザは型や定数にも対応します:

//go:fix inline
type Rational = newmath.Rational

//go:fix inline
const Pi = newmath.Pi

oldmath.Rational
oldmath.Pi
への参照がすべて自動で更新されます。


インライナーの技術的課題

ソースレベルインライン化は「呼び出しを本体に置き換える」だけではありません。
実装は約 7,000 行に及ぶコンパイラ風ロジックで、以下の 6 つの重要な側面を扱います:

  1. パラメータ削除

    • 単純なリテラルなら直接置き換え。そうでない場合は「パラメータバインディング」宣言を発行し、重複した魔法値を避ける。
  2. 副作用

    • 引数に副作用がある場合は評価順序を保持。安全なら直接インライン化、そうでなければ各引数を先にバインドする。
  3. 失敗しやすい定数式

    • 定数置換によってコンパイル時エラー(範囲外など)が起きないように注意。
  4. シャドウイング

    • 引数と呼び出し先本体の識別子が同一シンボルを指すよう、必要に応じてバインディングやインポートを挿入。
  5. 未使用変数

    • 呼び出し元で最後に参照される変数が誤って削除されないように使用状況を追跡。
  6. defer

    • 呼び出し先が
      defer
      を使う場合は、即時実行関数リテラルで本体を包む。ただしバッチモードではこうした呼び出しのインライン化は拒否される。

ソースレベルインライン化の将来

インライナーは 音響性(プログラム挙動を変えないこと)を目指しています。
最適化コンパイラと同様に完全な整形は不可能で、ツールが保守的になり手動での修正が必要になるケースもあります。

しかしユーザーは次のように利用できます:

  • IDE で「Inline call」リファクタリングを対話的に実行。
  • 自身の関数に
    //go:fix inline
    ディレクティブを追加。
  • go fix
    を走らせて安全な変換を一括適用。

ぜひエディタや

go fix
でインライナーを試し、フィードバックやさらなる改善アイデアを共有してください。

同じ日のほかのニュース

一覧に戻る →

2026/03/16 4:12

「Chrome DevTools MCP」 (原文と同じく略語をそのまま使用します)

## Japanese Translation: **改訂要約** Chrome の MCP(Machine‑Code Processor)サーバーは、現在実行中の Chrome セッションに直接コーディングエージェントを接続できるようになり、新しいインスタンスを毎回起動する必要がなくなりました。 この機能を利用するには、`chrome://inspect#remote-debugging` でリモートデバッグを有効化し、MCP サーバーを `--autoConnect` フラグ付きで起動します(例:`gemini-cli --autoConnect --channel=beta`)。 エージェントがセッションを要求すると、Chrome は許可ダイアログを表示し、「Chrome is being controlled by automated test software」というバナーを表示します。エージェントはそのアクティブなセッションに対して Network や Elements などの DevTools パネルへアクセスできます。 MCP サーバーは依然として元々の起動方法をサポートしています:ユーザープロファイルの指定、リモートデバッグポート経由での接続、または隔離された一時プロファイルの実行。 サンプルワークフローは次のとおりです。リモートデバッグを有効化した後、エージェントプロンプトに「Check the performance of https://developers.chrome.com」と入力すると、MCP サーバーが接続し、ページを開き、パフォーマンストレースを取得します。 Chrome M144(Beta)で利用可能なこの機能は、デベロッパーが新しいセッションを開くことなく手動の DevTools 使用と AI 支援デバッグをシームレスに切り替えられるようにし、将来的に MCP を通じてコーディングエージェントへより多くの DevTools パネルデータを段階的に公開する基盤を整備します。

2026/03/16 6:22

カナダの法案 C‑22 は、カナダ国民への大量メタデータ監視を義務付けています。

## Japanese Translation: > Bill C‑22(Lawful Access Act)は、通信事業者および電子サービスプロバイダー(ESP)への法執行アクセスを拡大すると同時に、一部のプライバシー制限を強化します。従来のBill C‑2で広範な無証拠要求が認められていた点を置き換え、通信事業者に対しては「サービス確認」権限のみを限定的に付与します。他の加入者情報については、合理的根拠基準に基づく裁判所承認命令が必要となります。 > > 本法ではまた、Supporting Authorized Access to Information Act(SAAIA)も導入されます。この条項はBill C‑2の多くの要件を反映しつつ、GoogleやMetaなどのESPにも適用します。ESPはデバイス・機能テストへの協力、要求の秘密保持、および「コアプロバイダー」として指定される可能性があります。コアプロバイダーは、データ抽出ツールの開発・テスト・維持管理、監視装置の設置、当局への機能通知、そして特定メタデータ(例:送信ログ)を最大1年間保持する義務があります。ただし、**送信内容、ウェブ閲覧履歴、またはソーシャルメディア活動の保持を強制されることはありません**—この例外はシステム的脆弱性への対処に限定されています。 > > 監督はインテリジェンス・コミッショナーが承認した省令によって行われますが、多くの詳細は機密扱いとなっています。本法は、ブダペスト条約第二追加議定書や米国のCLOUD Actなどとの国際情報共有協力を改善することを目的としていますが、重大な市民権利懸念を提起し、通信事業者およびESPに大きなコンプライアンス負担を課す可能性があります。結果として、ユーザーの監視リスクが高まる恐れがあります。

2026/03/16 4:25

49 MB のウェブページ

## Japanese Translation: 記事は、現代のニュースサイトがデータ量の多いリクエストや侵入的な広告、トラッキングスクリプトで読者を過剰に負荷させていると主張し、滑らかな閲覧体験よりも収益を優先していることを指摘しています。 - **具体的証拠:** ニューヨーク・タイムズの記事1件が422のネットワークリクエスト、49 MBのデータを生成し、安定するまでに2分かかったと報告されています。2006年には同じページは1.5 Mbpsの接続で数分間停止していた(10曲分のMP3音源に相当)。 - **広告インフラ:** クライアント側のプログレマティックオークションがRubicon ProjectやAmazon Ad Systemsなどのエクスチェンジへ何十もの同時入札リクエストを送信し、膨大なJavaScript解析を要求します。 - **トラッキングペイロード:** 約5 MBのトラッキングスクリプトがPOSTビーコンをファーストパーティー端点(例: a.et.nytimes.com/track)やクロスサイトトラッカー(doubleclick.net、casalemedia)へ送信し、バックグラウンドでユーザー識別情報を構築します。IABの「purr」同意エンドポイントはページロード直後にこれらのスクリプトを即座に起動させるため、クッキーバナーはプライバシー保護ではなく法的シールドであることが示されています。 - **UX戦術:** パブリッシャーはCPMやビューアビリティ指標を読者体験よりも重視し、モーダルポップアップ、低コントラストの閉じアイコン、強制スクロール、自動再生のスティッキービデオ(CPU熱、バッテリー消費、Fitts法違反)や「Read More」ボタンで記事を切り捨て、追加広告をロードします。これらは広告iframeが遷移後に読み込まれる際にレイアウトシフト(CLS)を引き起こし、Google Core Web Vitalsの指標による離脱率を高めます。 - **モバイル問題:** モバイルニュースサイトはコンテンツに約11 %しかビューポートを割り当てず、狭いスリット状の表示領域がインタラクションコストを増大させます。 - **緩和策:** 非必須オーバーレイはスクロール深度≥50 %または60 秒滞在後に遅延し、モーダルキューを順序付け、アクセシブルで低侵襲のモーダルを使用し、非同期コンテンツ用スペースを確保してCLSを回避します。 - **代替案:** text.npr.org、lite.cnn.com、およびRSSフィードといった軽量フォーマットは、読者が余計な要素のないプライバシーフレンドリーなニュース消費を好むことを示し、広告中心のUIパラダイムに挑戦します。 **結果:** このまとめはすべての主要ポイントを完全に反映し、説明のない推測を避け、記事の主張を明確で読者フレンドリーな概要として提示しています。

「go:fix」は、インライン化とソースレベルでのインライナー(inliner)を修正します。 | そっか~ニュース