net: deprecate DNSConfigError
要約
概要
netパッケージのDNSConfigError型に、正式な// Deprecated:コメントを付けて非推奨にする提案です。この型は2015年以降、標準ライブラリのどこからも返されていません。
ステータス変更
likely_accept → accepted
2026年10月1日、proposal review group(@aclements)が「likely accept」と判断しました。その後1週間、反対意見は出ず("No change in consensus")、10月8日に承認されました。issueは2023年9月にMateusz Poliwczak氏(@mateusz834)が起票し、約3年間積み残されていました。議論はほとんど行われていません。型がすでに「使われていない」とドキュメントに書かれている以上、正式に非推奨にしても実害がなく、異論が出にくい内容だったためと考えられます。
技術的背景
現状の問題点
DNSConfigErrorは「マシンのDNS設定の読み込み時のエラー」を表す型として定義されています。
// DNSConfigError represents an error reading the machine's DNS configuration.
// (No longer used; kept for compatibility.)
type DNSConfigError struct {
Err error
}
func (e *DNSConfigError) Unwrap() error { return e.Err }
func (e *DNSConfigError) Error() string { return "error reading DNS config: " + e.Err.Error() }
func (e *DNSConfigError) Timeout() bool { return false }
func (e *DNSConfigError) Temporary() bool { return false }
2015年のCL 9380(#10566の修正)で、Go製DNSリゾルバの動作が変わりました。/etc/resolv.confが存在しない、読めない、またはnameserverが書かれていない場合でも、エラーにせずlocalhostのネームサーバを使うようになりました。この変更以降、DNSConfigErrorが返される経路はなくなっています。
ただし、未使用であることはコメントの括弧書き「No longer used; kept for compatibility.」でしか示されていません。Goの慣例である// Deprecated:段落がないため、次の問題があります。
staticcheck(SA1019)やgoplsなどのツールが非推奨APIとして警告しない- pkg.go.devで非推奨として折りたたまれず、通常のAPIと同じように表示される
提案された解決策
ドキュメントコメントに標準形式の// Deprecated:段落を追加します。後方互換性を保つため、型とメソッドの削除や挙動の変更は行いません。
これによって何ができるようになるか
- デッドコードの検出:
errors.As(err, &dnsConfigErr)のように、すでに起こり得ないエラーを判定しているコードをlinterが指摘できるようになります。 - ドキュメントの整理: pkg.go.devで非推奨として扱われるため、
netパッケージのエラー型を調べる開発者が混乱しにくくなります。 - IDEでの警告: goplsなどで取り消し線表示や警告が出て、新しいコードで誤って使われるのを防げます。
コード例
// Before: 非推奨マークがないため、ツールは何も警告しない
var cfgErr *net.DNSConfigError
if errors.As(err, &cfgErr) {
// 2015年以降、ここには到達しない
log.Printf("DNS設定の読み込みに失敗: %v", cfgErr.Err)
}
// After: 型に Deprecated が付く(staticcheck SA1019 などで警告される)
//
// // DNSConfigError represents an error reading the machine's DNS configuration.
// //
// // Deprecated: No longer used; kept for compatibility.
// type DNSConfigError struct { Err error }
//
// DNS関連のエラーは *net.DNSError で判定する
var dnsErr *net.DNSError
if errors.As(err, &dnsErr) {
if dnsErr.IsNotFound {
log.Printf("ホストが見つかりません: %s", dnsErr.Name)
}
}
(After側のDeprecatedコメントの文言は想定例です。正確な文言は実装CLで決まります。)
議論のハイライト
- 提案者の主張は「CL 9380以降未使用で、ドキュメントにもそう書かれているのに、なぜ正式にdeprecateされていないのか」という一点だけでした。
- 型の削除は提案されていません。Go 1互換性の約束により公開APIは消せないため、「残すが非推奨にする」という最小限の変更になっています。
- issue上では反対意見や代替案の議論はなく、review groupの「likely accept」から1週間後、合意に変化がないとして承認されました。
- 2023年の起票から約3年後の承認です。重要度が低いため、proposal reviewの順番待ちが長くなったと考えられます。
- 承認後、このissueは実装の追跡用になります。実装CLは記事作成時点では確認できていません。