一、List

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

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

实例
  1. package main
  2.  
  3. import (
  4. "container/list"
  5. "fmt"
  6. )
  7.  
  8. type User struct {
  9. id int
  10. name string
  11. }
  12.  
  13. func main() {
  14. l := list.New() //创建一个list
  15. l.PushBack(1) //插入链表的最后一个位置
  16. l.PushBack(2)
  17. l.PushBack(3)
  18. l.PushFront(4) //插入链表的第一个位置
  19. l.Remove(l.Front().Next()) //删除最后一个元素
  20. i := 1
  21. for e := l.Front(); e != nil; e = e.Next() {
  22. fmt.Printf("元素%d:%d\n", i, e.Value)
  23. i++
  24. }
  25.  
  26. //当list中元素为struct时
  27. ll := list.New()
  28. item1 := User{id: 101, name: "name1"}
  29. item2 := User{id: 102, name: "name2"}
  30. ll.PushBack(item1)
  31. ll.PushBack(item2)
  32. a := 1
  33. for e := ll.Front(); e != nil; e = e.Next() {
  34. fmt.Printf("元素%d: id:%d, name:%s\n", a, e.Value.(User).id, e.Value.(User).name) //先转义后使用
  35. a++
  36. }
  37. }

输出结果:

  1. 元素1:4
  2. 元素2:2
  3. 元素3:3
  4. 元素1: id:101, name:name1
  5. 元素2: id:102, name:name2
1.2 计算list相同元素的次数
  1. func countOccurrences(list [][]string) map[string]map[string]int {
  2. occurrences := make(map[string]map[string]int)
  3.  
  4. for _, pair := range list {
  5. first := pair[0]
  6. second := pair[1]
  7.  
  8. if _, ok := occurrences[first]; !ok {
  9. occurrences[first] = make(map[string]int)
  10. }
  11.  
  12. occurrences[first][second]++
  13. }
  14.  
  15. return occurrences
  16. }

二、struct类型的切片

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7.  
  8. type User struct {
  9. id int
  10. name string
  11. }
  12.  
  13. type notifyParams struct {
  14. Type string `json:"type"`
  15. Values []string `json:"values"`
  16. }
  17.  
  18. func main() {
  19. //实例化一个空切片
  20. var al []interface{} //或者使用: al := make([]interface{}, 0)
  21. al = append(al, "t1") //使用append添加元素
  22. al = append(al, 1)
  23. al = append(al, "2")
  24. fmt.Println(al)
  25.  
  26. //在struct中使用时
  27. aSlice := make([]User, 0) //创建一个结构体切片
  28. aSlice = append(aSlice, User{id: 555, name: "wang"}) //向切片中添加结构体元素
  29. aSlice = append(aSlice, User{id: 444, name: "wan"})
  30. fmt.Println(aSlice)
  31. for k, v := range aSlice { //遍历
  32. fmt.Println(k, v)
  33. }
  34.  
  35. notifySlice := make([]notifyParams, 0)
  36. var arrs notifyParams
  37. arrs.Type = "test"
  38. arrs.Values = append(arrs.Values, "t1")
  39. arrs.Values = append(arrs.Values, "t2")
  40. arrs.Values = append(arrs.Values, "t3")
  41. notifySlice = append(notifySlice, arrs) //将结构体对象添加到切片中
  42. fmt.Println(notifySlice)
  43. s1, _ := json.Marshal(notifySlice) //序列化,变成json格式
  44. fmt.Println(string(s1))
  45. }

输出结果

  1. [t1 1 2]
  2. [{555 wang} {444 wan}]
  3. 0 {555 wang}
  4. 1 {444 wan}
  5. [{test [t1 t2 t3]}]
  6. [{"type":"test","values":["t1","t2","t3"]}]
2.1 统计struct里每个元素重复的次数
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strings"
  6. )
  7.  
  8. // Alert 定义一个结构体类型
  9. type Alert struct {
  10. Product string
  11. SolverID string
  12. IP string
  13. PolicyName string
  14. }
  15.  
  16. func main() {
  17. // 创建一个包含结构体元素的切片
  18. alerts := []Alert{
  19. {"ProductA", "Solver1", "192.168.1.1", "Policy1"},
  20. {"ProductB", "Solver2", "192.168.1.2", "Policy2"},
  21. {"ProductA", "Solver1", "192.168.1.1", "Policy3"},
  22. {"ProductA", "Solver3", "192.168.1.3", "Policy1"},
  23. {"ProductB", "Solver2", "192.168.1.2", "Policy4"},
  24. {"ProductA", "Solver1", "192.168.1.1", "Policy5"},
  25. }
  26.  
  27. // 创建一个map来统计IP相同的次数
  28. ipCount := make(map[string]int)
  29.  
  30. // 创建一个map来统计IP后面的告警策略名及其次数
  31. ipPolicyCount := make(map[string]map[string]int)
  32.  
  33. // 创建一个map来存储IP对应的product和solverId
  34. ipProductSolverMap := make(map[string]struct {
  35. Product string
  36. SolverID string
  37. })
  38.  
  39. // 遍历切片并进行统计
  40. for _, alert := range alerts {
  41. // 统计IP相同的次数
  42. ipCount[alert.IP]++
  43.  
  44. // 统计IP后面的告警策略名及其次数
  45. if _, ok := ipPolicyCount[alert.IP]; !ok {
  46. ipPolicyCount[alert.IP] = make(map[string]int)
  47. }
  48. ipPolicyCount[alert.IP][alert.PolicyName]++
  49.  
  50. // 存储IP对应的product和solverId
  51. ipProductSolverMap[alert.IP] = struct {
  52. Product string
  53. SolverID string
  54. }{alert.Product, alert.SolverID}
  55. }
  56.  
  57. // 将结果格式化成字符串并输出
  58. var resultStrings []string
  59. for ip, count := range ipCount {
  60. if count > 3 {
  61. line := fmt.Sprintf("Product: %s SolverID: %s IP: %s (重复次数: %d) 策略名称及次数: ", ipProductSolverMap[ip].Product, ipProductSolverMap[ip].SolverID, ip, count)
  62. for policyName, policyCount := range ipPolicyCount[ip] {
  63. line += fmt.Sprintf("%s(%d), ", policyName, policyCount)
  64. }
  65. line = strings.TrimSuffix(line, ", ") // 去掉末尾的逗号和空格
  66. resultStrings = append(resultStrings, line)
  67. }
  68. }
  69.  
  70. // 输出结果字符串
  71. for _, result := range resultStrings {
  72. fmt.Println(result)
  73. }
  74. }

输出结果:

  1. 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 -- Stream流用法

    1. 前言 流是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式. Stream流是从支持数据处理 ...

  2. Java开发者的Python快速进修指南:异常捕获

    在之前的学习中,我们已经讲解了函数和控制流等基本概念.然而,在接触实际业务时,你会发现异常捕获也是必不可少的一部分,因为在Java编程中,异常处理是不可或缺的.Python的异常捕获与Java的异常捕 ...

  3. UIPath之Excel操作

    你的选择是做或不做,但不做就永远不会有机会. 一. UIPath操作Excel的两组方法 1. App Integration > Excel   特点: 对Excel里的操作必须包含在Exec ...

  4. C语言求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。

    /* 开发者:慢蜗牛 开发时间:2020.5.28 程序功能:求100以内的素数 */ #include<stdio.h> int prime(int m); int prime(int ...

  5. GeminiDB新特性:让Redis广告频控爱不释手的exHASH

    本文分享自华为云社区<GeminiDB新特性:让Redis广告频控爱不释手的exHASH>,作者:GeminiDB-Redis博客 . exHash类型是一种支持Field过期的新型数据类 ...

  6. Nginx根据Origin配置禁止跨域访问策略

    产品需要通过某所的安全测评扫描,其中提出一个关于跨域策略配置不当的问题,如下: 这个需要根据客户端传递的请求头中的Origin值,进行安全的跨站策略配置,目的是对非法的origin直接返回403错误页 ...

  7. WinForm窗体间传值的方法

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 1.公共静态变量:2.使用共有属性:3.使用委托与事件:4.通过构造函数把主窗体传递到从窗体中: 一.通过静态变量特点: ...

  8. 2023第八届上海市大学生网络安全大赛-磐石行动(misc+crypto) WP

    Crypto bird 题目 docx文档出现: 我的解答: 使用在线工具即可:https://www.dcode.fr/birds-on-a-wire-cipher flag{birdislovel ...

  9. MySQL账号锁定与解锁

    MySQL提供了多种方法来锁定解锁账号,下面是几种常用的方法: 1.使用ALTER语句锁定账号 锁定账号: ALTER USER 'username'@'localhost' ACCOUNT LOCK ...

  10. 为什么许多数字孪生产品开始了GIS融合的尝试?

    随着数字孪生技术的发展,越来越多的产品意识到要实现数字孪生的最大价值,需要考虑多个维度的数据,包括空间信息.地理位置.环境条件等.因此,许多数字孪生产品开始了与GIS系统的融合尝试,以进一步提升其功能 ...