Golang String

tv6aics1  于 2023-11-14  发布在  Go
关注(0)|答案(2)|浏览(129)

我有下面的代码,

package main
import "fmt"

func main() {
    var s1 []int
    //s2 := []int{}

    fmt.Printf("%d, %d, %T, %t, %#[3]v\n", len(s1), cap(s1), s1, s1 == nil)
}

字符串
并且输出是,

0, 0, []int, true, []int(nil)


我真的很困惑“%[3]v”的使用,..因为我只传递4个参数.
我期待的输出是

0, 0, []int, true


但输出中的“[]int(nil)”让我有点困惑。

lyfkaqu1

lyfkaqu11#

你可以在fmt package documentation中查看:
由于显式索引会影响后续的动词,因此可以使用此表示法通过重置第一个参数的索引来多次打印相同的值:fmt.Sprintf("%d %d %#[1]x %#x", 16, 17)将产生“16 17 0x10 0x11”。
因此,在您的特定示例中,使用%#[3]v,您将再次以默认格式%v打印nil切片[]int(nil)的第三个参数。

emeijp43

emeijp432#

如果你想得到0, 0, []int, true,请使用这个:

fmt.Printf("%d, %d, %T, %t\n", len(s1), cap(s1), s1, s1 == nil)

字符串
密码:

fmt.Printf("%d, %d, %T, %t, %#[3]v\n", len(s1), cap(s1), s1, s1 == nil)


%#[3]v引用第三个参数,即s1。[]int(nil)是整数的空切片的默认表示。

相关问题