モジュール 8 · レッスン 2 / 5コース内の 37/50~12 min
モジュールのレッスン (2/5)
`strings` と `strconv`
strings と strconv は、常に使用する 2 つのパッケージです。 1 つ目は文字列を操作します (分割、トリム、置換、検索)。 2 つ目は文字列と基本型 (int、float、bool) の間で変換します。
strings: 毎日実行する機能
Go
import "strings"
strings.ToUpper("ciao") // "CIAO"
strings.ToLower("CIAO") // "ciao"
strings.Contains("ciao mondo", "mo") // true
strings.HasPrefix("foo.txt", "foo") // true
strings.HasSuffix("foo.txt", ".txt") // true
strings.Index("ciao", "a") // 2 (or -1 if absent)
strings.Count("banana", "a") // 3
strings.Split("a,b,c", ",") // []string{"a","b","c"}
strings.SplitN("a,b,c,d", ",", 2) // []string{"a","b,c,d"}
strings.Join([]string{"a","b"}, "-") // "a-b"
strings.TrimSpace(" ciao\n") // "ciao"
strings.Trim("__ciao__", "_") // "ciao"
strings.ReplaceAll("aaa", "a", "b") // "bbb"
strings.Replace("aaa", "a", "b", 2) // "bba" (limit 2)割り当てを行わずに大文字と小文字を区別しない比較を行う EqualFold バリアントや、1 行解析を行う Cut(s, sep) (before, after, found) バリアントもあります。
Go
key, val, ok := strings.Cut("name=Ada", "=")
// "name", "Ada", truestrings.Builder ループ内で連結します
ループ内の連結 s = s + "x" は、反復ごとに割り当てを行います (文字列は不変です)。複数のステップで作成されたテキストの場合は、strings.Builder を使用します。
Go
var b strings.Builder
for i := 0; i < 1000; i++ {
b.WriteString("x")
}
out := b.String()償却された割り当て、無駄なコピーはありません。
strconv: 文字列 ↔ 数値 / ブール値の変換
Go
import "strconv"
n, err := strconv.Atoi("42") // int from decimal
s := strconv.Itoa(42) // "42"
b, err := strconv.ParseBool("true")
// Generic versions with base and optional bit-size
i64, err := strconv.ParseInt("ff", 16, 64) // 255
u64, err := strconv.ParseUint("7", 10, 8) // 7
f, err := strconv.ParseFloat("3.14", 64) // 3.14
// Number → string
strconv.FormatInt(255, 16) // "ff"
strconv.FormatFloat(3.14, 'f', 2, 64) // "3.14"
strconv.FormatBool(true) // "true"Atoi/Itoa は人間工学に基づいたショートカットです。ベースとサイズを細かく制御するには、ParseInt/FormatInt を使用します。
解析エラーの処理
Atoi は (int, error) を返します。エラーはほとんどの場合 *strconv.NumError であり、errors.Is を介してセンチネル strconv.ErrSyntax または strconv.ErrRange と比較できます。
Go
n, err := strconv.Atoi(input)
switch {
case errors.Is(err, strconv.ErrSyntax):
return fmt.Errorf("input non numerico: %q", input)
case errors.Is(err, strconv.ErrRange):
return fmt.Errorf("numero fuori range: %q", input)
case err != nil:
return err
}
_ = n演習
運動#go.m8.l2.e1
試行回数: 0読み込み中…
文字列「a,b,c」をコンマで分割し、結果のスライスを出力します。
エディターを読み込み中…
3 回の試行後に解決策が利用可能になります
運動#go.m8.l2.e2
試行回数: 0読み込み中…
strconv.Atoi を使用して文字列 '42' を int に変換し、エラーを処理して数値を出力します。
エディターを読み込み中…
3 回の試行後に解決策が利用可能になります
Quiz#go.m8.l2.e3
準備完了整数 42 を文字列「42」に変換する慣用的な方法は何ですか?
Go
s := ???(42)
// vogliamo s == "42"