go语言数据类型
一.Go 语言有四大显著特点:高效性:编译与运行效率高。并发性:原生支持并发编程。简洁性:编程风格简洁直接,代码可读性与可维护性高。跨平台性:程序能在 Windows、Linux、Mac OS 等多系统运行。二.go的包:package1.main:主函数2.fmt:输出 #fmt.Println()3.rand:随机数 rand.Intn(n) #生成0-n之间的随机数三.go的工具链组件: import 1.go mod init+自定义名称 #初始化项目,生成项目文件2.go run + 文件 #编译并执行文件 3.go build #编译,将当前目录中的.go文件编译为可执行文件go build -o demo01_app demo01.go//-o demo01_app 指定可执行文件的名字4.go doc 组件名称 #查看组件的文档四.变量(var):变量申明后必须要使用1.声明赋值:var 变量名1,变量名2 数据类型 = a,bvar name,name2 string =a,b(1)声明多个不同类型的变量:var (name stringage intaddress string)2.短变量:不需要申明类型,系统自动判断类型格式: name := "jack" // 字符串类型的变量。3.匿名变量:a, b, _ := 1, 2, 3:表示第三个值不使用4.交换变量num1, num2 := 25, 36nam1, num2 = num2, num1五.常量(const):不允许重新赋值1.声明赋值:const name string = "Jack"声明多个常量:const(a int=1b string ="aa")2.iota:声明无类型的"整数"序数(等差数列)const (a = iotabc)六.输出和输入格式化输出:fmt.Printf()1.%v #任意类型2.%s #字符型3.%d #整型4.%.2f #浮点:保留两位小数5.%t #布尔值6.%T #输出类型7.%c #编码转换,输出对应字符获取键盘输入:fmt.Scan(&a,&b),控制台空格间隔,输完参数自动结束,&为固定的绑定变量值的符号fmt.Scanln(&a,&b),控制台空格间隔,输完参数回车结束七.数据类型
1.基本数据类型(1)整型有符号整型(分正负) int8/16/32/64,默认由操作系统决定 [-32768, 32767]无符号整型(不分正负) uint8/16/32/64 [0, 65535](2)浮点float32 32位浮点数float64 64位浮点数(短变量默认类型)(3)布尔类型bool true为真值,false为假值var b1 bool = true(4)字符串类型1)字符串string 字符串,字符串可以用双引号""或反引号``来表示str := "Hello, World!"multilineStr := ` //可以换行This is amultiline string.`2)字符串的拼接:+str1 := "Hello, "str2 := "World!"str = str1+str23)字符串长度,单位是字节,英文占一个字节,汉字占三个字节:lenstr := "Hello, World!"length := len(str) 4)字符串索引:[],输出ascii码,的值用string()转回str := "Hello世界"firstChar := str[0] secondChar := str[5] #汉字占三个字节,这样只取出一个字节fmt.Println(firstChar, secondChar) // 输出 '72' 和 '228'// 编码转换fmt.Println(string(firstChar), string(secondChar)5)字符串切片:可以取出汉字的内容,按照字节进行计数str[start:end]:从start到end(不包括end)。str[:]:获取字符串的完整副本str := "Hello世界"fmt.Println(str2[5:8]) // "世"(5)字符型:可输出中文完整的ascii编码,使用string()可以转换,0到2551)byte,使用单引号包括一个字符,相当于uint8var a byte = 'a' fmt.Println(a) // 97,输出ASCII编码值2)rune,相当于int32,0到65535var b rune = '中'fmt.Println(b) // 20013(6) \转义字符\n 换行符号\t 横向制表符号(多空格)\b 回退符号\f 换页符号(7)零值:一个类型的空值或者说默认值更为准确。var i int // 默认为0var s8 string // 默认为""var b3 bool // 默认为false2.各种引用数据类型1.数组1.数组初始化(1)初始化一个长度为5的整型数组var nums [5]intnames = [3]string{"1","2","3"}for i := 0; i < index; i++ {newArr[i] = arr[i]}(2)也可以用元素初始化nums := [5]int{1, 2, 3}(3)自动设置长度nums := [...]int{3, 8, 7, 12}(1)下标访问:names[i](2)切片访问:names[n:m],不包括m,从0开始的话,可以省略names[:m],names[0:],names[:](3)数组长度:len(数组)(4)遍历数组,for循环的简化版for key, value := range names {fmt.Println(key, value)}(5)反转数组:func reverseArray(arr [6]int) [6]int {length := len(arr)for i := 0; i < length/2; i++ {arr[i], arr[length-i-1] = arr[length-i-1], arr[i]}return arr}func main() {arr := [6]int{10, 20, 30, 40, 50, 60}reversed := reverseArray(arr)fmt.Println("反转后的数组:", reversed)}2.二维数组1)// 初始化一个 2 行 3 列的二维数组var arr [2][3]int = [2][3]int{ #本质操作行和列{1, 2, 3},{4, 5, 6},}2)// 使用 ... 自动推断行数arr := [...][3]int{{1, 2, 3},{4, 5, 6},}fmt.Println(arr)3) //遍历二维数组,相加列func main() {// 定义命令行参数arr :=[2][2]int{{1,2},{4,3},}res :=make([]int,len(arr[0]))for k,_ :=range arr[0]{ //列sum :=0for k1,_ :=range arr{ //行fmt.Println(arr[k1][k])sum = sum+arr[k1][k]}res[k] = sum}fmt.Println(res) }2.切片:和数组相比就是没有设置长度(1)切片的初始化:和数组相比就是没有设置长度s := []int{1, 2, 3, 4, 5} // 创建一个包含5个元素的切片s := make([]int, 5, 10) // 创建类型为[]int,长度为5,最大容量为10的切片(2)切片的长度和容量len(slice),cap(slice) //容量第一次成倍扩容,后面一个一个扩容(3)子切片slice[startIndex:endIndex] //子切片的内容改变,父切片的内容也会改变(4)切片增加元素s = []int{1, 2, 3, 4, 5}s = append(s, 6, 7, 8) // 向切片中添加元素,返回新的切片(5)元素展开 s1 :=sp[:2]s2 :=sp[3:]s := append(s1,s2...) //s2...元素展开,在append函数使用fmt.Println(s)(6)复制拷贝切片当需要一个独立副本时,可以使用内置的copy函数来实现num1 :=[]int{1,2,3}num2 :=make([]int,len(num1))copy(目标切片, 源切片)(7)字节切片:[]byte,字符串每个字符取出是字节,占用 1 个字节的内存空间。8)字符串-->转字符切片var str stringrunes :=[]rune(s)字符切片(ascci)-->转字符串,占用 4 个字节的内存空间string(runes)3.指针类型,指向一个内存地址(1)指针的申明var p *int //指针类型,p表示地址*p //*取值p = &a //&取地址(2)new函数:分配一个内存p :=new(int)*p =1004.映射(map)类型:关联键和值的数据结构(无序),查找灵活(1)可扩展make初始化s :=make(map[string]int) //map[键类型][值类型]赋值:s["1"]=1--s :=map[string] int{"key": value,"Bob": 50000,"Charlie": 60000, }(2)访问值,通过键得到值v :=s[key](3)删除元素delete(映射名字(变量值),“键”)(4)循环输出for key,value :=range 映射的变量名字{fmt.Println(key,value)}5.结构体类型(struct)(1)语法结构,定义在main之外type 结构体名 struct {字段名1 类型1字段名2 类型2...}type Person struct { //首字母大写,导包使用Name stringAge intCity string}(2)初始化结构体var p Personp.Name = "Alice"p.Age = 30p.City = "Beijing"--简化初始化s := Person{Name: "Bob",Age: 25, City: "Shanghai"}s := Person{"Bob",25,"Shanghai"}(4)匿名结构体person := struct {Name stringAge int}{Name: "Charlie",Age: 28,}(5)切片和map在结构体中的初始化p2.A_name=[]string{"aa","bb"}p2.Ck=map[string]int{"name":1}6.Json类型:是一种轻量级的数据交换格式{"name": "Alice","age": 20,"is_married": false,"like": ["red", "blue", "purple"],"phone": null}(1)序列化:json.Marshal,go中的数据转为json格式,序列化。json格式转为go中的数据格式,反序列化 设置标签:结构体的标签对应JSON对象的键,也可以不设置使用默认的type Person struct {Name string `json:"name"`Age int `json:"age"`Like []string `json:"like"`Address map[string]string `json:"address"`}// 序列化jsonData, err := json.Marshal(p1)if err != nil {fmt.Println(err)}(2)反序列化:json.Unmarshal,将JSON格式的字节切片解码为Go语言结构体。// 反序列化var p2 Personerr2 := json.Unmarshal(jsonData, &p2)if err != nil {fmt.Println(err2)}fmt.Println(p2)找各种包:studygolang--->标准库中文版,
八.字符串操作(1)遍历:英文,汉字可能会出现乱码,因为一个汉字可能占多个字节。str := "Hello"for i := 0; i < len(str); i++ {fmt.Printf("%c ", str[i])}fmt.Println()按字符(rune)遍历优点: 能正确处理 UTF-8 编码的多字节字符,避免乱码。str := "Hello, 世界"for _, char := range str { //range 遍历数据类型,大多都返回key,valuefmt.Printf("%c ", char) }(2)Contains/Index查找字符串1)strings.Contains(“源字符串”, “目标字符串”) bool: 判断字符串 s 是否包含子串 substr。text := "I love programming in Go!"fmt.Println(strings.Contains(text, "Go")) // 输出 true2)strings.Index(“源字符串”, “目标字符串”) int: 返回子串 substr 在 s 中首次出现的索引。text := "hello, world"index := strings.Index(text, "world")fmt.Println(index) // 输出 7(3)Replace替换字符串strings.Replace(“源字符串”, old, new,替换次数) //将 s 中的前 n 个 old 子串替换为 new 子串。(4)Split分割字符串:输出为切片strings.Split(“源字符串”,"分隔符") //以“分隔符”将 s 分割成多个子串。(5)切片-->字符串:Joinstrings.Join(“源字符串切片”, “连接符号”) //将字符串切片 a 中的元素用 sep 连接起来。(6)大小写转换strings.ToLower(“字符串”) // 将 s 中的所有字母转换为小写。strings.ToUpper(“字符串”) //将 s 中的所有字母转换为大写。strings.TrimSpace(“字符串”) //去除 s 首尾的空格。九.数据类型转换整型和浮点的转换:var a int8 = 6int16/float64(a) 字符串转换:1)fmt.Sprintf("%d", a):其它类型转字符串,只格式化,不输出var a int = 20var stra string //转换的类型stra = fmt.Sprintf("%d", a) //格式化输出转换fmt.Printf("stra type is %T, value is %v \n", stra, stra)2)fmt.Sprintf: //不同类型的数据拼接var str string = "aa"var f1 float32 = 12.2var b1 bool = truea := fmt.Sprintf("商品标题:%s 价格:%f 是否在售:%t\n",str,f1,b1)fmt.Printf(a)3)strconv:实现基本数据类型和字符串之间的转换字符串和整型相互转换strconv.Atoi(str) #字符串转整型strconv.Itoa(int) #整型转字符串字符串和浮点形转换 strconv.ParseFloat(str,64) #字符串转浮点strconv,FormatFloat(num,'f',2,64) #浮点转字符串(要转换的浮点型,输出浮点形,保留2位,64位的)字符串和布尔转换strconv.ParseBool(str) #字符串转布尔strconv.FormatBool(b) #布尔转字符串4)字符串-->转字符切片var str stringrunes :=[]rune(s)字符切片(ascci)-->转字符串string(runes)5)strings.Join:"字符串"切片-->转字符串result := strings.Join(strSlice, ",")练习:
// 创建一个映射,键为学生的姓名(字符串类型),值为一个自定义的 Student 结构体,
// 该结构体包含 Age(整数类型)和 Scores(整数切片类型,存储学生的多门课程成绩)两个字段。
// 实现以下功能:
// - 向映射中添加至少 3 个学生的信息。
// - 计算并输出每个学生的平均成绩。
// - 找出平均成绩最高的学生,并输出其姓名和平均成绩。type Student struct{Age intScores []int
}
func main() {smap :=make(map[string]Student)smap["name1"] =Student{Age:11,Scores: []int{1,3},}smap["name2"] =Student{Age:22,Scores: []int{2,4},}smap["name3"] =Student{Age:33,Scores: []int{4,6},}// avg :=make([]int,0)// fmt.Println(smap)hs :=""hc :=0for k,_ :=range smap{sum :=0for _,v1 :=range smap[k].Scores{sum =sum+v1 }// avg =append(avg,sum/len(smap[k].Scores))fmt.Printf("%s,%d\n",k,sum/len(smap[k].Scores))if hc < sum/len(smap[k].Scores){hc = sum/len(smap[k].Scores)hs = k}}fmt.Println(hs,hc)
}
一.Go 语言有四大显著特点:
高效性:编译与运行效率高。
并发性:原生支持并发编程。
简洁性:编程风格简洁直接,代码可读性与可维护性高。
跨平台性:程序能在 Windows、Linux、Mac OS 等多系统运行。
二.go的包:package
1.main:主函数
2.fmt:输出 #fmt.Println()
3.rand:随机数
rand.Intn(n) #生成0-n之间的随机数
三.go的工具链组件: import
1.go mod init+自定义名称 #初始化项目,生成项目文件
2.go run + 文件 #编译并执行文件
3.go build #编译,将当前目录中的.go文件编译为可执行文件
go build -o demo01_app demo01.go
//-o demo01_app 指定可执行文件的名字
4.go doc 组件名称 #查看组件的文档
四.变量(var):变量申明后必须要使用
1.声明赋值:var 变量名1,变量名2 数据类型 = a,b
var name,name2 string =a,b
(1)声明多个不同类型的变量:
var (
name string
age int
address string
)
2.短变量:不需要申明类型,系统自动判断类型
格式: name := "jack" // 字符串类型的变量。
3.匿名变量:a, b, _ := 1, 2, 3:表示第三个值不使用
4.交换变量
num1, num2 := 25, 36
nam1, num2 = num2, num1
五.常量(const):不允许重新赋值
1.声明赋值:const name string = "Jack"
声明多个常量:
const(
a int=1
b string ="aa"
)
2.iota:声明无类型的"整数"序数(等差数列)
const (
a = iota
b
c
)
六.输出和输入
格式化输出:fmt.Printf()
1.%v #任意类型
2.%s #字符型
3.%d #整型
4.%.2f #浮点:保留两位小数
5.%t #布尔值
6.%T #输出类型
7.%c #编码转换,输出对应字符
获取键盘输入:
fmt.Scan(&a,&b),控制台空格间隔,输完参数自动结束,&为固定的绑定变量值的符号
fmt.Scanln(&a,&b),控制台空格间隔,输完参数回车结束
七.数据类型
1.基本数据类型
(1)整型
有符号整型(分正负) int8/16/32/64,默认由操作系统决定 [-32768, 32767]
无符号整型(不分正负) uint8/16/32/64 [0, 65535]
(2)浮点
float32 32位浮点数
float64 64位浮点数(短变量默认类型)
(3)布尔类型
bool true为真值,false为假值
var b1 bool = true
(4)字符串类型
1)字符串
string 字符串,字符串可以用双引号""或反引号``来表示
str := "Hello, World!"
multilineStr := ` //可以换行
This is a
multiline string.
`
2)字符串的拼接:+
str1 := "Hello, "
str2 := "World!"
str = str1+str2
3)字符串长度,单位是字节,英文占一个字节,汉字占三个字节:len
str := "Hello, World!"
length := len(str)
4)字符串索引:[],输出ascii码,的值用string()转回
str := "Hello世界"
firstChar := str[0]
secondChar := str[5] #汉字占三个字节,这样只取出一个字节
fmt.Println(firstChar, secondChar) // 输出 '72' 和 '228'
// 编码转换
fmt.Println(string(firstChar), string(secondChar)
5)字符串切片:可以取出汉字的内容,按照字节进行计数
str[start:end]:从start到end(不包括end)。
str[:]:获取字符串的完整副本
str := "Hello世界"
fmt.Println(str2[5:8]) // "世"
(5)字符型:可输出中文完整的ascii编码,使用string()可以转换,0到255
1)byte,使用单引号包括一个字符,相当于uint8
var a byte = 'a'
fmt.Println(a) // 97,输出ASCII编码值
2)rune,相当于int32,0到65535
var b rune = '中'
fmt.Println(b) // 20013
(6) \转义字符
\n 换行符号
\t 横向制表符号(多空格)
\b 回退符号
\f 换页符号
(7)零值:一个类型的空值或者说默认值更为准确。
var i int // 默认为0
var s8 string // 默认为""
var b3 bool // 默认为false
2.各种引用数据类型
1.数组
1.数组初始化
(1)初始化一个长度为5的整型数组
var nums [5]int
names = [3]string{"1","2","3"}
for i := 0; i < index; i++ {
newArr[i] = arr[i]
}
(2)也可以用元素初始化
nums := [5]int{1, 2, 3}
(3)自动设置长度
nums := [...]int{3, 8, 7, 12}
(1)下标访问:names[i]
(2)切片访问:names[n:m],不包括m,从0开始的话,可以省略
names[:m],names[0:],names[:]
(3)数组长度:len(数组)
(4)遍历数组,for循环的简化版
for key, value := range names {
fmt.Println(key, value)
}
(5)反转数组:
func reverseArray(arr [6]int) [6]int {
length := len(arr)
for i := 0; i < length/2; i++ {
arr[i], arr[length-i-1] = arr[length-i-1], arr[i]
}
return arr
}
func main() {
arr := [6]int{10, 20, 30, 40, 50, 60}
reversed := reverseArray(arr)
fmt.Println("反转后的数组:", reversed)
}
2.二维数组
1)// 初始化一个 2 行 3 列的二维数组
var arr [2][3]int = [2][3]int{ #本质操作行和列
{1, 2, 3},
{4, 5, 6},
}
2)// 使用 ... 自动推断行数
arr := [...][3]int{
{1, 2, 3},
{4, 5, 6},
}
fmt.Println(arr)
3) //遍历二维数组,相加列
func main() {
// 定义命令行参数
arr :=[2][2]int{
{1,2},
{4,3},
}
res :=make([]int,len(arr[0]))
for k,_ :=range arr[0]{ //列
sum :=0
for k1,_ :=range arr{ //行
fmt.Println(arr[k1][k])
sum = sum+arr[k1][k]
}
res[k] = sum
}
fmt.Println(res)
}
2.切片:和数组相比就是没有设置长度
(1)切片的初始化:和数组相比就是没有设置长度
s := []int{1, 2, 3, 4, 5} // 创建一个包含5个元素的切片
s := make([]int, 5, 10) // 创建类型为[]int,长度为5,最大容量为10的切片
(2)切片的长度和容量
len(slice),cap(slice) //容量第一次成倍扩容,后面一个一个扩容
(3)子切片
slice[startIndex:endIndex] //子切片的内容改变,父切片的内容也会改变
(4)切片增加元素
s = []int{1, 2, 3, 4, 5}
s = append(s, 6, 7, 8) // 向切片中添加元素,返回新的切片
(5)元素展开
s1 :=sp[:2]
s2 :=sp[3:]
s := append(s1,s2...) //s2...元素展开,在append函数使用
fmt.Println(s)
(6)复制拷贝切片
当需要一个独立副本时,可以使用内置的copy函数来实现
num1 :=[]int{1,2,3}
num2 :=make([]int,len(num1))
copy(目标切片, 源切片)
(7)字节切片:[]byte,字符串每个字符取出是字节,占用 1 个字节的内存空间。
8)字符串-->转字符切片
var str string
runes :=[]rune(s)
字符切片(ascci)-->转字符串,占用 4 个字节的内存空间
string(runes)
3.指针类型,指向一个内存地址
(1)指针的申明
var p *int //指针类型,p表示地址
*p //*取值
p = &a //&取地址
(2)new函数:分配一个内存
p :=new(int)
*p =100
4.映射(map)类型:关联键和值的数据结构(无序),查找灵活
(1)可扩展make初始化
s :=make(map[string]int) //map[键类型][值类型]
赋值:s["1"]=1
--
s :=map[string] int{
"key": value,
"Bob": 50000,
"Charlie": 60000,
}
(2)访问值,通过键得到值
v :=s[key]
(3)删除元素
delete(映射名字(变量值),“键”)
(4)循环输出
for key,value :=range 映射的变量名字{
fmt.Println(key,value)
}
5.结构体类型(struct)
(1)语法结构,定义在main之外
type 结构体名 struct {
字段名1 类型1
字段名2 类型2
...
}
type Person struct { //首字母大写,导包使用
Name string
Age int
City string
}
(2)初始化结构体
var p Person
p.Name = "Alice"
p.Age = 30
p.City = "Beijing"
--简化初始化
s := Person{
Name: "Bob",
Age: 25,
City: "Shanghai"
}
s := Person{
"Bob",
25,
"Shanghai"
}
(4)匿名结构体
person := struct {
Name string
Age int
}{
Name: "Charlie",
Age: 28,
}
(5)切片和map在结构体中的初始化
p2.A_name=[]string{"aa","bb"}
p2.Ck=map[string]int{"name":1}
6.Json类型:是一种轻量级的数据交换格式
{
"name": "Alice",
"age": 20,
"is_married": false,
"like": ["red", "blue", "purple"],
"phone": null
}
(1)序列化:json.Marshal,go中的数据转为json格式,序列化。json格式转为go中的数据格式,反序列化
设置标签:结构体的标签对应JSON对象的键,也可以不设置使用默认的
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Like []string `json:"like"`
Address map[string]string `json:"address"`
}
// 序列化
jsonData, err := json.Marshal(p1)
if err != nil {
fmt.Println(err)
}
(2)反序列化:json.Unmarshal,将JSON格式的字节切片解码为Go语言结构体。
// 反序列化
var p2 Person
err2 := json.Unmarshal(jsonData, &p2)
if err != nil {
fmt.Println(err2)
}
fmt.Println(p2)
找各种包:studygolang--->标准库中文版,
八.字符串操作
(1)遍历:英文,汉字可能会出现乱码,因为一个汉字可能占多个字节。
str := "Hello"
for i := 0; i < len(str); i++ {
fmt.Printf("%c ", str[i])
}
fmt.Println()
按字符(rune)遍历
优点: 能正确处理 UTF-8 编码的多字节字符,避免乱码。
str := "Hello, 世界"
for _, char := range str { //range 遍历数据类型,大多都返回key,value
fmt.Printf("%c ", char)
}
(2)Contains/Index查找字符串
1)strings.Contains(“源字符串”, “目标字符串”) bool: 判断字符串 s 是否包含子串 substr。
text := "I love programming in Go!"
fmt.Println(strings.Contains(text, "Go")) // 输出 true
2)strings.Index(“源字符串”, “目标字符串”) int: 返回子串 substr 在 s 中首次出现的索引。
text := "hello, world"
index := strings.Index(text, "world")
fmt.Println(index) // 输出 7
(3)Replace替换字符串
strings.Replace(“源字符串”, old, new,替换次数) //将 s 中的前 n 个 old 子串替换为 new 子串。
(4)Split分割字符串:输出为切片
strings.Split(“源字符串”,"分隔符") //以“分隔符”将 s 分割成多个子串。
(5)切片-->字符串:Join
strings.Join(“源字符串切片”, “连接符号”) //将字符串切片 a 中的元素用 sep 连接起来。
(6)大小写转换
strings.ToLower(“字符串”) // 将 s 中的所有字母转换为小写。
strings.ToUpper(“字符串”) //将 s 中的所有字母转换为大写。
strings.TrimSpace(“字符串”) //去除 s 首尾的空格。
九.数据类型转换
整型和浮点的转换:
var a int8 = 6
int16/float64(a)
字符串转换:
1)fmt.Sprintf("%d", a):其它类型转字符串,只格式化,不输出
var a int = 20
var stra string //转换的类型
stra = fmt.Sprintf("%d", a) //格式化输出转换
fmt.Printf("stra type is %T, value is %v \n", stra, stra)
2)fmt.Sprintf: //不同类型的数据拼接
var str string = "aa"
var f1 float32 = 12.2
var b1 bool = true
a := fmt.Sprintf("商品标题:%s 价格:%f 是否在售:%t\n",str,f1,b1)
fmt.Printf(a)
3)strconv:实现基本数据类型和字符串之间的转换
字符串和整型相互转换
strconv.Atoi(str) #字符串转整型
strconv.Itoa(int) #整型转字符串
字符串和浮点形转换
strconv.ParseFloat(str,64) #字符串转浮点
strconv,FormatFloat(num,'f',2,64) #浮点转字符串(要转换的浮点型,输出浮点形,保留2位,64位的)
字符串和布尔转换
strconv.ParseBool(str) #字符串转布尔
strconv.FormatBool(b) #布尔转字符串
4)字符串-->转字符切片
var str string
runes :=[]rune(s)
字符切片(ascci)-->转字符串
string(runes)
5)strings.Join:"字符串"切片-->转字符串
result := strings.Join(strSlice, ",")
练习:
// 创建一个映射,键为学生的姓名(字符串类型),值为一个自定义的 Student 结构体,
// 该结构体包含 Age(整数类型)和 Scores(整数切片类型,存储学生的多门课程成绩)两个字段。
// 实现以下功能:
// - 向映射中添加至少 3 个学生的信息。
// - 计算并输出每个学生的平均成绩。
// - 找出平均成绩最高的学生,并输出其姓名和平均成绩。
type Student struct{
Age int
Scores []int
}
func main() {
smap :=make(map[string]Student)
smap["name1"] =Student{
Age:11,
Scores: []int{1,3},
}
smap["name2"] =Student{
Age:22,
Scores: []int{2,4},
}
smap["name3"] =Student{
Age:33,
Scores: []int{4,6},
}
// avg :=make([]int,0)
// fmt.Println(smap)
hs :=""
hc :=0
for k,_ :=range smap{
sum :=0
for _,v1 :=range smap[k].Scores{
sum =sum+v1
}
// avg =append(avg,sum/len(smap[k].Scores))
fmt.Printf("%s,%d\n",k,sum/len(smap[k].Scores))
if hc < sum/len(smap[k].Scores){
hc = sum/len(smap[k].Scores)
hs = k
}
}
fmt.Println(hs,hc)
}
相关文章:
go语言数据类型
一.Go 语言有四大显著特点:高效性:编译与运行效率高。并发性:原生支持并发编程。简洁性:编程风格简洁直接,代码可读性与可维护性高。跨平台性:程序能在 Windows、Linux、Mac OS 等多系统运行。二.go的包:pa…...
操作系统 1.3-开机页面的产生
问题引入 从打开电源开始.. 这神秘的黑色背后发生着什么?... 设计思路 伟大的数学家图灵,设计了这样的一个模型: 首先我们计算机有一个控制器,他可以处理一系列提供给他的动作。我们将控制器动作,控制器状态,数据…...
单例模式:确保一个类只有一个实例
目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定(Double-Checked Locking) 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_modules
定义在 objs\ngx_modules.c #include <ngx_config.h> #include <ngx_core.h>extern ngx_module_t ngx_core_module; extern ngx_module_t ngx_errlog_module; extern ngx_module_t ngx_conf_module; extern ngx_module_t ngx_openssl_module; extern ngx_modul…...
vue3中 组合式~测试深入组件:事件 与 $emit()—setup() 上下文对象ctx.emit
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...
uniapp小程序对接腾讯IM即时通讯无ui集成(1)
首先需要完成一些准备工作。 1.注册腾讯云账号 腾讯云 注册账号后搜索im即时通讯,新创建一个应用。 2.uniapp创建项目 腾讯云无ui集成文档 按照文档步骤下载完这两个包后打开项目。有下图这两个包就算完成了开始工作。 3.APP目录进行引入和集成 <script…...
【YOLOv12改进trick】StarBlock引入YOLOv12,创新涨点优化,含创新点Python代码,方便发论文
🍋改进模块🍋:StarBlock 🍋解决问题🍋:采用StarBlock将输入数据映射到一个极高维的非线性特征空间,生成丰富的特征表示,使得模型在处理复杂数据时更加有效。 🍋改进优势🍋:简单粗暴的星型乘法涨点却很明显 🍋适用场景🍋:目标检测、语义分割、自然语言处理…...
机器学习之强化学习
引言 在人工智能的众多分支中,强化学习(Reinforcement Learning, RL) 因其独特的学习范式而备受关注。与依赖标注数据的监督学习或探索数据结构的无监督学习不同,强化学习的核心是智能体(Agent)通过与环境…...
天津大学02-深度解读DeepSeek:部署、使用、安全【文末附下载链接】
大模型风险与不当用例——价值观错位 大模型与人类价值观、期望之间的不一致而导致的安全问题,包含:• 社会偏见(Social Bias)LLM在生成文本时强化对特定社会群体的刻板印象,例如将穆斯林与恐怖主义关联,或…...
C# OPC DA获取DCS数据(提前配置DCOM)
OPC DA配置操作手册 配置完成后,访问远程ip,就能获取到服务 C#使用Interop.OPCAutomation采集OPC DA数据,支持订阅(数据变化)、单个读取、单个写入、断线重连...
ReAct论文阅读笔记总结
ReAct:Synergizing Reasoning and Acting in Language Models 背景 最近的研究结果暗示了在自主系统中结合语言推理与交互决策的可能性。 一方面,经过适当Prompt的大型语言模型(LLMs)已经展示了在算术、常识和符号推理任务中通…...
【计网】运输层
运输层 5.1 运输层概述5.2 运输层端口号、复用与分用5.3 UDP和TCP的区别5.4 TCP具体实现5.4.1 TCP的流量控制5.4.2 TCP的拥塞控制5.4.3 TCP超时重传时间的选择5.4.4 TCP可靠传输的实现5.4.5 TCP运输连接管理(一)TCP连接的建立(三报文握手&…...
计算机毕业设计SpringBoot+Vue.js多媒体素材库系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
MC9S12单片机的内存映射机制
地址空间 这是个16位的单片机。CPU的寻址空间最大为2^1664K。 这个64K是包括外设、RAM、EEPROM、和FLASH的。现在程序越来越大,64K的空间肯定是不够用的。因此,需要扩展。 扩展方法就是:分页。 把原来的64K空间,划分一块出来&a…...
鸿蒙HarmonyOS评论功能小demo
评论页面小demo 效果展示 1.拆解组件,分层搭建 我们将整个评论页面拆解为三个组件,分别是头部导航,评论项,回复三个部分,然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…...
数据仓库为什么要分层
数据仓库分层架构是数据仓库设计中的一个重要概念,其主要目的是为了更好地组织和管理数据,提高数据仓库的可维护性、可扩展性和性能。分层架构将数据仓库划分为多个层次,每个层次都有其特定的职责和功能。以下是数据仓库分层的主要原因和好处…...
【powerjob】 powerjobserver注册服务IP错误
1、问题:powerjobserver 4.3.6 的服务器上有多个网卡对应多个ip,示例 eth0 :IP1 ,docker0:IP2 和worker 进行通信时 正确的应该时IP1 但是注册显示获取的确实IP2,导致 worker 通过ip2和server通信,网络不通,注册不上 2、解决方案 …...
JCRQ1河马算法+四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测
JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-GRU-Attention、CNN-GRU-Attent…...
智能硬件如何和应用层app连接?
现在比较方便的是一键配置方式,主要是使用蓝牙、smartconfig、ZigBee和声波配置。 蓝牙配置:比如蓝牙耳机、蓝牙鼠标,只能支持点对点连接,且对设备和app距离要求严格。 ZigBee配置方式:无法直接接入网络,…...
深度学习系列78:使用langchain的api进行RAG
用起来很麻烦,看api的工夫都已经能自己写完代码了。但现在有些开源api用的是langchain的接口,还是了解一下。参考官方文档:https://www.langchain.com.cn/docs/how_to/ 1. LLM和langserve示例 以openai接口为例,可以看到分为3步…...
海思Hi3516DV300交叉编译opencv
OpenCV是一个开源的跨平台计算机视觉库,支持C、Python等多种语言,适用于图像处理、目标检测、机器学习等任务。其核心由C编写,高效轻量,提供实时视觉处理功能,广泛应用于工业自动化、医疗影像等领域。 1 环境准备 1…...
责任链模式:优雅处理复杂流程的设计艺术
引言 在软件设计中,我们经常会遇到需要按特定顺序处理请求的场景。例如,一个订单处理系统可能需要经过验证、付款、物流安排和客户通知等多个步骤。如果我们将这些步骤硬编码在一个方法中,代码将变得臃肿且难以维护。这时,责任链…...
【DeepSeek】5分钟快速实现本地化部署教程
一、快捷部署 (1)下载ds大模型安装助手,下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe (2)打开软件,点击立即激活 (3)选…...
HTML前端手册
HTML前端手册 记录前端框架在使用过程中遇到的各种问题和解决方案,供后续快速进行手册翻阅使用 文章目录 HTML前端手册1-前端框架1-TypeScript框架2-CSS框架 2-前端Demo1-Html常用代码 2-知云接力3-Live2D平面动画 3-前端运维1-NPM版本管理 1-前端框架 1-TypeScrip…...
【uniapp】图片添加canvas水印
目录 需求&背景实现地理位置添加水印 ios补充 需求&背景 需求:拍照后给图片添加水印, 水印包含经纬度、用户信息、公司logo等信息。 效果图: 方案:使用canvas添加水印。 具体实现:上传图片组件是项目里现有的ÿ…...
Java 大视界 -- Java 大数据在智能金融反欺诈中的技术实现与案例分析(114)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
机器学习数学基础:43.外生变量与内生变量
外生变量与内生变量:模型中的因果角色 在因果模型(像结构方程模型、回归分析这类)里,外生变量和内生变量是用来区分变量来源和相互关系的重要概念。下面从定义、实例、差异以及应用场景四个方面来详细介绍: 一、定义…...
Bean 的生命周期主要包括以下阶段:
Bean 的生命周期主要包括以下阶段: 定义 :在配置文件或注解中定义 Bean,包括其类、作用域等信息。 实例化 :Spring 容器根据定义创建 Bean 的实例。 属性赋值 :容器为 Bean 设置配置的属性值。 初始化 :…...
Unity游戏开发中的网格简化与LOD技术(Mesh Simplification LOD)
在Unity游戏开发中,网格简化(Mesh Simplification)和LOD(Level of Detail)技术是优化渲染性能的关键手段,尤其在处理复杂场景和高精度模型时至关重要。以下是一套系统的实现方案与优化策略: 一、…...
3.7[Q]CV
对于一个由cmake构建的项目,什么时候应该执行cmake指令?什么时候执行make指令?即,一个cmake构建的项目,各步骤的意义是什么?当我修改了部分代码后,重启项目该执行什么命令? view,mod…...
发行思考:全球热销榜的频繁变动
几点杂感: 1、单机游戏销量与在线人数的衰退是剧烈的,有明显的周期性,而在线游戏则稳定很多。 如去年的某明星游戏,最高200多万在线,如今在线人数是48名,3万多。 而近期热门的是MH,在线人数8…...
Springboot全局LocalDateTime时间格式化配置
我们对字段的日期格式化时一般会用注解: JsonFormat(pattern "yyyy-MM-dd HH:mm:ss", timezone "GMT8")private Date createDate;但是每个字段都要写也太麻烦了 不是我的全局化作风 在application.yml中配置全局时间格式化只会对Date类型有用: jackson:d…...
Redis主从复制
目录 点单问题 启动多个redis服务器 配置主从结构 查看主从结构信息 断开主从结构 修改主从结构 主从复制的拓扑结构 主从复制的基本流程 全量复制和部分复制 全量复制的流程 部分复制的流程 实时复制的流程 主从复制总结 主从复制是基于分布式系统进行讨论的&am…...
玩转python:掌握Python数据结构之栈Stack
栈(Stack)是计算机科学中一种非常基础且重要的数据结构。它的特点是后进先出(LIFO,Last In First Out),就像我们生活中叠盘子一样,最后放上去的盘子总是最先被拿走。本文将用通俗易懂的语言和丰…...
电脑如何拦截端口号,实现阻断访问?
如果你弟弟喜欢玩游戏,你可以查询该应用占用的端口,结合以下方法即可阻断端口号,让弟弟好好学习,天天向上! 拦截端口可以通过防火墙和路由器进行拦截 ,以下是常用方法: 方法 1:使用…...
DeepSeek 医疗大模型微调实战讨论版(第一部分)
DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …...
Apache Httpd 多后缀解析
目录 1.原因 2.环境 3.复现 4.防御 1.Apache Httpd 多后缀解析原因 Apache HTTP Server 在处理文件请求时,通常会根据文件的后缀来确定如何处理该文件。例如,.php文件会被交给 PHP 解释器处理,而.html文件则直接作为静态文件返回。 然而…...
2025年03月07日Github流行趋势
项目名称:ai-hedge-fund 项目地址url:https://github.com/virattt/ai-hedge-fund项目语言:Python历史star数:12788今日star数:975项目维护者:virattt, seungwonme, KittatamSaisaard, andorsk, arsaboo项目…...
Jenkins在Windows上的使用(二):自动拉取、打包、部署
(一)Jenkins全局配置 访问部署好的Jenkins服务器网址localhost:8080,完成默认插件的安装后,接下来将使用SSH登录远程主机以实现自动化部署。 1. 配置插件 选择dashboard->Manage Jenkins->plugins 安装下面两个插件 …...
【JavaEE】-- 多线程(初阶)4
文章目录 8.多线程案例8.1 单例模式8.1.1 饿汉模式8.1.2 懒汉模式 8.2 阻塞队列8.2.1 什么是阻塞队列8.2.2 生产者消费者模型8.2.3 标准库中的阻塞队列8.2.4 阻塞队列的应用场景8.2.4.1 消息队列 8.2.5 异步操作8.2.5 自定义实现阻塞队列8.2.6 阻塞队列--生产者消费者模型 8.3 …...
测试直播postman+Jenkins所学
接口自动化 什么是接口?本质上就是一个url,用于提供数据。后台程序提供一种数据地址,接口的数据一般是从数据库中查出来的。 postman自动化实操: 一般来说公司会给接口文档,如果没有,通过拦截,…...
5人3小时复刻Manus?开源OpenManus项目全解剖,我的DeepSeek股票报告这样诞生
大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! OpenManus是什么 1. 项目背景 OpenManus 是由 MetaGPT 核心团队仅用 3 小时复刻而成的开源…...
【javaEE】多线程(基础)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
0.大模型开发知识点需求综述
文章目录 一、机器学习与深度学习基础二、自然语言处理(NLP)基础三、大模型架构四、训练优化技术五、数据处理与预处理六、分布式训练与并行化策略七、微调方法与参数高效微调八、训练框架、工具与自动化流程九、评估与部署十、前沿技术与未来趋势 已更新…...
WHAT - 前端阻塞场景梳理
目录 前言场景梳理1. JavaScript 执行阻塞主线程场景优化思路具体代码示例1. 长时间运行的同步 JavaScript 代码2. 过多的主线程任务(如频繁的 setTimeout/setInterval)3. 未优化的第三方库或框架初始化逻辑总结 2. 样式计算与布局(Layout&am…...
微前端框架 Qiankun 的应用及问题分析
一、Qiankun 的核心应用场景与优势 多技术栈共存与灵活集成 Qiankun 支持主应用与子应用使用不同技术栈(如 Vue、React、Angular 等),通过 HTML Entry 方式接入子应用,无需深度改造子应用即可实现集成,降低了技术迁移成…...
bash: uwsgi: 未找到命令
针对你提出的“bash: uwsgi: command not found”问题,以下是一些可能的解决方案,请按照步骤逐一排查: 1、检查uwsgi命令是否正确: 确保你输入的命令是uwsgi,而不是uWSGI或其他变体。 2、确认uwsgi是否已安装&…...
HAL库,配置adc基本流程
1. 初始化阶段---cubemx (1) GPIO初始化 函数:HAL_GPIO_Init() 作用:配置ADC引脚为模拟输入模式。 代码示例: // 使能GPIOA时钟 __HAL_RCC_GPIOA_CLK_ENABLE();// 配置PA1为模拟输入 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStr…...
【Unity】 HTFramework框架(六十一)Project窗口文件夹锁定器
更新日期:2025年3月7日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 Project窗口文件夹锁定器框架文件夹锁定自定义文件夹锁定限制条件 Project窗口文件夹锁定器 在Project窗口中,文件夹锁定器能够为任何文件夹加…...
网络安全技术整体架构 一个中心三重防护
网络安全技术整体架构:一个中心三重防护 在信息技术飞速发展的今天,网络安全的重要性日益凸显。为了保护信息系统不受各种安全威胁的侵害,网络安全技术整体架构应运而生。本文将详细介绍“一个中心三重防护”的概念,并结合代码示…...