[インデックス 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.go
とhixie.go
の3つのケースを除き、ほとんどの変更はgofix
ツールによる自動変換によって行われたとされています。また、新しいAppend
関数群(例: AppendInt
, AppendFloat
など)を使用する機会があったにもかかわらず、このコミットではそれらの利用は見送られたことが明記されています。
変更の背景
Go言語は、その開発初期から活発な進化を遂げており、APIの設計も継続的に改善されてきました。strconv
パッケージは、文字列と数値(整数、浮動小数点数)、真偽値との間の変換を提供する非常に基本的なパッケージです。初期のAPIは、C言語の標準ライブラリ関数(例: atoi
, atof
)に影響を受けた命名規則を持っていましたが、Go言語の設計思想である「明確さ」と「一貫性」を追求する中で、よりGoらしい命名規則への変更が決定されました。
この変更の主な目的は以下の通りです。
- 命名の一貫性向上: 変換の方向(文字列から、または文字列へ)とデータ型をより明確に区別する命名規則を採用することで、APIの利用者が関数名を直感的に理解できるようにする。
- 可読性の向上:
Atob
(ASCII to boolean)やItoa64
(Integer to ASCII 64-bit)のような略語的な命名から、ParseBool
やFormatInt
のようなより記述的な命名にすることで、コードの可読性を高める。 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
の変更例:
--- 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設計における一貫性と可読性の向上という哲学を反映しています。
具体的には、以下のような変換が行われています。
-
Atob
->ParseBool
:- 旧:
strconv.Atob(s string) (bool, error)
- 新:
strconv.ParseBool(s string) (bool, error)
- 文字列
s
を真偽値にパースします。"true"
,"false"
,"1"
,"0"
などが有効です。
- 旧:
-
Btoa
->FormatBool
:- 旧:
strconv.Btoa(b bool) string
- 新:
strconv.FormatBool(b bool) string
- 真偽値
b
を文字列"true"
または"false"
にフォーマットします。
- 旧:
-
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
型に変換されます。
- 旧:
-
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
と同様にbase
とbitSize
を指定します。
- 旧:
-
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)を指定します。
- 旧:
-
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)を指定します。
- 旧:
-
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)を指定します。
- 旧:
-
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設計における一貫性と可読性の向上という哲学を反映しています。
具体的には、以下のような変換が行われています。
-
Atob
->ParseBool
:- 旧:
strconv.Atob(s string) (bool, error)
- 新:
strconv.ParseBool(s string) (bool, error)
- 文字列
s
を真偽値にパースします。"true"
,"false"
,"1"
,"0"
などが有効です。
- 旧:
-
Btoa
->FormatBool
:- 旧:
strconv.Btoa(b bool) string
- 新:
strconv.FormatBool(b bool) string
- 真偽値
b
を文字列"true"
または"false"
にフォーマットします。
- 旧:
-
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
型に変換されます。
- 旧:
-
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
と同様にbase
とbitSize
を指定します。
- 旧:
-
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)を指定します。
- 旧:
-
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)を指定します。
- 旧:
-
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)を指定します。
- 旧:
-
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言語のメーリングリストやデザインドキュメントに存在する可能性がありますが、今回の情報源からは直接参照していません。)