Golang中如何处理旧式API的问题
Golang中如何处理旧式API的问题
我正在处理一个旧式API。返回的数据是以换行符分隔的item:value键值对。
voipnumber:601234
pstnnumber:441133123456
我想访问每个元素,例如“voipnumber”和“pstnnumber”,我该如何实现?
问候
3 回复
嗨 skillian, 非常感谢。非常有帮助。
此致 mahan
更多关于Golang中如何处理旧式API的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中处理这种旧式API返回的换行符分隔的键值对数据,可以使用strings包进行分割解析。以下是两种常见实现方式:
方法1:使用strings.Split解析
package main
import (
"fmt"
"strings"
)
func parseKeyValuePairs(data string) map[string]string {
result := make(map[string]string)
lines := strings.Split(data, "\n")
for _, line := range lines {
if line == "" {
continue
}
parts := strings.SplitN(line, ":", 2)
if len(parts) == 2 {
result[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
}
}
return result
}
func main() {
apiResponse := `voipnumber:601234
pstnnumber:441133123456`
parsedData := parseKeyValuePairs(apiResponse)
// 访问具体元素
fmt.Println("VoIP Number:", parsedData["voipnumber"])
fmt.Println("PSTN Number:", parsedData["pstnnumber"])
}
方法2:使用Scanner逐行解析
package main
import (
"bufio"
"fmt"
"strings"
)
func parseWithScanner(data string) map[string]string {
result := make(map[string]string)
scanner := bufio.NewScanner(strings.NewReader(data))
for scanner.Scan() {
line := scanner.Text()
if line == "" {
continue
}
idx := strings.Index(line, ":")
if idx != -1 {
key := strings.TrimSpace(line[:idx])
value := strings.TrimSpace(line[idx+1:])
result[key] = value
}
}
return result
}
func main() {
apiResponse := `voipnumber:601234
pstnnumber:441133123456`
parsedData := parseWithScanner(apiResponse)
// 直接访问键值
if voip, exists := parsedData["voipnumber"]; exists {
fmt.Printf("VoIP号码: %s\n", voip)
}
if pstn, exists := parsedData["pstnnumber"]; exists {
fmt.Printf("PSTN号码: %s\n", pstn)
}
}
方法3:定义结构体并解析
package main
import (
"fmt"
"strings"
)
type PhoneNumbers struct {
VoIPNumber string
PSTNNumber string
}
func parseToStruct(data string) (*PhoneNumbers, error) {
result := &PhoneNumbers{}
lines := strings.Split(data, "\n")
for _, line := range lines {
if line == "" {
continue
}
parts := strings.SplitN(line, ":", 2)
if len(parts) != 2 {
continue
}
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
switch key {
case "voipnumber":
result.VoIPNumber = value
case "pstnnumber":
result.PSTNNumber = value
}
}
return result, nil
}
func main() {
apiResponse := `voipnumber:601234
pstnnumber:441133123456`
phoneData, err := parseToStruct(apiResponse)
if err != nil {
fmt.Println("解析错误:", err)
return
}
fmt.Printf("VoIP: %s\n", phoneData.VoIPNumber)
fmt.Printf("PSTN: %s\n", phoneData.PSTNNumber)
}
这些方法都能有效解析item:value格式的数据。第一种方法最简洁,第二种方法适合处理大文本,第三种方法提供了类型安全的结构化访问。根据实际需求选择合适的方法即可。

