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 關注
- 171 瀏覽
添加回答
舉報
