如何解决为什么我不能做fmt.Sprintf“%d%d%d%d”,a ...?
练习:纵梁
使
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
解决方法
我正在学习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...)
}
所以我想出了IPAddr
is 的内部表示[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似乎是一门很棒的语言。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。