まえがき
Go 1.1 のリリースノートをChatGPTで日本語に翻訳しました。
Go 1.1 Release Notes
次のバージョン:Go1.2のリリースノート(日本語訳)
前のバージョン:Go1のリリースノート(日本語訳)
リリースノート一覧:Goリリース情報
Go 1.1の紹介
2012年3月にリリースされたGoバージョン1 (略してGo 1またはGo 1.0)は、Go言語とライブラリに新たな安定期をもたらしました。この安定性は、世界中のGoユーザーとシステムの成長するコミュニティを育むのに役立ちました。それ以来、1.0.1、1.0.2、1.0.3といったいくつかの「ポイント」リリースが発行されました。これらのポイントリリースは既知のバグを修正しましたが、実装に対する重要でない変更は行われませんでした。
この新しいリリース、Go 1.1は、互換性の約束 を守りつつ、いくつかの重要な(もちろん後方互換性のある)言語の変更を追加し、(再び互換性のある)ライブラリの変更の長いリストを持ち、コンパイラ、ライブラリ、ランタイムの実装に大きな作業を含んでいます。焦点はパフォーマンスにあります。ベンチマークは最良でも不正確な科学ですが、多くのテストプログラムで顕著な、時には劇的な速度向上が見られます。Goのインストールを更新し再コンパイルするだけで、多くのユーザーのプログラムも改善されることを期待しています。この文書は、Go 1とGo 1.1の間の変更を要約しています。Go 1.1で動作するために修正が必要なコードはほとんどありませんが、このリリースで表面化するいくつかの稀なエラーケースがあり、それらが発生した場合には対処する必要があります。詳細は以下に記載されています。特に64ビット整数 とUnicodeリテラル の議論を参照してください。
言語の変更
Go互換性文書 は、Go 1言語仕様に従って書かれたプログラムが引き続き動作することを約束しており、その約束は維持されています。しかし、仕様を強化するために、いくつかのエラーケースの詳細が明確にされました。また、新しい言語機能もいくつかあります。
ゼロによる整数除算
Go 1では、定数ゼロによる整数除算はランタイムパニックを引き起こしました。
func f(x int) int {
return x/0
}
Go 1.1では、定数ゼロによる整数除算は合法なプログラムではなく、コンパイル時エラーとなります。
Unicodeリテラルのサロゲート
文字列およびルーンリテラルの定義が、サロゲートハーフを有効なUnicodeコードポイントの集合から除外するように精緻化されました。詳細はUnicode セクションを参照してください。
メソッド値
Go 1.1では、特定のレシーバー値にバインドされた関数であるメソッド値
が実装されました。たとえば、Writer値wがある場合、式w.Writeは常にwに書き込む関数であり、wを閉じ込めた関数リテラルと同等です。
func (p []byte) (n int, err error) {
return w.Write(p)
}
メソッド値は、与えられた型のメソッドから関数を生成するメソッド式とは異なります。メソッド式(*bufio.Writer).Writeは、型(*bufio.Writer)のレシーバーを持つ追加の最初の引数を持つ関数と同等です。
func (w *bufio.Writer, p []byte) (n int, err error) {
return w.Write(p)
}
更新: 既存のコードには影響しません。この変更は厳密に後方互換性があります。
戻り値の要件
Go 1.1以前では、値を返す関数は、関数の最後に明示的なreturnまたはpanicの呼び出しが必要でした。これは、プログラマーに関数の意味を明示させる簡単な方法でした。しかし、無限のforループのみを持つ関数のように、最後のreturnが明らかに不要な場合が多くあります。Go 1.1では、最後のreturnステートメントに関するルールがより寛容になりました。これは、関数が実行する最後のステートメントであることが保証される終了ステートメント
の概念を導入します。例として、条件のないforループや、各半分がreturnで終わるif-elseステートメントがあります。関数の最後のステートメントが構文的に終了ステートメントであることが示される場合、最後のreturnステートメントは必要ありません。このルールは純粋に構文的であり、コード内の値には注意を払わず、複雑な分析を必要としません。更新: この変更は後方互換性がありますが、冗長なreturnステートメントやpanicの呼び出しを含む既存のコードは手動で簡素化される可能性があります。そのようなコードはgo vetによって識別できます。
実装とツールの変更
gccgoのステータス
GCCのリリーススケジュールはGoのリリーススケジュールと一致しないため、gccgoのリリースにはいくらかのずれが避けられません。2013年3月に出荷されたGCCの4.8.0バージョンには、ほぼGo 1.1バージョンのgccgoが含まれています。そのライブラリはリリースより少し遅れていますが、最大の違いはメソッド値が実装されていないことです。2013年7月頃には、完全なGo 1.1実装を提供するgccgoを搭載したGCCの4.8.2が出荷されることを期待しています。
コマンドラインフラグの解析
gcツールチェーンでは、コンパイラとリンカがGoフラグパッケージと同じコマンドラインフラグ解析ルールを使用するようになりました。これは従来のUnixフラグ解析からの逸脱です。これにより、ツールを直接呼び出すスクリプトに影響を与える可能性があります。たとえば、go tool 6c -Fw -Dfooは今後、go tool 6c -F -w -D fooと書く必要があります。
64ビットプラットフォームでの int のサイズ
言語は、int型とuint型が32ビットまたは64ビットであるかを実装が選択できるようにしています。以前のGoの実装では、すべてのシステムでintとuintを32ビットにしていました。gcとgccgoの実装は現在、AMD64/x86-64などの64ビットプラットフォームでintとuintを64ビットにしています。これにより、64ビットプラットフォームで20億以上の要素を持つスライスの割り当てが可能になります。更新: ほとんどのプログラムはこの変更の影響を受けません。Goは異なる数値型
間の暗黙の変換を許可しないため、この変更によりコンパイルが停止するプログラムはありません。ただし、intが32ビットのみであるという暗黙の仮定を含むプログラムは動作が変わる可能性があります。たとえば、このコードは64ビットシステムでは正の数を、32ビットシステムでは負の数を出力します。
x := ^uint32(0) // xは0xffffffff
i := int(x) // iは32ビットシステムで-1、64ビットシステムで0xffffffff
fmt.Println(i)
32ビット符号拡張を意図したポータブルコード(すべてのシステムで-1を生成する)は、代わりに次のように記述します。
i := int(int32(x))
64ビットアーキテクチャでのヒープサイズ
64ビットアーキテクチャでは、最大ヒープサイズが数ギガバイトから数十ギガバイトに大幅に拡大されました。(正確な詳細はシステムに依存し、変更される可能性があります。)32ビットアーキテクチャでは、ヒープサイズは変更されていません。更新: この変更は、既存のプログラムに影響を与えることなく、より大きなヒープで実行できるようにするはずです。
Unicode
UTF-16で65535を超えるコードポイントを表現できるようにするために、Unicodeはサロゲートハーフを定義しています。これは、大きな値の組み立てにのみ使用されるコードポイントの範囲であり、UTF-16でのみ使用されます。このサロゲート範囲のコードポイントは、他の目的には違法です。Go 1.1では、この制約がコンパイラ、ライブラリ、ランタイムによって尊重されています。サロゲートハーフは、ルーン値として、UTF-8としてエンコードされたとき、またはUTF-16として単独でエンコードされたときに違法です。たとえば、ルーンからUTF-8への変換で遭遇した場合、エンコーディングエラーとして扱われ、置換ルーンutf8.RuneError(U+FFFD)を生成します。このプログラムは、
import "fmt"
func main() {
fmt.Printf("%+q\n", string(0xD800))
}
Go 1.0では"\ud800"を出力しましたが、Go 1.1では"\ufffd"を出力します。サロゲートハーフのUnicode値は、ルーンおよび文字列定数で違法になったため、’\ud800’や"\ud800"のような定数はコンパイラによって拒否されます。UTF-8エンコードされたバイトとして明示的に書かれた場合、そのような文字列は依然として作成できますが、たとえば"\xed\xa0\x80"のように。しかし、そのような文字列がルーンのシーケンスとしてデコードされると、たとえば範囲ループで、utf8.RuneError値のみを生成します。UTF-8でエンコードされたUnicodeバイトオーダーマークU+FEFFは、Goソースファイルの最初の文字として許可されるようになりました。バイトオーダーフリーのUTF-8エンコーディングでのその出現は明らかに不要ですが、一部のエディタはUTF-8エンコードされたファイルを識別する「マジックナンバー」としてマークを追加します。更新: サロゲートの変更によってほとんどのプログラムは影響を受けません。古い動作に依存するプログラムは、問題を回避するように修正する必要があります。バイトオーダーマークの変更は厳密に後方互換性があります。
レースデテクタ
ツールへの大きな追加はレースデテクタであり、同じ変数への同時アクセスによって引き起こされるプログラムのバグを見つける方法です。この新しい機能はgoツールに組み込まれています。現在のところ、Linux、Mac OS X、および64ビットx86プロセッサを搭載したWindowsシステムでのみ利用可能です。プログラムをビルドまたはテストするときに-raceフラグを設定して有効にします(たとえば、go test -race)。レースデテクタは別の記事
で文書化されています。
gc アセンブラ
intが64ビットに変更され、新しい内部関数の表現
が導入されたため、gcツールチェーンでのスタック上の関数引数の配置が変更されました。アセンブリで書かれた関数は、少なくともフレームポインタオフセットを調整するために修正する必要があります。更新: go vetコマンドは、アセンブリで実装された関数が実装するGo関数プロトタイプと一致することを確認します。
go コマンドの変更
go コマンドには、新しいGoユーザーの体験を向上させることを目的としたいくつかの変更が加えられました。まず、Goコードをコンパイル、テスト、または実行する際に、パッケージが見つからない場合に検索されたパスのリストを含む、より詳細なエラーメッセージを表示するようになりました。
$ go build foo/quxx
can't load package: package foo/quxx: cannot find package "foo/quxx" in any of:
/home/you/go/src/pkg/foo/quxx (from $GOROOT)
/home/you/src/foo/quxx (from $GOPATH)
次に、go getコマンドは、パッケージソースをダウンロードする際のデフォルトの宛先として$GOROOTを許可しなくなりました。go getコマンドを使用するには、有効な$GOPATH
が必要です。
$ GOPATH= go get code.google.com/p/foo/quxx
package code.google.com/p/foo/quxx: cannot download, $GOPATH not set. For more details see: go help gopath
最後に、前述の変更の結果として、$GOPATHと$GOROOTが同じ値に設定されている場合、go getコマンドも失敗します。
$ GOPATH=$GOROOT go get code.google.com/p/foo/quxx
warning: GOPATH set to GOROOT (/home/you/go) has no effect
package code.google.com/p/foo/quxx: cannot download, $GOPATH must not be set to $GOROOT. For more details see: go help gopath
go test コマンドの変更
go test
コマンドは、プロファイリングが有効な状態で実行されたときにバイナリを削除しなくなり、プロファイルを分析しやすくなりました。実装は-cフラグを自動的に設定するため、実行後に
$ go test -cpuprofile cpuprof.out mypackage
mypackage.testファイルはgo testが実行されたディレクトリに残ります。go test
コマンドは、ゴルーチンがブロックされている場所、つまりチャネル通信などのイベントを待っている場所を報告するプロファイリング情報を生成できるようになりました。この情報は、go testの-blockprofileオプションで有効にされるブロッキングプロファイルとして提示されます。詳細についてはgo help testを実行してください。
go fix コマンドの変更
通常go fixとして実行されるfix
コマンドは、Go 1以前のコードをGo 1 APIを使用するように更新する修正を適用しなくなりました。Go 1.1にプレGo 1コードを更新するには、まずGo 1.0ツールチェーンを使用してコードをGo 1.0に変換します。
ビルド制約
「go1.1」タグがデフォルトのビルド制約 のリストに追加されました。これにより、Go 1.1の新機能を活用しながら、以前のバージョンのGoとの互換性を維持することができます。Go 1.1以降のみでファイルをビルドするには、このビルド制約を追加します。
// +build go1.1
Go 1.0.xのみでファイルをビルドするには、逆の制約を使用します。
// +build !go1.1
追加プラットフォーム
Go 1.1ツールチェーンは、freebsd/arm、netbsd/386、netbsd/amd64、netbsd/arm、openbsd/386、openbsd/amd64プラットフォームの実験的サポートを追加しました。freebsd/armまたはnetbsd/armにはARMv6以降のプロセッサが必要です。Go 1.1はlinux/armでのcgoの実験的サポートを追加しました。
クロスコンパイル
クロスコンパイル時に、goツールはデフォルトでcgoサポートを無効にします。cgoを明示的に有効にするには、CGO_ENABLED=1を設定します。
パフォーマンス
Go 1.1 gcツールスイートでコンパイルされたコードのパフォーマンスは、ほとんどのGoプログラムで顕著に向上するはずです。Go 1.0に対する典型的な改善は約30%-40%であるように見えますが、時にはそれ以上、時にはそれ以下、または全くないこともあります。ツールとライブラリを通じて多くの小さなパフォーマンス駆動の調整があり、すべてをここにリストすることはできませんが、以下の主要な変更は注目に値します。
gcコンパイラは多くの場合でより良いコードを生成し、特に32ビットIntelアーキテクチャでの浮動小数点に顕著です。gcコンパイラは、ランタイム内のappendやインターフェース変換などのいくつかの操作を含む、より多くのインライン化を行います。Goマップの新しい実装により、メモリフットプリントとCPU時間が大幅に削減されました。ガベージコレクタはより並列化されており、複数のCPUで実行されるプログラムのレイテンシを削減できます。ガベージコレクタはまた、より正確になり、わずかなCPU時間を要しますが、特に32ビットアーキテクチャでヒープのサイズを大幅に削減できます。ランタイムとネットワークライブラリのより緊密な結合により、ネットワーク操作でのコンテキストスイッチが減少します。
標準ライブラリの変更
bufio.Scanner
bufio パッケージのテキスト入力をスキャンするためのさまざまなルーチン、ReadBytes 、ReadString 、特にReadLine は、単純な目的には不必要に複雑です。Go 1.1では、新しい型Scanner が追加され、行やスペースで区切られた単語のシーケンスとして入力を読み取るような単純なタスクを簡単に行えるようになりました。病的に長い行などの問題のある入力でスキャンを終了し、単純なデフォルト(行指向の入力で、各行の終端子を削除)を持つことで問題を簡素化します。以下は、入力を1行ずつ再現するコードです。
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text()) // Printlnは最後の'\n'を追加します
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
スキャン動作は、入力を細分化する関数を通じて調整できます(SplitFunc のドキュメントを参照)が、困難な問題やエラーを超えて続行する必要がある場合は、古いインターフェースが依然として必要になることがあります。
net
net
パッケージのプロトコル固有のリゾルバは、以前は渡されたネットワーク名に対して寛容でした。ドキュメントは、ResolveTCPAddr
に対して有効なネットワークは"tcp"、“tcp4”、“tcp6"のみであることを明確にしていましたが、Go 1.0の実装は任意の文字列を黙って受け入れていました。Go 1.1の実装は、ネットワークがこれらの文字列のいずれかでない場合にエラーを返します。他のプロトコル固有のリゾルバResolveIPAddr
、ResolveUDPAddr
、ResolveUnixAddr
についても同様です。ListenUnixgram
の以前の実装は、接続エンドポイントの表現としてUDPConn
を返していました。Go 1.1の実装は代わりにUnixConn
を返し、ReadFrom
およびWriteTo
メソッドで読み書きできるようにします。データ構造IPAddr
、TCPAddr
、UDPAddr
には、新しい文字列フィールドZoneが追加されました。タグなしの複合リテラル(例: net.TCPAddr{ip, port})を使用するコードは、新しいフィールドのために壊れるでしょう。Go 1の互換性ルールはこの変更を許可しています: クライアントコードはこのような破損を避けるためにタグ付きリテラルを使用する必要があります。更新: 新しい構造体フィールドによって引き起こされた破損を修正するために、go fixはこれらの型にタグを追加するようにコードを書き換えます。より一般的には、go vetはフィールドタグを使用するように修正すべき複合リテラルを識別します。
reflect
reflect
パッケージにはいくつかの重要な追加があります。reflectパッケージを使用して「select」ステートメントを実行することが可能になりました。詳細については、Select
とSelectCase
の説明を参照してください。新しいメソッドValue.Convert
(またはType.ConvertibleTo
)は、Value
上でGoの変換または型アサーション操作を実行する機能を提供します(またはその可能性をテストします)。新しい関数MakeFunc
は、既存のValues
を使用して関数を呼び出しやすくするためのラッパー関数を作成し、たとえば実際のintを形式的なinterface{}に渡すために標準のGo変換を行います。最後に、新しい関数ChanOf
、MapOf
、SliceOf
は、既存の型から新しいTypes
を構築します。たとえば、Tのみを与えられた場合に型[]Tを構築します。
time
FreeBSD、Linux、NetBSD、OS X、OpenBSDでは、以前のtime パッケージはマイクロ秒精度で時間を返していました。これらのシステムでのGo 1.1の実装は、ナノ秒精度で時間を返すようになりました。マイクロ秒精度で外部フォーマットに書き込み、それを読み戻して元の値を回復することを期待するプログラムは、精度の損失によって影響を受けます。Time の新しいメソッドRound とTruncate は、外部ストレージに渡す前に時間から精度を削除するために使用できます。新しいメソッドYearDay は、時間値で指定された年の1から始まる整数の日番号を返します。Timer 型には、新しいメソッドReset があり、指定された期間後にタイマーが期限切れになるように変更します。最後に、新しい関数ParseInLocation は、既存のParse と似ていますが、解析された文字列のタイムゾーン情報を無視して、ロケーション(タイムゾーン)のコンテキストで時間を解析します。この関数は、時間APIでの一般的な混乱の原因に対処します。更新: 低精度の外部フォーマットを使用して時間を読み書きする必要があるコードは、新しいメソッドを使用するように変更する必要があります。
Expと古いサブツリーがgo.expとgo.textサブリポジトリに移動
バイナリディストリビューションが必要に応じてそれらにアクセスしやすくするために、バイナリディストリビューションに含まれていないexpとoldソースサブツリーが、新しいgo.expサブリポジトリに移動されました。たとえば、ssaパッケージにアクセスするには、次のコマンドを実行します。
$ go get code.google.com/p/go.exp/ssa
そしてGoソースで、
import "code.google.com/p/go.exp/ssa"
古いパッケージexp/normも移動されましたが、新しいリポジトリgo.textに移動され、Unicode APIやその他のテキスト関連パッケージが開発されます。
新しいパッケージ
新しいパッケージが3つあります。
go/format パッケージは、プログラムがgo fmt コマンドのフォーマット機能にアクセスするための便利な方法を提供します。2つの関数があります。Node はGoパーサーNode をフォーマットし、Source は任意のGoソースコードをgo fmt コマンドによって提供される標準フォーマットに再フォーマットします。net/http/cookiejar パッケージは、HTTPクッキーを管理するための基本を提供します。runtime/race パッケージは、データレース検出のための低レベルの機能を提供します。これはレースデテクタに内部的に使用され、他のユーザーに見える機能はエクスポートされていません。
ライブラリの小さな変更
以下のリストは、ライブラリへのいくつかの小さな変更、主に追加を要約しています。各変更についての詳細は、関連するパッケージのドキュメントを参照してください。
新しい関数TrimPrefix とTrimSuffix があり、その特性は自明です。また、Buffer 型には、新しいメソッドGrow があり、バッファ内のメモリ割り当てをある程度制御します。最後に、Reader 型には新しいWriteTo メソッドがあり、io.WriterTo インターフェースを実装します。
新しいFlush
メソッドがあり、そのWriter
型の基礎となるflate.Writerをフラッシュします。
2つのMACを比較する新しい関数Equal があります。
PEMブロックをサポートするようになりました(たとえば、DecryptPEMBlock を参照)し、楕円曲線秘密鍵を解析する新しい関数ParseECPrivateKey があります。
接続の健全性をテストする新しいPing メソッドがあります。
パフォーマンスを向上させるためにConn が実装できる新しいQueryer インターフェースがあります。
Decoder には、バッファ内の残りのデータにアクセスするための新しいメソッドBuffered と、新しい型Number (文字列)に値をアンマーシャルするための新しいメソッドUseNumber があります。
エスケープされたXML出力を書き込む新しい関数EscapeText と、インデントされた出力を指定するためのEncoder のメソッドIndent があります。
新しい型CommentMap と関連するメソッドが、Goプログラムでコメントを抽出および処理するのを容易にします。
パーサーがコード全体でTODO(joe)のようなスタイライズされた注釈をよりよく追跡するようになり、godoc
コマンドが-notesフラグの値に応じて情報をフィルタリングまたは表示できます。
文書化されていない部分的に実装された「noescape」機能が削除されました。それに依存するプログラムは壊れます。
プログレッシブJPEGファイルを読み取り、いくつかのサブサンプリング構成を処理します。
1バイトずつ書き込む共通の機能をキャプチャするためにio.ByteWriter インターフェースをエクスポートします。また、データを提供せずにループしていることを示すために使用される新しいエラーErrNoProgress をエクスポートします。
OS固有のログ機能をよりよくサポートします。
Int
型には、JSON表現に変換するためのメソッドMarshalJSON
とUnmarshalJSON
があります。また、Int
は、Uint64
とSetUint64
を使用して、uint64に直接変換でき、Rat
はFloat64
とSetFloat64
を使用してfloat64に同様に変換できます。
出力をパッケージ化するために使用される境界セパレータを定義するためのWriter
の新しいメソッドSetBoundary
があります。Reader
も、引用符付き印刷可能な部分を透過的にデコードし、そうする際にContent-Transfer-Encodingヘッダーを削除します。
ListenUnixgram
関数は、戻り値の型が変更されました。現在はUnixConn
を返し、以前のUDPConn
は明らかにGo 1.0の間違いでした。このAPI変更はバグを修正するため、Go 1の互換性ルールで許可されています。
net
パッケージには、新しい型Dialer
が追加され、Dial
にオプションを提供します。
net
パッケージは、ゾーン修飾子を持つリンクローカルIPv6アドレス(例: fe80::1%lo0)をサポートします。アドレス構造IPAddr
、UDPAddr
、TCPAddr
は、新しいフィールドにゾーンを記録し、これらのアドレスの文字列形式を期待する関数(例: Dial
、ResolveIPAddr
、ResolveUDPAddr
、ResolveTCPAddr
)は、ゾーン修飾形式を受け入れるようになりました。
net
パッケージは、解決関数のスイートにLookupNS
を追加しました。LookupNSはホスト名のNSレコード
を返します。
net
パッケージは、IPConn
(ReadMsgIP
とWriteMsgIP
)およびUDPConn
(ReadMsgUDP
とWriteMsgUDP
)にプロトコル固有のパケット読み書きメソッドを追加しました。これらは、パケットに関連付けられたアウトオブバンドデータにアクセスするためのPacketConn
のReadFromおよびWriteToメソッドの特殊バージョンです。
net
パッケージは、接続の半分を閉じるためのメソッドをUnixConn
に追加しました(CloseRead
とCloseWrite
)、既存のTCPConn
のメソッドと一致します。
ParseTime
は、いくつかの一般的なHTTP時間形式を試して時間文字列を解析します。Request
のPostFormValue
メソッドは、FormValue
と似ていますが、URLパラメータを無視します。CloseNotifier
インターフェースは、クライアントが切断されたときにサーバーハンドラが発見するメカニズムを提供します。ServeMux型には、パスのハンドラにアクセスするためのHandler
メソッドがありますが、実行はしません。Transportは、CancelRequest
でフライト中のリクエストをキャンセルできるようになりました。最後に、Transportは、Response.Body
が完全に消費される前に閉じられたときに、TCP接続をより積極的に閉じるようになりました。
RFC 5322形式のメールアドレスをAddress 構造に解析するための新しい関数ParseAddress とParseAddressList があります。
Client 型には、新しいメソッドHello があり、サーバーにHELOまたはEHLOメッセージを送信します。
先頭と末尾のスペースをASCIIのみでトリミングする新しい関数TrimBytes とTrimString があります。新しいメソッドos.FileMode.IsRegular は、ファイルが通常のファイルかどうかを簡単に確認できます。
新しい関数Stop があり、チャネルにさらなるシグナルを配信するのを停止します。
Regexp.Longest メソッドを通じてUnixオリジナルの最左最長一致をサポートし、Regexp.Split は正規表現で定義されたセパレータに基づいて文字列を分割します。
メモリ使用量に関する3つの新しい関数があります。FreeOSMemory 関数はガベージコレクタの実行をトリガーし、未使用のメモリをオペレーティングシステムに返そうとします。ReadGCStats 関数はコレクタに関する統計を取得し、SetGCPercent はコレクタがどのくらい頻繁に実行されるかを制御するプログラム的な方法を提供し、完全に無効にすることもできます。
新しい関数Reverse
があります。sort.Sort
の呼び出しの引数をReverseでラップすると、ソート順序が逆になります。
TrimPrefix とTrimSuffix という自明な特性を持つ2つの新しい関数があり、新しいメソッドReader.WriteTo が追加され、Reader 型がio.WriterTo インターフェースを実装するようになりました。
Fchflags
関数は、さまざまなBSD(Darwinを含む)でシグネチャが変更されました。現在は、最初のパラメータとして文字列ではなくintを取ります。このAPI変更はバグを修正するため、Go 1の互換性ルールで許可されています。
サポートされている各オペレーティングシステムの定数とシステムコールをより包括的にするための多くの更新も受けています。
新しいAllocsPerRun
関数を使用して、テストとベンチマークでの割り当て統計の生成を自動化します。また、testing.B
のReportAllocs
メソッドは、呼び出し元のベンチマークのメモリ割り当て統計の印刷を有効にします。また、BenchmarkResult
のAllocsPerOp
メソッドも導入されています。また、-vコマンドラインフラグの状態をテストするための新しいVerbose
関数と、不適切なテストをスキップするためのtesting.B
およびtesting.T
の新しいSkip
メソッドがあります。
テンプレートがパイプラインの要素をグループ化するために括弧を使用できるようになり、複雑なパイプラインの構築が簡素化されました。また、新しいパーサーの一部として、Node インターフェースには、エラー報告を改善するための2つの新しいメソッドが追加されました。これはGo 1の互換性ルールに違反していますが、このインターフェースは明示的にtext/template およびhtml/template パッケージでのみ使用されることを意図しており、それを保証するための安全策があります。
Unicodeバージョン6.2.0に更新されました。
新しい関数ValidRune が、ルーンが有効なUnicodeコードポイントであるかどうかを報告します。有効であるためには、ルーンは範囲内であり、サロゲートハーフであってはなりません。