在Go中,我想在整数数组中找到最后一个元素。
我有一个清单:
[0.0.1, 0.0.2, 0.0.3]
我只是想:
0.0.3
每当我尝试返回最后一个元素时,控制台都会返回
%!(EXTRA uint8=10)
我认为这意味着我需要将字节数组转换为切片?
这是我的代码:
cmd := exec.Command("git", "tag")
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
fmt.Printf("Variable Type:\n%s\n", reflect.TypeOf(out))
fmt.Printf("Variable:\n%s\n", (out))
slice := out[0: len(out)]
releaseVersion := slice[len(slice) - 1]
fmt.Printf("release version:", releaseVersion)
这是输出:
Variable Type:
[]uint8
Variable:
0.0.1
0.0.2
0.0.3
release version:%!(EXTRA uint8=10)
您看到的原因%!(EXTRA uint8=10)
是:您正在呼叫时Printf
没有格式选项。您应该打电话给fmt.Println
。
10
是换行符的编码。
现在,您要问的问题:
您有一个字节数组(切片)。
您试图将其解释为行(用“ \ n”分隔的字符串)。
将字节数组解释为字符串很容易(假设字节实际上代表了utf-8字符串):
// assume buf is []byte
var text = string(buf)
您要将其视为字符串列表。由于git tag
返回行,因此可以用'\ n'分割,也可以仅strings.Fields
按通用空格(包括换行符)进行调用;记录在这里:https : //golang.org/pkg/strings/#Fields
var parts = strings.Fields(text)
现在您可以轻松获取最后一个元素:
parts[len(parts)-1]
但是为了安全起见,您应该检查列表中是否包含某些元素,否则您将在越界访问时崩溃。
cmd := exec.Command("git", "tag")
bufOut, err := cmd.Output()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
textOut := string(bufOut)
parts := strings.Fields(textOut)
if len(parts) == 0 {
log.Fatal("No tags")
}
releaseVersion := parts[len(parts)-1]
fmt.Println("release version:", releaseVersion)
为什么这个原因是如此复杂?在JAVASCRIPT中,我可以执行pop()
其实不是那么复杂。这就是计算机的工作方式。程序运行时,它具有标准输出,该输出实质上是字节流。
我猜测javascript会自动为您执行此步骤:
textOut := string(bufOut)
parts := strings.Fields(textOut)
将程序输出转换为由新行分隔的字符串列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句