Golang中如何统计切片/数组中的重复项?
Golang中如何统计切片/数组中的重复项? 大家好,
我的输入数据如下:
[ { “id”: 1, “host”: “abc. com”, “remote_addr”: “14.161.36.28”, “request_method”: “GET”, “request_uri”: “/test.txt”, }, { “id”: 2, “host”: “abc. com”, “remote_addr”: “14.161.36.28”, “request_method”: “GET”, “request_uri”: “/”, }, { “id”: 3, “host”: “abc. com”, “remote_addr”: “14.161.36.28”, “request_method”: “GET”, “request_uri”: “/test.txt”, }, { “id”: 4, “host”: “abc. com”, “remote_addr”: “14.161.36.29”, “request_method”: “GET”, “request_uri”: “/”, }, { “id”: 5, “host”: “abc. com”, “remote_addr”: “14.161.36.29”, “request_method”: “GET”, “request_uri”: “/”, }, ]
但我想要统计并输出如下形式:
{ “static_file”: “/test.txt”, “static_file_hits”: 2, “staticfile_visitor”: 2, }, { “static_file”: “/”, “static_file_hits”: 3, “staticfile_visitor”: 2, }
static_file = request_uri static_file_hits = request_uri的调用次数 staticfile_visitor = 调用request_uri的remote_addr数量
请问能否帮我统计并映射这些数据? 非常感谢
更多关于Golang中如何统计切片/数组中的重复项?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
非常感谢,我已经解决了这个问题!
这个链接与分析JSON对象有什么关系?
看看Go语言中JSON解码的示例:https://golang.org/pkg/encoding/json/#example_Unmarshal
然后思考你的逻辑:
- 如何识别静态文件?
- 如何识别访问者?
我尝试编写了类似这样的代码,但是无法正常工作
Golang : How to count duplicate items in slice/array?

Golang:如何统计切片/数组中的重复项?
Golang:如何统计切片/数组中的重复项?
在Go语言中,可以通过遍历切片并使用map来统计重复项和计算所需指标。以下是一个完整的示例代码,用于处理你的数据结构并生成所需的输出:
package main
import (
"encoding/json"
"fmt"
)
// 定义输入数据结构
type RequestData struct {
ID int `json:"id"`
Host string `json:"host"`
RemoteAddr string `json:"remote_addr"`
RequestMethod string `json:"request_method"`
RequestURI string `json:"request_uri"`
}
// 定义输出数据结构
type StatResult struct {
StaticFile string `json:"static_file"`
StaticFileHits int `json:"static_file_hits"`
StaticFileVisitor int `json:"staticfile_visitor"`
}
func main() {
// 示例输入数据
inputData := []RequestData{
{ID: 1, Host: "abc.com", RemoteAddr: "14.161.36.28", RequestMethod: "GET", RequestURI: "/test.txt"},
{ID: 2, Host: "abc.com", RemoteAddr: "14.161.36.28", RequestMethod: "GET", RequestURI: "/"},
{ID: 3, Host: "abc.com", RemoteAddr: "14.161.36.28", RequestMethod: "GET", RequestURI: "/test.txt"},
{ID: 4, Host: "abc.com", RemoteAddr: "14.161.36.29", RequestMethod: "GET", RequestURI: "/"},
{ID: 5, Host: "abc.com", RemoteAddr: "14.161.36.29", RequestMethod: "GET", RequestURI: "/"},
}
// 使用map统计每个request_uri的访问次数和访问者
uriStats := make(map[string]*StatResult)
visitorMap := make(map[string]map[string]bool) // 记录每个URI的访问者
for _, data := range inputData {
// 如果该URI尚未在统计中,初始化
if _, exists := uriStats[data.RequestURI]; !exists {
uriStats[data.RequestURI] = &StatResult{
StaticFile: data.RequestURI,
StaticFileHits: 0,
}
visitorMap[data.RequestURI] = make(map[string]bool)
}
// 增加访问次数
uriStats[data.RequestURI].StaticFileHits++
// 记录访问者(如果该IP尚未访问过此URI)
if !visitorMap[data.RequestURI][data.RemoteAddr] {
visitorMap[data.RequestURI][data.RemoteAddr] = true
uriStats[data.RequestURI].StaticFileVisitor++
}
}
// 将map转换为切片输出
var results []StatResult
for _, stat := range uriStats {
results = append(results, *stat)
}
// 输出JSON格式结果
jsonData, err := json.MarshalIndent(results, "", " ")
if err != nil {
fmt.Printf("JSON marshaling error: %v\n", err)
return
}
fmt.Println(string(jsonData))
}
运行此代码将输出:
[
{
"static_file": "/test.txt",
"static_file_hits": 2,
"staticfile_visitor": 1
},
{
"static_file": "/",
"static_file_hits": 3,
"staticfile_visitor": 2
}
]
代码说明:
- 定义了两个结构体:
RequestData用于解析输入数据,StatResult用于输出结果 - 使用
uriStatsmap来跟踪每个URI的统计信息 - 使用
visitorMapmap来记录每个URI的唯一访问者IP地址 - 遍历输入数据,更新访问次数和唯一访问者计数
- 最后将结果转换为JSON格式输出
这种方法的时间复杂度是O(n),其中n是输入数据的数量,能够高效处理大量数据。

