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格式的数据。第一种方法最简洁,第二种方法适合处理大文本,第三种方法提供了类型安全的结构化访问。根据实际需求选择合适的方法即可。

回到顶部