一、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. 背包DP全类型

    AcWing 2. 01背包问题 #include <iostream> #include <algorithm> using namespace std; const int ...

  2. TortoiseGit 使用 OpenSSH Key

    中文互联网上没一个说这个东西的,还得是 stackoverflow,原文在这. 方法很简单,修改 TortoiseGit 默认 SSH Client: 修改为 Windows 系统默认 OpenSSH ...

  3. VUE同级组件之前方法调用

    实现:Index.vue页面调用nav.vue页面里的getLeftMenu()方法 一.首先先建一个公共文件,命名eventBus.js,内空为: import Vue from 'vue'expo ...

  4. MongoDB (操作数据库,操作集合,操作文档)的笔记

    https://www.bilibili.com/video/BV1gV411H7jN/?spm_id_from=333.999.0.0&vd_source=92305fa48ea41cb7b ...

  5. IP的电源管脚

    IP的电源管脚是个特殊的存在. 1.对于前度RTL集成,需要和IP vendor以及后端确认,集成与综合时是否需要将电源DVDD,AVDD,引出到top层. 2.绝大部分情况下IP的电源PIN是sup ...

  6. [USACO2007NOVG] Telephone Wire G

    题目描述 Farmer John's cows are getting restless about their poor telephone service; they want FJ to rep ...

  7. 429 You are being rate limited

    记录贴 429 真的很让人伤心 清除浏览器数据 我用的 Edge : 设置 ⇒ 隐私.搜索和服务 ⇒ 清除浏览器数据 ⇒ 立即清除 然后就重新登陆可以了

  8. 使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理

    在前面随笔<在Winform应用中增加通用的业务编码规则生成>,我介绍了基于Winform和WPF的一个通用的业务编码规则的管理功能,本篇随笔介绍基于后端Web API接口,实现快速的Vu ...

  9. .NET开发中合理使用对象映射库,简化和提高工作效率

    前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂,庞大的时候还容易出现错误.为了解决这个 ...

  10. C#如何对List中的Object进行排序

    首先定义一个List类,这个类里面包含了Name和Total两个属性变量,下面就是针对这两个变量进行排序. public class Player { public string Name { get ...