golang:如何在循环中填充多结构映射?

我有客户与 API 交互的日志文件。我想解析这些日志并将结果提供给结构映射,以便我可以将数据组织成有用的信息。例如,我想响应以下查询:“显示每个用户每天的请求总数”。


我已经创建了一个看起来足够的结构来保存数据。但是,当我尝试运行该程序时,出现错误:invalid operation: dates[fields[1]] (type *Dates does not support indexing) [process exited with non-zero status].


http://play.golang.org/p/8u3jX26ktt


package main


import (

    "fmt"

    "strings"

)


type Stats struct {

    totalNumberOfRequests int

}

type Customer struct {

    listOfCustomers map[string]Stats // map[customerid]Stats

}

type Dates struct {

    listOfDates map[string]Customer // map[date]Customer

}


var requestLog = []string{

    "2011-10-05, 1234, apiquery",

    "2011-10-06, 1234, apiquery",

    "2011-10-06, 5678, apiquery",

    "2011-10-09, 1234, apiquery",

    "2011-10-12, 1234, apiquery",

    "2011-10-13, 1234, apiquery",

}


func main() {

    dates := new(Dates)

    for _, entry := range requestLog {

        fmt.Println("entry:", entry)

        fields := strings.Split(entry, "'")

        dates.listOfDates[fields[0]].listOfCustomers[fields[1]].totalNumberOfRequests++

    }

}

有没有更好的结构可以使用?或者有没有办法让这个结构适合这个特定目的?


墨色风雨
浏览 146回答 1
1回答

守着星空守着你

如果我理解您对输出的期望,这里有一个解决方案。但是我不喜欢“客户是一个带有 id 和 Stat 的地图......我认为它应该是一个更简单的结构,有两个字段(cid string和stat Stats)。而且日期结构不允许在同一日期有多个客户,所以我已更改为将单个日期映射到用户列表。我还添加了更多“测试场景”以涵盖客户在同一日期多次访问资源的情况。您似乎没有使用您的示例中的“apiquery”,因此下面的代码与它不匹配。关于结构中指针的更改 - 请参阅此问题(如对您的问题的评论所述)package mainimport (    "fmt"    "strings")type Stats struct {    totalNumberOfRequests int}type Customer struct {    customerWithStat map[string]*Stats // a customer with it's corresponding stats}type Dates struct {    listOfDates map[string][]*Customer // map[date]list of customers (for each date)}var requestLog = []string{    "2011-10-05, 1234, apiquery",    "2011-10-06, 5678, apiquery",    "2011-10-06, 1234, apiquery",    "2011-10-06, 1234, apiquery",    "2011-10-06, 5678, apiquery",    "2011-10-06, 1234, apiquery",    "2011-10-09, 1234, apiquery",    "2011-10-12, 1234, apiquery",    "2011-10-13, 1234, apiquery",    "2011-10-13, 1234, apiquery",    "2011-10-06, 1234, apiquery",}func main() {    listOfDates := make(map[string][]*Customer)    dates := Dates{listOfDates}    for _, entry := range requestLog {        fields := strings.Split(entry, ",")        curDateStr := strings.TrimSpace(fields[0])        curCustIdStr := strings.TrimSpace(fields[1])        if customersAtDate, dateExists := dates.listOfDates[curDateStr]; dateExists {            // Date already exist            for _, curCustomer := range customersAtDate {                if curStat, customerExists := curCustomer.customerWithStat[curCustIdStr]; customerExists {                    // The user has already accessed this resource - just increment                    curStat.totalNumberOfRequests++                } else {                    // New user - set access to 1                    curCustomer.customerWithStat[curCustIdStr] = &Stats{1}                }            }        } else {            // New Date            // Init the Statistic for the new customer            newCustomerData := make(map[string]*Stats)            newCustomerData[curCustIdStr] = &Stats{1}            // Create the customer itself            newCustomer := &Customer{newCustomerData}            // add to the current day list            dates.listOfDates[curDateStr] = append(dates.listOfDates[curDateStr], newCustomer)        }    }    // Print result    for date, customers := range dates.listOfDates {        fmt.Println("Date: ", date)        for _, customer := range customers {            for cid, stat := range customer.customerWithStat {                fmt.Println("  Customer: ", cid)                fmt.Println("  # Requests: ", *stat)            }        }    }}这将输出:Date:  2011-10-05  Customer:  1234  # Requests:  {1}Date:  2011-10-06  Customer:  5678  # Requests:  {2}  Customer:  1234  # Requests:  {4}Date:  2011-10-09  Customer:  1234  # Requests:  {1}Date:  2011-10-12  Customer:  1234  # Requests:  {1}Date:  2011-10-13  Customer:  1234  # Requests:  {2}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go