在 Golang 中动态构建格式化字符串
Dynamically built formatting strings in Golang
我正在尝试在 Go 中动态创建格式化字符串。这个想法是使用格式化类型创建地图。然后循环遍历它们以输出各种类型。
最终结果是查看格式如何影响输出。
(我很欣赏该示例将产生相同的输出,但我会随着时间的推移将 f
更改为其他类型)
下面是一个例子:
import (
"fmt"
"strings"
)
var formats = []string{"%f", "%v"}
var f float32 = 1 << 24
func main() {
for format := range formats {
// Generate formatting string here
parts := "%q => " + format + "\n"
fmt.Printf(parts, format, f)
}
}
编译器在 parts:
行抱怨 int() 转换:
at line 11, file ch3/floating_point.go cannot convert "%q => " to type int
at line 11, file ch3/floating_point.go invalid operation: "%q => " + format` (mismatched types string and int)
我尝试加入字符串,但没有成功:
parts:= strings.Join([]string{"%q =>",format,"\n"), " ")
fmt.Printf(parts,format,f)
此外 fmt.Fprintf
也无济于事:
for format := range formats {
// Generate formatting string here
parts := fmt.Fprintf("%q => " + format, format, f)
fmt.Println(parts)
}
问题出在您的 for format := range formats
构造中。请记住,range formats
将 return 两个 值:切片中的实际值 * 及其索引(即第一个值)。所以 "%q => " + format + "\n"
实际上会尝试将 "%s => "
与数字迭代索引连接起来。
如果要遍历切片中包含的值,请使用以下循环:
for _, format := range formats {
// ...
}
见golang For and blank identifier
If you're looping over an array, slice, string, or map, or reading
from a channel, a range clause can manage the loop.
for key, value := range oldMap {
newMap[key] = value
}
数组范围的正确方法
for index, value := range formats {
如果你想跳过索引做
for _, value := range formats {
我正在尝试在 Go 中动态创建格式化字符串。这个想法是使用格式化类型创建地图。然后循环遍历它们以输出各种类型。
最终结果是查看格式如何影响输出。
(我很欣赏该示例将产生相同的输出,但我会随着时间的推移将 f
更改为其他类型)
下面是一个例子:
import (
"fmt"
"strings"
)
var formats = []string{"%f", "%v"}
var f float32 = 1 << 24
func main() {
for format := range formats {
// Generate formatting string here
parts := "%q => " + format + "\n"
fmt.Printf(parts, format, f)
}
}
编译器在 parts:
行抱怨 int() 转换:
at line 11, file ch3/floating_point.go cannot convert "%q => " to type int
at line 11, file ch3/floating_point.go invalid operation: "%q => " + format` (mismatched types string and int)
我尝试加入字符串,但没有成功:
parts:= strings.Join([]string{"%q =>",format,"\n"), " ")
fmt.Printf(parts,format,f)
此外 fmt.Fprintf
也无济于事:
for format := range formats {
// Generate formatting string here
parts := fmt.Fprintf("%q => " + format, format, f)
fmt.Println(parts)
}
问题出在您的 for format := range formats
构造中。请记住,range formats
将 return 两个 值:切片中的实际值 * 及其索引(即第一个值)。所以 "%q => " + format + "\n"
实际上会尝试将 "%s => "
与数字迭代索引连接起来。
如果要遍历切片中包含的值,请使用以下循环:
for _, format := range formats {
// ...
}
见golang For and blank identifier
If you're looping over an array, slice, string, or map, or reading from a channel, a range clause can manage the loop.
for key, value := range oldMap { newMap[key] = value }
数组范围的正确方法
for index, value := range formats {
如果你想跳过索引做
for _, value := range formats {