Go--较复杂的结构类型
一、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--较复杂的结构类型的更多相关文章
- 第53讲:Scala中结构类型实战详解
今天学习了scala的结构类型,让我们看看代码 class Structural {def open() = print("A class interface opened") } ...
- C#中将结构类型数据存储到二进制文件中方法
以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到 ...
- Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- [Effective JavaScript 笔记]第57条:使用结构类型设计灵活的接口
想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更 ...
- C# 中的结构类型(struct)
原文 C# 中的结构类型(struct) 简介 有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算.这种情况下,更好的做法是使用结构(struct)类型.由于 struct 是值类型,是 ...
- C语言小结之结构类型
C语言小结之结构类型 @刁钻的游戏 (1)枚举型类型enum COLOR {BLACK,RED,BLUE};//声明一种新的数据类型,其值分别为0,1,2但是用BLACK/RED/BLUE代表也可以这 ...
- [C语言]进阶|结构类型: 枚举, 结构, 类型定义
--------------------------------------------------------------------- 枚举: // main.c #include <std ...
- 《Go语言实战》Go 类型:基本类型、引用类型、结构类型、自定义类型
Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么. 提前知道值的类型的好处有很多,比如编译器 ...
- 结构类型:Struct
一.概述: 结构类似于类,但结构为值类型,存储于栈中. 结构不能继承和被继承,但可实现接口. 结构成员访问级别有public,private(默认) ,internal. 1.简单结构 可以将无方法, ...
- C# 结构类型与类的区别
结构类型是值类型:类是引用类型: 内存位置不同,结构类型在应用程序的堆栈中:类对象在托管中: 是否改变源对象
随机推荐
- Java -- Stream流用法
1. 前言 流是Java 8 API添加的一个新的抽象,称为流Stream,以一种声明性方式处理数据集合,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式. Stream流是从支持数据处理 ...
- Java开发者的Python快速进修指南:异常捕获
在之前的学习中,我们已经讲解了函数和控制流等基本概念.然而,在接触实际业务时,你会发现异常捕获也是必不可少的一部分,因为在Java编程中,异常处理是不可或缺的.Python的异常捕获与Java的异常捕 ...
- UIPath之Excel操作
你的选择是做或不做,但不做就永远不会有机会. 一. UIPath操作Excel的两组方法 1. App Integration > Excel 特点: 对Excel里的操作必须包含在Exec ...
- 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 ...
- GeminiDB新特性:让Redis广告频控爱不释手的exHASH
本文分享自华为云社区<GeminiDB新特性:让Redis广告频控爱不释手的exHASH>,作者:GeminiDB-Redis博客 . exHash类型是一种支持Field过期的新型数据类 ...
- Nginx根据Origin配置禁止跨域访问策略
产品需要通过某所的安全测评扫描,其中提出一个关于跨域策略配置不当的问题,如下: 这个需要根据客户端传递的请求头中的Origin值,进行安全的跨站策略配置,目的是对非法的origin直接返回403错误页 ...
- WinForm窗体间传值的方法
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 1.公共静态变量:2.使用共有属性:3.使用委托与事件:4.通过构造函数把主窗体传递到从窗体中: 一.通过静态变量特点: ...
- 2023第八届上海市大学生网络安全大赛-磐石行动(misc+crypto) WP
Crypto bird 题目 docx文档出现: 我的解答: 使用在线工具即可:https://www.dcode.fr/birds-on-a-wire-cipher flag{birdislovel ...
- MySQL账号锁定与解锁
MySQL提供了多种方法来锁定解锁账号,下面是几种常用的方法: 1.使用ALTER语句锁定账号 锁定账号: ALTER USER 'username'@'localhost' ACCOUNT LOCK ...
- 为什么许多数字孪生产品开始了GIS融合的尝试?
随着数字孪生技术的发展,越来越多的产品意识到要实现数字孪生的最大价值,需要考虑多个维度的数据,包括空间信息.地理位置.环境条件等.因此,许多数字孪生产品开始了与GIS系统的融合尝试,以进一步提升其功能 ...