一、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. JavaScript高级程序设计笔记04 变量、作用域与内存

    变量.作用域与内存 变量 特定时间点一个特定值的名称. 分类 原始值:按值访问 复制:两个独立使用.互不干扰 引用值(由多个值构成的对象):按引用访问 操作对象时,实际上操作的是对该对象的引用(ref ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (138)-- 算法导论11.4 2题

    二.用go语言,试写出HASH-DELETE 的伪代码;修改 HASH-INSERT,使之能处理特殊值DELETED. 文心一言: 首先,让我们定义一个基本的哈希表数据结构.这个结构将包括一个存储键值 ...

  3. uni-app学习笔记——路由与页面跳转

    小颖最近在学习小程序,怕自己前看后忘,毕竟还没开始进入项目实践中,就自己瞎倒腾嘻嘻,今天来看下  uni-app  的路由与页面跳转,小颖就简单列举下它们的用法,具体的大家可以看官网哦!啦啦啦啦啦  ...

  4. STM32外设:定时器TIM

    主要外设: TIM:Timer 定时器 TIM中的基本电路 定时器 计数器的基本功能 复位:计数器值=初值.产生一个输出脉冲.产生更新事件(UEV)脉冲.更新中断标志UIF=1 计数:计数器值递增或递 ...

  5. 牛客小白月赛2 D题虚虚实实

    题目链接:https://www.nowcoder.com/acm/contest/86/D 解题思路:这题目就是判断是否存在欧拉路径.由无向图存在欧拉路径的充分必要条件可知先判断是否联通,再判断是否 ...

  6. 华企盾DSC苹果Mac针对Word编辑文件不加密

    解决方法:查看了客户端的控制台日志显示的进程名和加密后缀都正常,可能文件内部有rename的操作,加密所有类型解决 ​

  7. Python+Selenium4自动化之JS属性

    应用场景 在自动化中, 能对JS代码进行增.删.改的话,可以帮助我们解决很多问题, 如:修改<a>标签的target属性,让它不打开新的窗口(_blank),从而不用频繁使用switch_ ...

  8. Go 泛型之泛型约束

    Go 泛型之泛型约束 目录 Go 泛型之泛型约束 一.引入 二.最宽松的约束:any 三.支持比较操作的内置约束:comparable 四.自定义约束 五.类型集合(type set) 六.简化版的约 ...

  9. Unity无法显示animator面板,如何解决?

    步骤: 点击动画的主体: 右侧Inspector面板找到Animator,双击Controller中的对象: 左上角即可显示animator面板. 总结: 不行就双击!!!!!!!!!!!!!!!!! ...

  10. ASR项目实战-交付团队的分工

    对于通常的软件项目,参与角色,比如可以有用户,消费者,产品团队,研发团队(研发团队包括开发和测试),运营团队,运维团队,管理团队. 通常认为,用户,负责购买服务的群体,而消费者,负责使用业务的群体.这 ...