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# 结构类型与类的区别
结构类型是值类型:类是引用类型: 内存位置不同,结构类型在应用程序的堆栈中:类对象在托管中: 是否改变源对象
随机推荐
- 接雨水(4.4 leetcode每日打卡)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可 ...
- python之猜数字小游戏
import random#随机数函数 a = random.randint(0, 50)#随机0-50之内的整数 print('------------------SWS工作室----------- ...
- 【scipy 基础】--稀疏矩阵
稀疏矩阵是一种特殊的矩阵,其非零元素数目远远少于零元素数目,并且非零元素分布没有规律.这种矩阵在实际应用中经常出现,例如在物理学.图形学和网络通信等领域. 稀疏矩阵其实也可以和一般的矩阵一样处理,之所 ...
- 关于微信小程序中如何实现数据可视化-echarts动态渲染
移动端设备中,难免会涉及到数据的可视化展示.数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能. 基础使用 首先在GitHub上下载echarts包 地址: ...
- Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
Gradio 是一个经常用于创建交互式机器学习应用的 Python 库.在以前按照传统方法,如果想对外分享 Gradio 应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好. ...
- C# 面试常见递归算法
前言 今天我们主要总结一下C#面试中常见递归算法. C#递归算法计算阶乘的方法 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1.自然数n的阶乘写作n!.180 ...
- Java的四种内部类(成员内部变量,静态内部变量,局部内部类,匿名内部类)
内部类 内部类就是在一个内的内部再定义一个内 内部类的分类:成员内部类,静态内部类,局部内部类,匿名内部类 (1)成员内部类 指类中的一个普通成员,可以定义成员属性,成员方法 内部类是可以访问外部类的 ...
- VScode怎么实现c的运行,这里只讲述一些细节
第一下载的Vscode要设置信任模式,否则你后面搞什么都没有用 第二下载minGw还是gcc 都行 第三安装插件,c,c++. 然后编译就行了,我搞了一天,主要弹出的是未找到exe文件,但是我告诉大家 ...
- mysql alter与update的区别
alter是更改表名,字段的 而updata是更改数据的,一定要记住要联合where使用,否则就会全部更改. updata与set联用 alter与change column和add联用
- 【matlab混沌理论】1.5.洛伦兹模型的分析
洛伦兹方程用于生成y变量的图.这是对三种y初始条件敏感依赖的一个例子. 1.洛伦兹吸引子的y敏感依赖的着色图 input: % 洛伦兹方程用于生成y变量的图.x和z的初始条件保持不变,但y的初始条件在 ...