Rumah >pembangunan bahagian belakang >Golang >Apakah persamaan Go dengan `string.format` Python dan bagaimana ia membandingkan dalam fleksibiliti dan kefungsian?

Apakah persamaan Go dengan `string.format` Python dan bagaimana ia membandingkan dalam fleksibiliti dan kefungsian?

Susan Sarandon
Susan Sarandonasal
2024-12-29 17:56:20894semak imbas

What are the Go equivalents to Python's `string.format` and how do they compare in flexibility and functionality?

Setara dengan Python string.format dalam Go?

Dalam Python, anda boleh menggunakan string.format untuk memasukkan nilai ke dalam rentetan dengan ruang letak seperti ini:

"File {file} had error {error}".format(file=myfile, error=err)

Go mempunyai fungsi setara yang dipanggil Sprintf, yang berfungsi dengan cara yang serupa:

fmt.Sprintf("File %s had error %s", myfile, err)

Walau bagaimanapun, Sprintf mempunyai had: ia memerlukan susunan parameter dalam rentetan format untuk memadankan susunan argumen. Ini boleh menjadi masalah untuk pengantarabangsaan (I18N), di mana susunan pemegang tempat mungkin berbeza-beza bergantung pada bahasa.

Menggunakan teks/template

Go menyediakan alternatif yang lebih fleksibel kepada Sprintf dipanggil teks/templat. Ia membolehkan lebih kawalan ke atas pemformatan, termasuk keupayaan untuk menentukan susunan pemegang tempat:

package main

import (
    "bytes"
    "text/template"
    "os"
)

func main() {
    type Params struct {
        File string
        Error string
    }

    var msg bytes.Buffer

    params := &Params{
        File: "abc",
        Error: "def",
    }

    tmpl, _ := template.New("errmsg").Parse("File {{.File}} has error {{.Error}}")
    tmpl.Execute(&msg, params)
    msg.WriteTo(os.Stdout)
}

Pendekatan berasaskan templat ini membolehkan lebih fleksibiliti dan kawalan ke atas pemformatan rentetan.

Dengan rentetan.Pengganti

Rentetan.Pengganti jenis boleh digunakan untuk melaksanakan pemformat yang membenarkan pemegang tempat dengan nama tersuai:

package main

import (
    "fmt"
    "strings"
)

func main() {
    file, err := "/data/test.txt", "file not found"

    log("File {file} had error {error}", "{file}", file, "{error}", err)
}

func log(format string, args ...string) {
    r := strings.NewReplacer(args...)
    fmt.Println(r.Replace(format))
}

Pendekatan ini mudah dan mudah digunakan.

Menggunakan indeks hujah eksplisit

Pilihan lain ialah menggunakan indeks hujah eksplisit dalam rentetan format, membenarkan ruang letak untuk digunakan semula beberapa kali:

fmt.Printf("File %[1]s had error %[1]s", myfile, err)

Pendekatan ini kurang serba boleh berbanding yang sebelumnya tetapi boleh berguna untuk kes mudah.

Atas ialah kandungan terperinci Apakah persamaan Go dengan `string.format` Python dan bagaimana ia membandingkan dalam fleksibiliti dan kefungsian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn