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# 结构类型与类的区别
结构类型是值类型:类是引用类型: 内存位置不同,结构类型在应用程序的堆栈中:类对象在托管中: 是否改变源对象
随机推荐
- 一篇文章带你了解Python常用自动化测试框架——Pytest
一篇文章带你了解Python常用自动化测试框架--Pytest 在之前的文章里我们已经学习了Python自带测试框架UnitTest,但是UnitTest具有一定的局限性 这篇文章里我们来学习第三方框 ...
- 推荐一个Node.js多版本管理的可视化工具
关于Node.js的开发者来说,在开发机器上管理多个不同版本的Node.js是一个常见痛点.之前在开发者安全大全专栏中,提到过解决方法:使用nvm,如果对于nvm还不了解的话,可以前往了解. 对于TJ ...
- Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...
- Mock基础知识
使用的框架:moco框架下载地址:https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/1.1.0/ 启动方式:java -j ...
- 子类Dog根据自己的需要,重写了Animal方法
子类Dog根据自己的需要,重写了Animal方法 package com.guoba.method; class Animal{ public void move(){ System.out.prin ...
- ASR项目实战-项目交付历程
本文记录,作为项目主要负责人,完整参与语音识别项目的交付历程. 2019年12月中旬 接到项目交付任务,收集基本知识,启动业务分析工作. 2020年1月 完成竞品分析的整理. 梳理合作伙伴的清单,整理 ...
- ElasticSearch之cat pending tasks API
命令样例如下: curl -X GET "https://localhost:9200/_cat/pending_tasks?v=true&pretty" --cacert ...
- OpenEuler22.03安装最新版本Docker
一.环境及问题 操作系统环境如下: 操作系统:OpenEuler 22.03 LTS 安装方式:最小化安装 在操作系统安装完毕如果直接采用dnf或者yum方式安装docker: sudo dnf in ...
- JavaFx FXML入门(五)
JavaFx FXML入门(五) JavaFX 从入门入门到入土系列 JavaFx的FXML类似安卓中的视图文件,可以添加样式,添加css,添加id然后在java代码中绑定点击事件.可以使用工具编辑: ...
- P4928 [MtOI2018]衣服?身外之物! 题解
题意 gcd 共有 \(n\) 件衣服,编号为 \(A_1,A_2,\cdots A_n\). 每一件衣服分别拥有颜色值和清洗时间,他在每一件衣服穿完以后都会将其送去清洗,而这件衣服当天所拥有的舒适感 ...