Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10616] ファイルの概要

このコミットは、Go言語の標準ライブラリであるstrconvパッケージのAPI変更を適用するものです。具体的には、数値や真偽値と文字列との相互変換を行う関数群の命名規則が変更され、古いAPIから新しいAPIへの移行が行われています。この変更は、Go言語の進化に伴うAPIの整理と一貫性の向上を目的としています。

コミット

commit 2666b815a33edf3a9a1b7c335f9baabf27179d9f
Author: Russ Cox <rsc@golang.org>
Date:   Mon Dec 5 15:48:46 2011 -0500

    use new strconv API

    All but 3 cases (in gcimporter.go and hixie.go)
    are automatic conversions using gofix.

    No attempt is made to use the new Append functions
    even though there are definitely opportunities.

    R=golang-dev, gri
    CC=golang-dev
    https://golang.org/cl/5447069

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/2666b815a33edf3a9a1b7c335f9baabf27179d9f

元コミット内容

このコミットは、Go言語のstrconvパッケージにおけるAPIの変更を、Go言語のリポジトリ全体に適用するものです。コミットメッセージによると、gcimporter.gohixie.goの3つのケースを除き、ほとんどの変更はgofixツールによる自動変換によって行われたとされています。また、新しいAppend関数群(例: AppendInt, AppendFloatなど)を使用する機会があったにもかかわらず、このコミットではそれらの利用は見送られたことが明記されています。

変更の背景

Go言語は、その開発初期から活発な進化を遂げており、APIの設計も継続的に改善されてきました。strconvパッケージは、文字列と数値(整数、浮動小数点数)、真偽値との間の変換を提供する非常に基本的なパッケージです。初期のAPIは、C言語の標準ライブラリ関数(例: atoi, atof)に影響を受けた命名規則を持っていましたが、Go言語の設計思想である「明確さ」と「一貫性」を追求する中で、よりGoらしい命名規則への変更が決定されました。

この変更の主な目的は以下の通りです。

  1. 命名の一貫性向上: 変換の方向(文字列から、または文字列へ)とデータ型をより明確に区別する命名規則を採用することで、APIの利用者が関数名を直感的に理解できるようにする。
  2. 可読性の向上: Atob(ASCII to boolean)やItoa64(Integer to ASCII 64-bit)のような略語的な命名から、ParseBoolFormatIntのようなより記述的な命名にすることで、コードの可読性を高める。
  3. gofixツールの活用: Go言語には、APIの変更に伴うコードの自動修正を支援するgofixというツールが存在します。このツールを活用することで、大規模なコードベース全体にわたるAPI変更の適用を効率的に行うことが可能になります。このコミットもその典型的な例であり、ほとんどの変更がgofixによって自動的に行われたことが示されています。

前提知識の解説

Go言語のstrconvパッケージ

strconvパッケージは、Go言語において文字列と基本的なデータ型(真偽値、整数、浮動小数点数)との間で変換を行うための機能を提供します。主な機能は以下の2種類に大別されます。

  • Parse系関数: 文字列を対応するデータ型に変換します。例えば、"true"true(bool型)に、"123"123(int型)に変換します。これらの関数は、変換に失敗した場合にエラーを返します。
  • Format系関数: 基本的なデータ型を文字列に変換します。例えば、true(bool型)を"true"に、123(int型)を"123"に変換します。

gofixツール

gofixは、Go言語のツールチェインに含まれるコマンドラインツールです。Go言語のAPIが変更された際に、古いAPIを使用している既存のコードを新しいAPIに自動的に書き換える機能を提供します。これにより、Go言語のバージョンアップに伴うコードの修正作業を大幅に軽減し、開発者が常に最新のAPIを利用しやすくなります。gofixは、構文木を解析してパターンマッチングを行い、定義された変換ルールに基づいてコードを修正します。

Go言語の型変換と文字列変換

Go言語は静的型付け言語であり、異なる型間の変換には明示的なキャストまたは変換関数が必要です。strconvパッケージは、特に文字列と数値・真偽値間の変換において中心的な役割を果たします。

  • 文字列から数値への変換: 文字列で表現された数値を、int, int64, float64などの数値型に変換します。変換時には、基数(10進数、16進数など)やビットサイズを指定できる場合があります。
  • 数値から文字列への変換: 数値を文字列に変換します。浮動小数点数の場合は、指数表記(e)、固定小数点表記(f)、または一般的な表記(g)など、出力形式を指定できます。
  • 文字列から真偽値への変換: "true", "false"などの文字列をtrue, false(bool型)に変換します。
  • 真偽値から文字列への変換: true, false(bool型)を"true", "false"に変換します。

技術的詳細

このコミットにおけるstrconv APIの変更は、主に以下のパターンに従っています。

旧APIのパターン新APIのパターン変換内容
strconv.Atob(s)strconv.ParseBool(s)文字列を真偽値に変換
strconv.Btoa(b)strconv.FormatBool(b)真偽値を文字列に変換
strconv.Atoi64(s)strconv.ParseInt(s, 10, 64)文字列をint64に変換(10進数)
strconv.Btoi64(s, base)strconv.ParseInt(s, base, 64)文字列をint64に変換(指定基数)
strconv.Atoui64(s)strconv.ParseUint(s, 10, 64)文字列をuint64に変換(10進数)
strconv.Btoui64(s, base)strconv.ParseUint(s, base, 64)文字列をuint64に変換(指定基数)
strconv.Atof64(s)strconv.ParseFloat(s, 64)文字列をfloat64に変換
strconv.AtofN(s, bits)strconv.ParseFloat(s, bits)文字列をfloatNに変換(指定ビットサイズ)
strconv.Itoa64(i)strconv.FormatInt(i, 10)int64を文字列に変換(10進数)
strconv.Itob64(i, base)strconv.FormatInt(i, base)int64を文字列に変換(指定基数)
strconv.Uitoa64(u)strconv.FormatUint(u, 10)uint64を文字列に変換(10進数)
strconv.Uitob64(u, base)strconv.FormatUint(u, base)uint64を文字列に変換(指定基数)
strconv.Ftoa64(f, fmt, prec)strconv.FormatFloat(f, fmt, prec, 64)float64を文字列に変換(指定形式、精度)
strconv.FtoaN(f, fmt, prec, bits)strconv.FormatFloat(f, fmt, prec, bits)floatNを文字列に変換(指定形式、精度、ビットサイズ)
strconv.Itob(i, base)strconv.FormatInt(int64(i), base)intを文字列に変換(指定基数)
strconv.Atoui(s)strconv.ParseUint(s, 10, 0)文字列をuintに変換(10進数、ビットサイズ自動)

この変更により、strconvパッケージの関数は、Parse(文字列から型へ)とFormat(型から文字列へ)という明確なプレフィックスを持つようになりました。また、数値変換関数では、基数(base)とビットサイズ(bitSize)を引数として明示的に指定する形式が統一されました。これにより、関数の目的と挙動がより明確になり、誤用が減ることが期待されます。

コミットメッセージにある「All but 3 cases (in gcimporter.go and hixie.go) are automatic conversions using gofix.」という記述は、このAPI変更がgofixツールによって広範囲に自動適用されたことを示しています。これは、Go言語のツールチェインが言語の進化をサポートする強力な機能を持っていることの証拠です。

また、「No attempt is made to use the new Append functions even though there are definitely opportunities.」という記述は、strconvパッケージに新しく追加されたAppend系の関数(例: AppendInt, AppendFloatなど)が、このコミットではまだ利用されていないことを示唆しています。Append関数は、既存のバイトスライスに変換結果を追記することで、メモリ割り当てを最適化し、パフォーマンスを向上させる可能性があります。このコミットでは、APIの命名規則の統一が優先され、パフォーマンス最適化は後続のコミットに委ねられたと考えられます。

コアとなるコードの変更箇所

このコミットは、Go言語の標準ライブラリの様々なファイルにわたる広範な変更を含んでいます。主な変更は、strconvパッケージの古い関数呼び出しを新しい関数呼び出しに置き換えることです。

例として、doc/talks/io2010/eval1.goeval2.goにおける変更を見てみましょう。

doc/talks/io2010/eval1.goの変更例:

--- a/doc/talks/io2010/eval1.go
+++ b/doc/talks/io2010/eval1.go
@@ -125,7 +124,7 @@ func newVal(lit string) Value {
 	if err == nil {
 		return Int(x)
 	}
-	b, err := strconv.Atob(lit)
+	b, err := strconv.ParseBool(lit)
 	if err == nil {
 		return Bool(b)
 	}
@@ -175,7 +174,7 @@ func (x Int) BinaryOp(op string, y Value) Value {

 type Bool bool

-func (x Bool) String() string { return strconv.Btoa(bool(x)) }
+func (x Bool) String() string { return strconv.FormatBool(bool(x)) }
 func (x Bool) BinaryOp(op string, y Value) Value {
 	switch y := y.(type) {
 	case Error:

この例では、以下の変更が行われています。

  • strconv.Atob(lit)strconv.ParseBool(lit) に変更されています。これは、文字列を真偽値に変換する関数です。
  • strconv.Btoa(bool(x))strconv.FormatBool(bool(x)) に変更されています。これは、真偽値を文字列に変換する関数です。

同様の変更が、src/cmd/cgo/gcc.go, src/cmd/goinstall/download.go, src/cmd/gotest/flag.go, src/pkg/archive/tar/reader.go, src/pkg/archive/tar/writer.go, src/pkg/compress/flate/huffman_bit_writer.go, src/pkg/encoding/json/decode.go, src/pkg/encoding/json/encode.go, src/pkg/encoding/xml/marshal.go, src/pkg/encoding/xml/read.go, src/pkg/exp/norm/maketables.go, src/pkg/exp/sql/convert.go, src/pkg/exp/sql/driver/types.go, src/pkg/exp/types/gcimporter.go, src/pkg/expvar/expvar.go, src/pkg/flag/flag.go, src/pkg/fmt/format.go, src/pkg/fmt/scan.go, src/pkg/net/http/chunked.go, src/pkg/net/http/fs.go, src/pkg/net/http/pprof/pprof.go, src/pkg/net/http/server.go, src/pkg/net/http/transfer.go, src/pkg/net/mail/message.go, src/pkg/old/template/parse.go, src/pkg/reflect/tostring_test.go, src/pkg/regexp/syntax/regexp.go, src/pkg/text/template/parse/node.go, src/pkg/time/time_test.go, src/pkg/unicode/maketables.go, src/pkg/websocket/hixie.go, test/fixedbugs/bug120.go, test/fixedbugs/bug260.goなど、多数のファイルで行われています。

これらの変更は、strconvパッケージのAPIがより一貫性のある命名規則に統一されたことを示しています。

コアとなるコードの解説

このコミットのコアとなる変更は、Go言語のstrconvパッケージの関数呼び出しを、新しい命名規則に準拠したものに置き換えることです。これは、Go言語のAPI設計における一貫性と可読性の向上という哲学を反映しています。

具体的には、以下のような変換が行われています。

  1. Atob -> ParseBool:

    • 旧: strconv.Atob(s string) (bool, error)
    • 新: strconv.ParseBool(s string) (bool, error)
    • 文字列sを真偽値にパースします。"true", "false", "1", "0"などが有効です。
  2. Btoa -> FormatBool:

    • 旧: strconv.Btoa(b bool) string
    • 新: strconv.FormatBool(b bool) string
    • 真偽値bを文字列"true"または"false"にフォーマットします。
  3. Atoi64, Btoi64 -> ParseInt:

    • 旧: strconv.Atoi64(s string) (int64, error)
    • 旧: strconv.Btoi64(s string, base int) (int64, error)
    • 新: strconv.ParseInt(s string, base int, bitSize int) (int64, error)
    • 文字列sを整数にパースします。baseは基数(2から36)、bitSizeは結果の整数型が収まるビット数(0, 8, 16, 32, 64)を指定します。bitSizeが0の場合、int型に変換されます。
  4. Atoui64, Btoui64 -> ParseUint:

    • 旧: strconv.Atoui64(s string) (uint64, error)
    • 旧: strconv.Btoui64(s string, base int) (uint64, error)
    • 新: strconv.ParseUint(s string, base int, bitSize int) (uint64, error)
    • 文字列sを符号なし整数にパースします。ParseIntと同様にbasebitSizeを指定します。
  5. Atof64, AtofN -> ParseFloat:

    • 旧: strconv.Atof64(s string) (float64, error)
    • 旧: strconv.AtofN(s string, bitSize int) (float64, error)
    • 新: strconv.ParseFloat(s string, bitSize int) (float64, error)
    • 文字列sを浮動小数点数にパースします。bitSizeは結果の浮動小数点型が収まるビット数(32または64)を指定します。
  6. Itoa64, Itob64, Itob -> FormatInt:

    • 旧: strconv.Itoa64(i int64) string
    • 旧: strconv.Itob64(i int64, base int) string
    • 旧: strconv.Itob(i int, base int) string
    • 新: strconv.FormatInt(i int64, base int) string
    • 整数iを文字列にフォーマットします。baseは基数(2から36)を指定します。
  7. Uitoa64, Uitob64 -> FormatUint:

    • 旧: strconv.Uitoa64(u uint64) string
    • 旧: strconv.Uitob64(u uint64, base int) string
    • 新: strconv.FormatUint(u uint64, base int) string
    • 符号なし整数uを文字列にフォーマットします。baseは基数(2から36)を指定します。
  8. Ftoa64, FtoaN -> FormatFloat:

    • 旧: strconv.Ftoa64(f float64, fmt byte, prec int) string
    • 旧: strconv.FtoaN(f float64, fmt byte, prec int, bitSize int) string
    • 新: strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
    • 浮動小数点数fを文字列にフォーマットします。fmtはフォーマット文字('f', 'e', 'E', 'g', 'G', 'b')、precは精度、bitSizeは元の浮動小数点型のビット数(32または64)を指定します。

これらの変更は、Go言語のAPIがより予測可能で、学習しやすく、そしてgofixのようなツールによる自動化に適した形に進化していることを示しています。

関連リンク

  • Go言語のstrconvパッケージのドキュメント: https://pkg.go.dev/strconv
  • Go言語のgofixツールに関する情報(Go言語の公式ブログやドキュメントで言及されていることが多い)

参考にした情報源リンク

  • Go言語の公式ドキュメントおよびstrconvパッケージのソースコード
  • Go言語のコミット履歴(特にstrconvパッケージ関連の変更)
  • Go言語のgofixツールの機能に関する一般的な情報源(Go言語のブログ記事やチュートリアルなど)

(注: この解説は、提供されたコミット情報と一般的なGo言語の知識に基づいて生成されています。特定のstrconv API変更に関する詳細な設計議論や背景情報は、当時のGo言語のメーリングリストやデザインドキュメントに存在する可能性がありますが、今回の情報源からは直接参照していません。)

I have generated the detailed technical explanation in Markdown format, following all the instructions and the specified chapter structure. The output is printed to standard output only, as requested.# [インデックス 10616] ファイルの概要

このコミットは、Go言語の標準ライブラリである`strconv`パッケージのAPI変更を適用するものです。具体的には、数値や真偽値と文字列との相互変換を行う関数群の命名規則が変更され、古いAPIから新しいAPIへの移行が行われています。この変更は、Go言語の進化に伴うAPIの整理と一貫性の向上を目的としています。

## コミット

commit 2666b815a33edf3a9a1b7c335f9baabf27179d9f Author: Russ Cox rsc@golang.org Date: Mon Dec 5 15:48:46 2011 -0500

use new strconv API

All but 3 cases (in gcimporter.go and hixie.go)
are automatic conversions using gofix.

No attempt is made to use the new Append functions
even though there are definitely opportunities.

R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5447069

## GitHub上でのコミットページへのリンク

[https://github.com/golang/go/commit/2666b815a33edf3a9a1b7c335f9baabf27179d9f](https://github.com/golang/go/commit/2666b815a33edf3a9a1b7c335f9baabf27179d9f)

## 元コミット内容

このコミットは、Go言語の`strconv`パッケージにおけるAPIの変更を、Go言語のリポジトリ全体に適用するものです。コミットメッセージによると、`gcimporter.go`と`hixie.go`の3つのケースを除き、ほとんどの変更は`gofix`ツールによる自動変換によって行われたとされています。また、新しい`Append`関数群(例: `AppendInt`, `AppendFloat`など)を使用する機会があったにもかかわらず、このコミットではそれらの利用は見送られたことが明記されています。

## 変更の背景

Go言語は、その開発初期から活発な進化を遂げており、APIの設計も継続的に改善されてきました。`strconv`パッケージは、文字列と数値(整数、浮動小数点数)、真偽値との間の変換を提供する非常に基本的なパッケージです。初期のAPIは、C言語の標準ライブラリ関数(例: `atoi`, `atof`)に影響を受けた命名規則を持っていましたが、Go言語の設計思想である「明確さ」と「一貫性」を追求する中で、よりGoらしい命名規則への変更が決定されました。

この変更の主な目的は以下の通りです。

1.  **命名の一貫性向上**: 変換の方向(文字列から、または文字列へ)とデータ型をより明確に区別する命名規則を採用することで、APIの利用者が関数名を直感的に理解できるようにする。
2.  **可読性の向上**: `Atob`(ASCII to boolean)や`Itoa64`(Integer to ASCII 64-bit)のような略語的な命名から、`ParseBool`や`FormatInt`のようなより記述的な命名にすることで、コードの可読性を高める。
3.  **`gofix`ツールの活用**: Go言語には、APIの変更に伴うコードの自動修正を支援する`gofix`というツールが存在します。このツールを活用することで、大規模なコードベース全体にわたるAPI変更の適用を効率的に行うことが可能になります。このコミットもその典型的な例であり、ほとんどの変更が`gofix`によって自動的に行われたことが示されています。

## 前提知識の解説

### Go言語の`strconv`パッケージ

`strconv`パッケージは、Go言語において文字列と基本的なデータ型(真偽値、整数、浮動小数点数)との間で変換を行うための機能を提供します。主な機能は以下の2種類に大別されます。

*   **Parse系関数**: 文字列を対応するデータ型に変換します。例えば、`"true"`を`true`(bool型)に、`"123"`を`123`(int型)に変換します。これらの関数は、変換に失敗した場合にエラーを返します。
*   **Format系関数**: 基本的なデータ型を文字列に変換します。例えば、`true`(bool型)を`"true"`に、`123`(int型)を`"123"`に変換します。

### `gofix`ツール

`gofix`は、Go言語のツールチェインに含まれるコマンドラインツールです。Go言語のAPIが変更された際に、古いAPIを使用している既存のコードを新しいAPIに自動的に書き換える機能を提供します。これにより、Go言語のバージョンアップに伴うコードの修正作業を大幅に軽減し、開発者が常に最新のAPIを利用しやすくなります。`gofix`は、構文木を解析してパターンマッチングを行い、定義された変換ルールに基づいてコードを修正します。

### Go言語の型変換と文字列変換

Go言語は静的型付け言語であり、異なる型間の変換には明示的なキャストまたは変換関数が必要です。`strconv`パッケージは、特に文字列と数値・真偽値間の変換において中心的な役割を果たします。

*   **文字列から数値への変換**: 文字列で表現された数値を、`int`, `int64`, `float64`などの数値型に変換します。変換時には、基数(10進数、16進数など)やビットサイズを指定できる場合があります。
*   **数値から文字列への変換**: 数値を文字列に変換します。浮動小数点数の場合は、指数表記(e)、固定小数点表記(f)、または一般的な表記(g)など、出力形式を指定できます。
*   **文字列から真偽値への変換**: `"true"`, `"false"`などの文字列を`true`, `false`(bool型)に変換します。
*   **真偽値から文字列への変換**: `true`, `false`(bool型)を`"true"`, `"false"`に変換します。

## 技術的詳細

このコミットにおける`strconv` APIの変更は、主に以下のパターンに従っています。

| 旧APIのパターン           | 新APIのパターン             | 変換内容                               |
| :------------------------ | :-------------------------- | :------------------------------------- |
| `strconv.Atob(s)`         | `strconv.ParseBool(s)`      | 文字列を真偽値に変換                   |
| `strconv.Btoa(b)`         | `strconv.FormatBool(b)`     | 真偽値を文字列に変換                   |
| `strconv.Atoi64(s)`       | `strconv.ParseInt(s, 10, 64)` | 文字列をint64に変換(10進数)          |
| `strconv.Btoi64(s, base)` | `strconv.ParseInt(s, base, 64)` | 文字列をint64に変換(指定基数)        |
| `strconv.Atoui64(s)`      | `strconv.ParseUint(s, 10, 64)` | 文字列をuint64に変換(10進数)         |
| `strconv.Btoui64(s, base)`| `strconv.ParseUint(s, base, 64)` | 文字列をuint64に変換(指定基数)       |
| `strconv.Atof64(s)`       | `strconv.ParseFloat(s, 64)` | 文字列をfloat64に変換                  |
| `strconv.AtofN(s, bits)`  | `strconv.ParseFloat(s, bits)` | 文字列をfloatNに変換(指定ビットサイズ)|
| `strconv.Itoa64(i)`       | `strconv.FormatInt(i, 10)`  | int64を文字列に変換(10進数)          |
| `strconv.Itob64(i, base)` | `strconv.FormatInt(i, base)`| int64を文字列に変換(指定基数)        |
| `strconv.Uitoa64(u)`      | `strconv.FormatUint(u, 10)` | uint64を文字列に変換(10進数)         |
| `strconv.Uitob64(u, base)`| `strconv.FormatUint(u, base)`| uint64を文字列に変換(指定基数)       |
| `strconv.Ftoa64(f, fmt, prec)`| `strconv.FormatFloat(f, fmt, prec, 64)`| float64を文字列に変換(指定形式、精度)|
| `strconv.FtoaN(f, fmt, prec, bits)`| `strconv.FormatFloat(f, fmt, prec, bits)`| floatNを文字列に変換(指定形式、精度、ビットサイズ)|
| `strconv.Itob(i, base)`   | `strconv.FormatInt(int64(i), base)` | intを文字列に変換(指定基数)          |
| `strconv.Atoui(s)`        | `strconv.ParseUint(s, 10, 0)` | 文字列をuintに変換(10進数、ビットサイズ自動)|

この変更により、`strconv`パッケージの関数は、`Parse`(文字列から型へ)と`Format`(型から文字列へ)という明確なプレフィックスを持つようになりました。また、数値変換関数では、基数(`base`)とビットサイズ(`bitSize`)を引数として明示的に指定する形式が統一されました。これにより、関数の目的と挙動がより明確になり、誤用が減ることが期待されます。

コミットメッセージにある「All but 3 cases (in gcimporter.go and hixie.go) are automatic conversions using gofix.」という記述は、このAPI変更が`gofix`ツールによって広範囲に自動適用されたことを示しています。これは、Go言語のツールチェインが言語の進化をサポートする強力な機能を持っていることの証拠です。

また、「No attempt is made to use the new Append functions even though there are definitely opportunities.」という記述は、`strconv`パッケージに新しく追加された`Append`系の関数(例: `AppendInt`, `AppendFloat`など)が、このコミットではまだ利用されていないことを示唆しています。`Append`関数は、既存のバイトスライスに変換結果を追記することで、メモリ割り当てを最適化し、パフォーマンスを向上させる可能性があります。このコミットでは、APIの命名規則の統一が優先され、パフォーマンス最適化は後続のコミットに委ねられたと考えられます。

## コアとなるコードの変更箇所

このコミットは、Go言語の標準ライブラリの様々なファイルにわたる広範な変更を含んでいます。主な変更は、`strconv`パッケージの古い関数呼び出しを新しい関数呼び出しに置き換えることです。

例として、`doc/talks/io2010/eval1.go`と`eval2.go`における変更を見てみましょう。

**`doc/talks/io2010/eval1.go`の変更例:**

```diff
--- a/doc/talks/io2010/eval1.go
+++ b/doc/talks/io2010/eval1.go
@@ -125,7 +124,7 @@ func newVal(lit string) Value {
 	if err == nil {
 		return Int(x)
 	}
-	b, err := strconv.Atob(lit)
+	b, err := strconv.ParseBool(lit)
 	if err == nil {
 		return Bool(b)
 	}
@@ -175,7 +174,7 @@ func (x Int) BinaryOp(op string, y Value) Value {

 type Bool bool

-func (x Bool) String() string { return strconv.Btoa(bool(x)) }
+func (x Bool) String() string { return strconv.FormatBool(bool(x)) }
 func (x Bool) BinaryOp(op string, y Value) Value {
 	switch y := y.(type) {
 	case Error:

この例では、以下の変更が行われています。

  • strconv.Atob(lit)strconv.ParseBool(lit) に変更されています。これは、文字列を真偽値に変換する関数です。
  • strconv.Btoa(bool(x))strconv.FormatBool(bool(x)) に変更されています。これは、真偽値を文字列に変換する関数です。

同様の変更が、src/cmd/cgo/gcc.go, src/cmd/goinstall/download.go, src/cmd/gotest/flag.go, src/pkg/archive/tar/reader.go, src/pkg/archive/tar/writer.go, src/pkg/compress/flate/huffman_bit_writer.go, src/pkg/encoding/json/decode.go, src/pkg/encoding/json/encode.go, src/pkg/encoding/xml/marshal.go, src/pkg/encoding/xml/read.go, src/pkg/exp/norm/maketables.go, src/pkg/exp/sql/convert.go, src/pkg/exp/sql/driver/types.go, src/pkg/exp/types/gcimporter.go, src/pkg/expvar/expvar.go, src/pkg/flag/flag.go, src/pkg/fmt/format.go, src/pkg/fmt/scan.go, src/pkg/net/http/chunked.go, src/pkg/net/http/fs.go, src/pkg/net/http/pprof/pprof.go, src/pkg/net/http/server.go, src/pkg/net/http/transfer.go, src/pkg/net/mail/message.go, src/pkg/old/template/parse.go, src/pkg/reflect/tostring_test.go, src/pkg/regexp/syntax/regexp.go, src/pkg/text/template/parse/node.go, src/pkg/time/time_test.go, src/pkg/unicode/maketables.go, src/pkg/websocket/hixie.go, test/fixedbugs/bug120.go, test/fixedbugs/bug260.goなど、多数のファイルで行われています。

これらの変更は、strconvパッケージのAPIがより一貫性のある命名規則に統一されたことを示しています。

コアとなるコードの解説

このコミットのコアとなる変更は、Go言語のstrconvパッケージの関数呼び出しを、新しい命名規則に準拠したものに置き換えることです。これは、Go言語のAPI設計における一貫性と可読性の向上という哲学を反映しています。

具体的には、以下のような変換が行われています。

  1. Atob -> ParseBool:

    • 旧: strconv.Atob(s string) (bool, error)
    • 新: strconv.ParseBool(s string) (bool, error)
    • 文字列sを真偽値にパースします。"true", "false", "1", "0"などが有効です。
  2. Btoa -> FormatBool:

    • 旧: strconv.Btoa(b bool) string
    • 新: strconv.FormatBool(b bool) string
    • 真偽値bを文字列"true"または"false"にフォーマットします。
  3. Atoi64, Btoi64 -> ParseInt:

    • 旧: strconv.Atoi64(s string) (int64, error)
    • 旧: strconv.Btoi64(s string, base int) (int64, error)
    • 新: strconv.ParseInt(s string, base int, bitSize int) (int64, error)
    • 文字列sを整数にパースします。baseは基数(2から36)、bitSizeは結果の整数型が収まるビット数(0, 8, 16, 32, 64)を指定します。bitSizeが0の場合、int型に変換されます。
  4. Atoui64, Btoui64 -> ParseUint:

    • 旧: strconv.Atoui64(s string) (uint64, error)
    • 旧: strconv.Btoui64(s string, base int) (uint64, error)
    • 新: strconv.ParseUint(s string, base int, bitSize int) (uint64, error)
    • 文字列sを符号なし整数にパースします。ParseIntと同様にbasebitSizeを指定します。
  5. Atof64, AtofN -> ParseFloat:

    • 旧: strconv.Atof64(s string) (float64, error)
    • 旧: strconv.AtofN(s string, bitSize int) (float64, error)
    • 新: strconv.ParseFloat(s string, bitSize int) (float64, error)
    • 文字列sを浮動小数点数にパースします。bitSizeは結果の浮動小数点型が収まるビット数(32または64)を指定します。
  6. Itoa64, Itob64, Itob -> FormatInt:

    • 旧: strconv.Itoa64(i int64) string
    • 旧: strconv.Itob64(i int64, base int) string
    • 旧: strconv.Itob(i int, base int) string
    • 新: strconv.FormatInt(i int64, base int) string
    • 整数iを文字列にフォーマットします。baseは基数(2から36)を指定します。
  7. Uitoa64, Uitob64 -> FormatUint:

    • 旧: strconv.Uitoa64(u uint64) string
    • 旧: strconv.Uitob64(u uint64, base int) string
    • 新: strconv.FormatUint(u uint64, base int) string
    • 符号なし整数uを文字列にフォーマットします。baseは基数(2から36)を指定します。
  8. Ftoa64, FtoaN -> FormatFloat:

    • 旧: strconv.Ftoa64(f float64, fmt byte, prec int) string
    • 旧: strconv.FtoaN(f float64, fmt byte, prec int, bitSize int) string
    • 新: strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
    • 浮動小数点数fを文字列にフォーマットします。fmtはフォーマット文字('f', 'e', 'E', 'g', 'G', 'b')、precは精度、bitSizeは元の浮動小数点型のビット数(32または64)を指定します。

これらの変更は、Go言語のAPIがより予測可能で、学習しやすく、そしてgofixのようなツールによる自動化に適した形に進化していることを示しています。

関連リンク

  • Go言語のstrconvパッケージのドキュメント: https://pkg.go.dev/strconv
  • Go言語のgofixツールに関する情報(Go言語の公式ブログやドキュメントで言及されていることが多い)

参考にした情報源リンク

  • Go言語の公式ドキュメントおよびstrconvパッケージのソースコード
  • Go言語のコミット履歴(特にstrconvパッケージ関連の変更)
  • Go言語のgofixツールの機能に関する一般的な情報源(Go言語のブログ記事やチュートリアルなど)

(注: この解説は、提供されたコミット情報と一般的なGo言語の知識に基づいて生成されています。特定のstrconv API変更に関する詳細な設計議論や背景情報は、当時のGo言語のメーリングリストやデザインドキュメントに存在する可能性がありますが、今回の情報源からは直接参照していません。)