当前位置: 首页 > 面试题库 >

为什么我不能做fmt.Sprintf(“%d。%d。%d。%d”,a ...)?

壤驷旭
2023-03-14
问题内容

我正在学习Go,并且一直沉迷于Go旅游(exercise-
stringer.go:https :
//tour.golang.org/methods/7)。

这是一些代码:

type IPAddr [4]byte  
// TODO: Add a "String() string" method to IPAddr.
func (a IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", a...)
}

所以我想出了IPAddris 的内部表示[4]byte,所以散布算子起作用了。但我得到:

cannot use []string literal (type []string) as type []interface {} in argument to fmt.Sprintf

有没有搞错?字符串切片也不起作用,这是怎么回事?

编辑 :对不起,我的问题中有一个错误-
错误是关于type的IPAddr,不是[]string。我在玩代码,并且粘贴了错误的输出。无论如何,多亏了peterSO和0x434D53关于Go中切片的不变性。

好吧,这提出了另一个问题。为什么以这种方式实施?我想您只是有一些Iterable接口,所以实现它的任何结构都将“正常工作”。

旁注
:当我第一次听说Go时,有一个大胆的声明“已编译,但富有表现力”。显式接口实现是一个很好的例子,但是诸如显式转换,缺少运算符重载之类的事情给我“
90年代Java的感觉”。很难过,因为Go似乎是一门很棒的语言。


问题答案:

围棋之旅

练习:纵梁

使IPAddr类型工具fmt.Stringer将地址打印为点分四边形。

例如,IPAddr{1, 2, 3, 4}应打印为"1.2.3.4“。

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.

func main() {
  addrs := map[string]IPAddr{
      "loopback":  {127, 0, 0, 1},
      "googleDNS": {8, 8, 8, 8},
  }
  for n, a := range addrs {
      fmt.Printf("%v: %v\n", n, a)
  }
}

有没有隐式转换[]string[]interface {}。见转换中的围棋语言的编程规范。您需要提供显式转换。例如,

package main

import "fmt"

type IPAddr [4]byte

// A "String() string" method for IPAddr.
func (a IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3])
}

func main() {
    addrs := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for n, a := range addrs {
        fmt.Printf("%v: %v\n", n, a)
    }
}

输出:

loopback: 127.0.0.1
googleDNS: 8.8.8.8


 类似资料:
  • 问题内容: D在什么 设置系统属性值。 在的Java应用程序启动立场?由于某种原因,它一直困扰着我,为什么是D? 问题答案: 我一直认为它是 定义 属性的值……可能是C编译器的遗留物,通常与代码中的用法相似。 编辑:目前,我对此来源最接近的是一些JDK 1.1文档 ,该文档将标志指定为: 重新定义 属性值。propertyName是要更改其值的属性的名称,而newValue是要将其更改为的值。[…

  • 我想知道为什么我们需要std::promise和std::future?为什么c 11标准将get和set_ value分为两个独立的类std::future和std::promise?在这篇文章的回答中,它提到: 它被分成这两个独立的“接口”的原因是为了对“消费者/阅读器”隐藏“写入/设置”功能。 我不明白躲在这里的好处。但是,如果我们只有一个类的“未来”,那不是更简单吗?例如:promise.

  • \D

    描述 (Description) 字符类\D匹配任何非数字。 例子 (Example) 以下示例显示了预定义字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PredefinedCharacterClassDemo { pr

  • \d

    描述 (Description) 字符类\d匹配0到9之间的任何数字。 例子 (Example) 以下示例显示了预定义字符类匹配的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PredefinedCharacterClassDemo {

  • 问题内容: 我试图实施Miller- Rabin素数测试 ,并且对为什么中型数字(〜7位数字)花费如此长时间(> 20秒)感到困惑。我最终发现以下代码行是问题的根源: (其中,和都是相似的,但不相等的中号,是幂运算符,并且是模运算符) 然后,我尝试将其替换为以下内容: 相比之下,它几乎是瞬时的。 对于上下文,这是原始功能: 定时计算示例: 输出(与PyPy 1.9.0一起运行): 输出(在Pyth

  • 本文向大家介绍\ d与\ D在JavaScript中?,包括了\ d与\ D在JavaScript中?的使用技巧和注意事项,需要的朋友参考一下 \ d与\ D \ d和\ D之间有很多区别,其中前者导致数字,而后者导致非数字,例如e,^等。它们与全局对象“ g ”一起使用,因此所有文本中的数字和非数字将显示在输出中。让我们详细讨论它。 语法1 语法2 示例1 在以下示例中,将' \ d '与全局对