一、List

List是一种有序的集合,可以包含任意数量的元素。与数组相比,list的长度可以动态调整,可以随时添加或删除元素,类似于切片

在go中,List是一个双向链表的实现。

实例
package main

import (
"container/list"
"fmt"
) type User struct {
id int
name string
} func main() {
l := list.New() //创建一个list
l.PushBack(1) //插入链表的最后一个位置
l.PushBack(2)
l.PushBack(3)
l.PushFront(4) //插入链表的第一个位置
l.Remove(l.Front().Next()) //删除最后一个元素
i := 1
for e := l.Front(); e != nil; e = e.Next() {
fmt.Printf("元素%d:%d\n", i, e.Value)
i++
} //当list中元素为struct时
ll := list.New()
item1 := User{id: 101, name: "name1"}
item2 := User{id: 102, name: "name2"}
ll.PushBack(item1)
ll.PushBack(item2)
a := 1
for e := ll.Front(); e != nil; e = e.Next() {
fmt.Printf("元素%d: id:%d, name:%s\n", a, e.Value.(User).id, e.Value.(User).name) //先转义后使用
a++
}
}

输出结果:

元素1:4
元素2:2
元素3:3
元素1: id:101, name:name1
元素2: id:102, name:name2
1.2 计算list相同元素的次数
func countOccurrences(list [][]string) map[string]map[string]int {
occurrences := make(map[string]map[string]int) for _, pair := range list {
first := pair[0]
second := pair[1] if _, ok := occurrences[first]; !ok {
occurrences[first] = make(map[string]int)
} occurrences[first][second]++
} return occurrences
}

二、struct类型的切片

package main

import (
"encoding/json"
"fmt"
) type User struct {
id int
name string
} type notifyParams struct {
Type string `json:"type"`
Values []string `json:"values"`
} func main() {
//实例化一个空切片
var al []interface{} //或者使用: al := make([]interface{}, 0)
al = append(al, "t1") //使用append添加元素
al = append(al, 1)
al = append(al, "2")
fmt.Println(al) //在struct中使用时
aSlice := make([]User, 0) //创建一个结构体切片
aSlice = append(aSlice, User{id: 555, name: "wang"}) //向切片中添加结构体元素
aSlice = append(aSlice, User{id: 444, name: "wan"})
fmt.Println(aSlice)
for k, v := range aSlice { //遍历
fmt.Println(k, v)
} notifySlice := make([]notifyParams, 0)
var arrs notifyParams
arrs.Type = "test"
arrs.Values = append(arrs.Values, "t1")
arrs.Values = append(arrs.Values, "t2")
arrs.Values = append(arrs.Values, "t3")
notifySlice = append(notifySlice, arrs) //将结构体对象添加到切片中
fmt.Println(notifySlice)
s1, _ := json.Marshal(notifySlice) //序列化,变成json格式
fmt.Println(string(s1))
}

输出结果

[t1 1 2]
[{555 wang} {444 wan}]
0 {555 wang}
1 {444 wan}
[{test [t1 t2 t3]}]
[{"type":"test","values":["t1","t2","t3"]}]
2.1 统计struct里每个元素重复的次数
package main

import (
"fmt"
"strings"
) // Alert 定义一个结构体类型
type Alert struct {
Product string
SolverID string
IP string
PolicyName string
} func main() {
// 创建一个包含结构体元素的切片
alerts := []Alert{
{"ProductA", "Solver1", "192.168.1.1", "Policy1"},
{"ProductB", "Solver2", "192.168.1.2", "Policy2"},
{"ProductA", "Solver1", "192.168.1.1", "Policy3"},
{"ProductA", "Solver3", "192.168.1.3", "Policy1"},
{"ProductB", "Solver2", "192.168.1.2", "Policy4"},
{"ProductA", "Solver1", "192.168.1.1", "Policy5"},
} // 创建一个map来统计IP相同的次数
ipCount := make(map[string]int) // 创建一个map来统计IP后面的告警策略名及其次数
ipPolicyCount := make(map[string]map[string]int) // 创建一个map来存储IP对应的product和solverId
ipProductSolverMap := make(map[string]struct {
Product string
SolverID string
}) // 遍历切片并进行统计
for _, alert := range alerts {
// 统计IP相同的次数
ipCount[alert.IP]++ // 统计IP后面的告警策略名及其次数
if _, ok := ipPolicyCount[alert.IP]; !ok {
ipPolicyCount[alert.IP] = make(map[string]int)
}
ipPolicyCount[alert.IP][alert.PolicyName]++ // 存储IP对应的product和solverId
ipProductSolverMap[alert.IP] = struct {
Product string
SolverID string
}{alert.Product, alert.SolverID}
} // 将结果格式化成字符串并输出
var resultStrings []string
for ip, count := range ipCount {
if count > 3 {
line := fmt.Sprintf("Product: %s SolverID: %s IP: %s (重复次数: %d) 策略名称及次数: ", ipProductSolverMap[ip].Product, ipProductSolverMap[ip].SolverID, ip, count)
for policyName, policyCount := range ipPolicyCount[ip] {
line += fmt.Sprintf("%s(%d), ", policyName, policyCount)
}
line = strings.TrimSuffix(line, ", ") // 去掉末尾的逗号和空格
resultStrings = append(resultStrings, line)
}
} // 输出结果字符串
for _, result := range resultStrings {
fmt.Println(result)
}
}

输出结果:

Product: ProductA SolverID: Solver1 IP: 192.168.1.1 (重复次数: 3) 策略名称及次数: Policy1(1), Policy3(1), Policy5(1)

Go--较复杂的结构类型的更多相关文章

  1. 第53讲:Scala中结构类型实战详解

    今天学习了scala的结构类型,让我们看看代码 class Structural {def open() = print("A class interface opened") } ...

  2. C#中将结构类型数据存储到二进制文件中方法

    以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到 ...

  3. Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  4. [Effective JavaScript 笔记]第57条:使用结构类型设计灵活的接口

    想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更 ...

  5. C# 中的结构类型(struct)

    原文 C# 中的结构类型(struct) 简介 有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算.这种情况下,更好的做法是使用结构(struct)类型.由于 struct 是值类型,是 ...

  6. C语言小结之结构类型

    C语言小结之结构类型 @刁钻的游戏 (1)枚举型类型enum COLOR {BLACK,RED,BLUE};//声明一种新的数据类型,其值分别为0,1,2但是用BLACK/RED/BLUE代表也可以这 ...

  7. [C语言]进阶|结构类型: 枚举, 结构, 类型定义

    --------------------------------------------------------------------- 枚举: // main.c #include <std ...

  8. 《Go语言实战》Go 类型:基本类型、引用类型、结构类型、自定义类型

    Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么. 提前知道值的类型的好处有很多,比如编译器 ...

  9. 结构类型:Struct

    一.概述: 结构类似于类,但结构为值类型,存储于栈中. 结构不能继承和被继承,但可实现接口. 结构成员访问级别有public,private(默认) ,internal. 1.简单结构 可以将无方法, ...

  10. C# 结构类型与类的区别

    结构类型是值类型:类是引用类型: 内存位置不同,结构类型在应用程序的堆栈中:类对象在托管中: 是否改变源对象

随机推荐

  1. Java JDBC连接数据库的CURD操作(JDK1.8 + MySQL8.0.33 + mysql-connector-java-8.0.27-bin驱动)

    JDBC概述 JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统.通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类 ...

  2. L3-009 长城

    #include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; using ll = lon ...

  3. A-B数对 (hash映射)

    题目大意: 第一行输入N,C 第二行输入n个数字 输出,求A - B = C的数对个数 样例 4 1 1 1 2 3 输出 3 思路:用STL容器map,map<num, times>,建 ...

  4. 【scipy 基础】--信号处理

    scipy.signal模块主要用于处理和分析信号.它提供了大量的函数和方法,用于滤波.卷积.傅里叶变换.噪声生成.周期检测.谱分析等信号处理任务. 此模块的主要作用是提供一套完整的信号处理工具,从而 ...

  5. 生产实践:Redis与Mysql的数据强一致性方案

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 数据库和Redis如何保持强一致性,这篇文章告诉你 目的 Redis和Msql来保持数据同步,并且强一致,以此来提高对应接 ...

  6. Python 中的单下划线和双下划线

    哈喽大家好,我是咸鱼 当我们在学习 Python 的时候,可能会经常遇到单下划线 _ 和双下划线 __ 这两种命名方式 单下划线 _ 和双下划线 __ 不仅仅是只是一种简单的命名习惯,它们在 Pyth ...

  7. Tampermonkey(油猴)的获取方法

    介绍: Tampermonkey中有大量的脚本,可以方便我们在日常的上网使用. 有那么一句话说:没有了Tampermonkey(油猴)我都不知道该如何上网. 获取Tampermonkey的步骤: 1. ...

  8. 【UniApp】-uni-app-pinia存储数据

    前言 经过上个章节的介绍,大家可以了解到 uni-app-数据缓存 的基本使用方法 那本章节来给大家介绍一下 uni-app-pinia存储数据 的基本使用方法 经过我这么多篇章的介绍,我发现大家环境 ...

  9. 江西财经大学第一届程序设计竞赛 H题- 小P的数学问题

    题目链接:https://www.nowcoder.com/acm/contest/115/H 解题思路:分块打表!!! 什么是分块打表呢??? 从这道题我们知道我们要找到最多1*e9的阶乘 那循环暴 ...

  10. (数据科学学习手札156)地图可视化神器kepler.gl 3.0版本发布

    本文已收录至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,地图可视化神器kepler.gl终于带 ...