当前位置: 首页 > article >正文

go语言数据类型

一.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 语言有四大显著特点:
    高效性:编译与运行效率高。
    并发性:原生支持并发编程。
    简洁性:编程风格简洁直接,代码可读性与可维护性高。
    跨平台性:程序能在 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)
}        

            
 


http://www.kler.cn/a/573868.html

相关文章:

  • ESP32-P4 支持哪些 RISC-V 汇编指令?
  • 将 PHP 函数转换为 Python
  • 低空经济-飞行数据平台 搭建可行方案
  • H5DS编辑器是如何让企业快速构建动态页面
  • 【JAVA架构师成长之路】【JDK源码】第5集:Map集合框架与泛型
  • leetcode日记(74)扰乱字符串
  • 科技解密丨赫思嘉·惟愿:深耕医美领域,以创新科技引领行业新篇章
  • DSP笔记
  • 【Aioredis实战总结】如何修改aioredis的最大连接数。
  • 13、TCP和UDP的区别【高频】
  • Linux部署Redis集群
  • 如何用deepseek写游戏(思路教程分享)【附图文】
  • Flink:大数据处理的“双面侠”
  • 【报错:HikariPool-1 - Exception during pool initialization.】
  • Gpt翻译完整版
  • Linux kill 命令
  • Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
  • java基础(算法用)
  • 【JavaEE】-- 多线程(初阶)3
  • Python-07PDF转Word