MST
星途 面试题库

面试题:Go语言字符串格式化中如何处理复杂结构体

给定一个包含嵌套结构体和切片的复杂Go语言结构体类型,例如:```go type Inner struct { Value int } type Outer struct { Name string InnerSlice []Inner }``` 要求使用`fmt.Sprintf`将该结构体格式化为特定字符串,格式为`Name: [InnerValue1, InnerValue2, ...]`,请编写代码实现。同时说明在格式化过程中可能遇到的问题及解决方法。
15.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
)

type Inner struct {
    Value int
}

type Outer struct {
    Name       string
    InnerSlice []Inner
}

func formatOuter(outer Outer) string {
    var innerValuesStr string
    for i, inner := range outer.InnerSlice {
        if i > 0 {
            innerValuesStr += ", "
        }
        innerValuesStr += fmt.Sprintf("%d", inner.Value)
    }
    return fmt.Sprintf("%s: [%s]", outer.Name, innerValuesStr)
}

格式化过程中可能遇到的问题及解决方法:

  1. 空切片处理:如果InnerSlice为空,代码需要正确处理,生成Name: []的格式。上述代码通过直接在空切片时生成空字符串来处理。
  2. 性能问题:在循环中使用fmt.Sprintf和字符串拼接可能会有性能问题。在大量数据场景下,可以考虑使用strings.Builder来提高性能。例如:
func formatOuterWithBuilder(outer Outer) string {
    var sb strings.Builder
    sb.WriteString(outer.Name)
    sb.WriteString(": [")
    for i, inner := range outer.InnerSlice {
        if i > 0 {
            sb.WriteString(", ")
        }
        fmt.Fprintf(&sb, "%d", inner.Value)
    }
    sb.WriteString("]")
    return sb.String()
}

这里使用strings.Builder避免了每次字符串拼接都创建新的字符串,提高了性能。