gpt4 book ai didi

string - 有什么方法可以在打印语句中没有 7、-48 .... 等的情况下以漂亮的方式显示输出?

转载 作者:数据小太阳 更新时间:2023-10-29 03:24:38 24 4
gpt4 key购买 nike

代码如下

fmt.Printf("%7s: %-48s\n", "IQN", annotations.Iqn)
fmt.Printf("%7s: %-16s\n", "Volume", args[0])
fmt.Printf("%7s: %-15s\n", "Portal", annotations.TargetPortal)
fmt.Printf("%7s: %-6s\n\n", "Size", annotations.VolSize)

最佳答案

没有,没有。

但是您可以编写一个实用函数来自动执行所有这些操作,您需要做的就是传递您想要 pretty-print 的键值对。

让我们用这种类型对键值建模:

type KeyValue struct {
Key string
Value interface{}
}

请注意,该值可以是任何类型,而不仅仅是 string 值。我们将在打印时使用默认格式。如果您想要默认格式以外的格式,您可以随时将其转换为您喜欢的 string,并将其设置为值。

pretty-print 实用函数(解释如下):

var aligns = map[bool]string{true: "-"}

func printKeyValues(keyRight, valueRight bool, kvs ...KeyValue) {
// First convert values to string and find max key and max value lengths:
values := make([]string, len(kvs))
maxKey, maxValue := 0, 0
for i, kv := range kvs {
if length := utf8.RuneCountInString(kv.Key); length > maxKey {
maxKey = length
}
values[i] = fmt.Sprint(kv.Value)
if length := utf8.RuneCountInString(values[i]); length > maxValue {
maxValue = length
}
}

// Generate format string:
fs := fmt.Sprintf("%%%s%ds: %%%s%ds|\n",
aligns[keyRight], maxKey+1, aligns[valueRight], maxValue+1)

// And now print the key-values:
for i, kv := range kvs {
fmt.Printf(fs, kv.Key, values[i])
}
}

测试它:

printKeyValues(false, true, []KeyValue{
{"IQN", "asdfl;kj"},
{"Volume", "asdf;lkjasdf"},
{"Portal", "asdf"},
{"Size", 12345678},
}...)

输出:

    IQN: asdfl;kj     |
Volume: asdf;lkjasdf |
Portal: asdf |
Size: 12345678 |

另一个测试:

printKeyValues(true, false, []KeyValue{
{"IQN", "asdfl;kj"},
{"Volume", "asdf;lkjasdf"},
{"Portal", "asdf"},
{"Size", 12345678},
}...)

输出:

IQN    :      asdfl;kj|
Volume : asdf;lkjasdf|
Portal : asdf|
Size : 12345678|

试试 Go Playground 上的例子。

解释

printKeyValues() 首先遍历键值对,然后通过调用 fmt.Sprint() 使用默认格式将值转换为 string 值。现在我们可以找到最大 key 长度和最大值长度。请注意,string 的长度不是 len(s),因为它返回 UTF-8 编码的字节长度(Go 在内存中存储字符串的方式)。我们使用 utf8.RuneCountInString() 而不是获取字符数(或更准确地说是 rune 的数量)。

一旦我们有了这个,我们就可以生成使用最大键长度和最大值长度的格式字符串。我们还将提供控制是否要将键和值左对齐或右对齐的可能性,在格式字符串中,这意味着 - 符号在右对齐的情况下。要在左侧的情况下获取空字符串 "",在右侧的情况下获取 "-",对于紧凑代码,我使用了一个简单的映射:

var aligns = map[bool]string{true: "-"}

false索引这个映射给出映射值类型的零值,即"",用true索引它将给出关联值,即 "-"。由于此映射始终相同,因此我将其移到了函数之外(小优化)。

我们使用 fmt.Sprintf() 生成格式字符串:

fs := fmt.Sprintf("%%%s%ds: %%%s%ds|\n",
aligns[keyRight], maxKey+1, aligns[valueRight], maxValue+1)

请注意,% 符号需要加倍,因为这在格式字符串中很特殊。

还有最后一项任务:使用生成的格式字符串打印所有键值对。

关于string - 有什么方法可以在打印语句中没有 7、-48 .... 等的情况下以漂亮的方式显示输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319427/

24 4 0
文章推荐: mysql - Golang 映射多结果
文章推荐: jquery - 使用 jquery 触发更改事件