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

5 回复

你尝试过什么方法吗?是否有效?

更多关于Golang中如何统计切片/数组中的重复项?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢,我已经解决了这个问题!

这个链接与分析JSON对象有什么关系?

看看Go语言中JSON解码的示例:https://golang.org/pkg/encoding/json/#example_Unmarshal

然后思考你的逻辑:

  • 如何识别静态文件?
  • 如何识别访问者?

我尝试编写了类似这样的代码,但是无法正常工作

socketloop图标

Golang : How to count duplicate items in slice/array?

socketloop标志

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
  }
]

代码说明:

  1. 定义了两个结构体:RequestData用于解析输入数据,StatResult用于输出结果
  2. 使用uriStats map来跟踪每个URI的统计信息
  3. 使用visitorMap map来记录每个URI的唯一访问者IP地址
  4. 遍历输入数据,更新访问次数和唯一访问者计数
  5. 最后将结果转换为JSON格式输出

这种方法的时间复杂度是O(n),其中n是输入数据的数量,能够高效处理大量数据。

回到顶部