2 回答
TA贡献1831条经验 获得超9个赞
我希望这是你想要的。我也对代码进行了注释,以便您理解。
package main
import (
"fmt"
"strconv"
)
// type alias for [10]int
type istr [10]int
// istr implements fmt.Stringer interface
// String formats the integer array to a string array
func (a istr) String() string {
var s string = "["
for i := 0; i < 9; i++ {
s += strconv.Itoa(a[i]) + " "
}
s += strconv.Itoa(a[9]) + "]"
return s
}
func main() {
// Original
var a [10]int
fmt.Println("Original Array")
fmt.Println(a)
// Modified
a[2] = 2
fmt.Println("Modified Array")
fmt.Println(a)
// Expected
var b istr
b[2] = 2
fmt.Println("String Array")
fmt.Println(b)
}
更新:
添加可以扩展更多类型的通用解决方案。目前,它可以将 rune/int/bool 的 slice 转换为 string。
package main
import (
"fmt"
"strconv"
"strings"
)
func ToString(iv interface{}) string {
var sb strings.Builder
switch iv := iv.(type) {
case []int:
var length = len(iv)
if length == 0 {
return "[]"
}
sb.WriteRune('[')
for i := 0; i < length-1; i++ {
sb.WriteString(strconv.Itoa(iv[i]))
sb.WriteRune(' ')
}
sb.WriteString(strconv.Itoa(iv[length-1]))
sb.WriteRune(']')
case []bool:
var length = len(iv)
if length == 0 {
return "[]"
}
sb.WriteRune('[')
for i := 0; i < length-1; i++ {
sb.WriteString(strconv.FormatBool(iv[i]))
sb.WriteRune(' ')
}
sb.WriteString(strconv.FormatBool(iv[length-1]))
sb.WriteRune(']')
case []rune:
var length = len(iv)
if length == 0 {
return "[]"
}
sb.WriteRune('[')
for i := 0; i < length-1; i++ {
sb.WriteRune(iv[i])
sb.WriteRune(' ')
}
sb.WriteRune(iv[length-1])
sb.WriteRune(']')
}
return sb.String()
}
func main() {
// Original
var a []int = make([]int, 10)
fmt.Println("Original Slice")
fmt.Println(a)
// Modified
a[2] = 2
fmt.Println("Modified Slice")
fmt.Println(a)
// String
fmt.Println("String Slice")
fmt.Println(ToString(a))
// Boolean
fmt.Println("Boolean Slice")
var b []bool = make([]bool, 10)
b[2] = true
fmt.Println(ToString(b))
fmt.Println("Rune Slice")
var r []rune = make([]rune, 10)
r[0] = 'a'
r[1] = 'c'
fmt.Println(ToString(r))
}
TA贡献2065条经验 获得超14个赞
包的任何变量都会检查其Stringer接口的实现。如果它实现了Stringer接口,它会自动隐式调用String函数。
package main
import (
"fmt"
)
// type alias for [10]int
type StringerIntArray [10]int
// String formats the StringerIntArray ([10]int) to a string
func (a StringerIntArray) String() string {
var s string = "My Array is: "
for i := 0; i < 9; i++ {
s += fmt.Sprint(a[i]," ")
}
s = s[:len(s)-1]
s+=" With Length:"+fmt.Sprint(len(a))
return s
}
func main() {
// Original
var a [10]int
fmt.Println("Original Array")
fmt.Println(a)
// Modified
a[2] = 2
fmt.Println("Modified Array")
fmt.Println(a)
// Expected
var b StringerIntArray
b[2] = 2
fmt.Println("String Array")
fmt.Println(b)
}
https://play.golang.org/p/lE5gnHXGGF4
内置类型定义了默认的字符串格式;如果你需要修改它,你必须创建一个自定义类型并附加一个字符串函数
同样通过阅读您的评论,我想添加 fmt 包知道如何格式化不同类型的数据,但有时您想制作输出字符串;是的,fmt 的输出是字符串,如果使用 Sprint、Sprintf 函数,您可以取回字符串
你可以在这里阅读更多关于它的信息 https://tour.golang.org/methods/17 https://golang.org/pkg/fmt/#Stringer
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报
