tags:
categories:
package main
import "fmt"
/*
[0 0 0]
[10 20 30]
intArr的地址=0xc0420520a0 intArr[0] 地址0xc0420520a0 intArr[1] 地址0xc0420520a8 intArr[2] 地址0xc0420520b0PS
*/
func main() {
var intArr [3]int //int占8个字节
//当我们定义完数组后,其实数组的各个元素有默认值0
fmt.Println(intArr)
intArr[0] = 10
intArr[1] = 20
intArr[2] = 30
fmt.Println(intArr)
fmt.Printf("intArr的地址=%p intArr[0] 地址%p intArr[1] 地址%p intArr[2] 地址%p",
&intArr, &intArr[0], &intArr[1], &intArr[2])
}
//四种初始化数组的方式
var numArr01 [3]int = [3]int{1, 2, 3}
fmt.Println("numArr01=", numArr01)
var numArr02 = [3]int{5, 6, 7}
fmt.Println("numArr02=", numArr02)
//这里的 [...]是规定的写法
var numArr03 = [...]int{8, 9, 10}
fmt.Println("numArr03=", numArr03)
var numArr04 = [...]int{1: 800, 0: 900, 2:999}
fmt.Println("numArr04=", numArr04)
//类型推导
strArr05 := [...]string{1: "tom", 0: "jack", 2:"mary"}
fmt.Println("strArr05=", strArr05)
for index, value := range array01 {
...
}
//演示for-range遍历数组
heroes := [...]string{"宋江", "吴用", "卢俊义"}
//使用常规的方式遍历
for i := 0; i < len(heroes); i++{
fmt.Printf("常规方式遍历heroes[%d]=%v\n", i, heroes[i])
}
//for-range遍历数组
for i, v := range heroes {
fmt.Printf("i=%v v=%v\n", i, v)
fmt.Printf("for-range遍历heroes[%d]=%v\n", i, heroes[i])
}
for _, v := range heroes {
fmt.Printf("for-range遍历元素的值=%v\n", v)
}
arr := [3]int{11, 22, 33}
// 值传递
test(arr)
fmt.Println(arr)
// 把数组的地址传过来
test01(&arr)
fmt.Println(arr)
// 直接传递数组 值传递 复制一份数组
func test(arr [3]int) {
arr[0] = 88
}
// 把数组的地址传过来
func test01(arr *[3]int) {
(*arr)[0] = 88
}
type slice struct {
ptr *[2]int
len int
cap int
}
package main
import "fmt"
func main() {
var arr [5]int = [...]int{1,2,3,4,5}
// 第一种方式: 定义一个切片,然后让切片去引用一个已经创建好的数组
var slice1 = arr[1:3]
fmt.Println("arr=", arr)
fmt.Println("slice1=", slice1)
fmt.Println("slice1 len =", len(slice1))
fmt.Println("slice1 cap =", cap(slice1))
//第二种方式: 通过make来创建切片
var slice2 []float64 = make([]float64, 5, 10)
slice2[1] = 10
slice2[3] = 20
//对于切片,必须make使用。
fmt.Println(slice2)
fmt.Println("slice2的size=", len(slice2))
fmt.Println("slice2的cap=", cap(slice2))
//第3种方式:定义一个切片,直接就指定具体数组,使用原理类似make的方式
var strslice []string = []string{"tom", "jack" , "mary"}
fmt.Println("strslice=", strslice)
fmt.Println("strslice size=", len(strslice)) //3
fmt.Println("strslice cap=", cap(strslice)) // 3
}
package main
import "fmt"
func main() {
//使用常规的for循环遍历切片
var arr [5]int = [...]int{10, 20, 30, 40, 50}
slice := arr[1:4] // 20,30,40
for i:=0; i<len(slice); i++{
fmt.Printf("slice[%v]=%v", i, slice[i])
}
fmt.Println()
//使用for-range方式遍历切片
for i, v := range slice {
fmt.Printf("i=%v v=%v \n", i, v)
}
}
package main
import "fmt"
func main() {
//使用常规的for循环遍历切片
var arr [5]int = [...]int{10, 20, 30, 40, 50}
slice := arr[1:4]
// 对切片进行切片
slice2 := slice[1:2] // slice[20, 30, 40]
slice2[0] = 100
//因为arr,slice 和slice2 指向的数据空间是同一个,因此slice2[0]=100,
fmt.Println("slice2=", slice2)
fmt.Println("slice=", slice)
fmt.Println("arr=", arr)
//用append内置函数,可以对切片进行动态追加
var slice3 []int = []int{100, 200, 300}
//通过append直接给slice3追加具体的元素
slice3 = append(slice3, 400, 500, 600)
fmt.Println("slice3", slice3) //100, 200, 300, 400, 500, 600
//通过append将切片slice3追加给slice3 把slice追加给slice3 都要加 ...
// 不能直接追加数组slice3 = append(slice3, arr)
slice3 = append(slice3, arr[1:2]...)
slice3 = append(slice3, slice...)
slice3 = append(slice3, slice3...) // 100, 200, 300,400, 500, 600 100, 200, 300, 4
fmt.Println("slice3", slice3)
//切片的拷贝操作
//切片使用copy内置函数完成拷贝,举例说明
fmt.Println()
var slice4 []int = []int{1, 2, 3, 4, 5}
var slice5 = make([]int, 10)
copy(slice5, slice4)
fmt.Println(" slice4=", slice4)// 1, 2, 3, 4, 5
fmt.Println("slice5=", slice5) // 1, 2, 3, 4, 5, 0,0 ,0,0,0
// a的长度大于slicea 把a复制过去不会报错
var a []int = []int {1,2,3,4,5}
var slicea = make([]int, 1)
fmt.Println(slicea) // [0]
copy(slicea, a)
fmt.Println(slicea)// [1]
}
package main
import "fmt"
func main() {
//string底层是一一个byte数组,因此string也可以进行切片处理
str := "hel1o@atguigu"
//使用切片获取到atguigu
slice := str[6:]
fmt.Println("slice=", slice)
//string是不可变的,也就说不能通过str[0] = 'z’方式来修改字符串
//str[0] = 'z' [编译不会通过,报错,原因是string是不可变]
//如果需要修改字符串,可以先将string -> []byte /或者[]rune ->修改->重写转成string
// "hello@atguigu" =>改成”zello@atguigu"
arr1 := []byte(str)
arr1[0] = 'z'
str = string(arr1)
fmt.Println("str=", str)
//细节,我们转成[]byte后, 可以处理英文和数字,但是不能处理中文
//原因是[]byte 字节来处理,而一个汉字,是3个字节,因此就会出现乱码
//解快方法是将string 转成[]rune 即可,因为 []rune是按字符处理,兼容汉字
arr2 := []rune(str)
arr2[0] = '北'
str = string(arr2)
fmt.Println("str=", str)
}
// 使用方式1:先声明/定义,再赋值
// 语法: var数组名[大小][大小]类型,
var arr [2][3]int
// 使用方式2:直接初始化
// 语法: var数组名[大小][大小]类型= [大小][大小]类型{{初值..},{初值.}}
var 数组名 [大小][大小]类型 = [大小][大小]类型{{初值...},{初值...}}
var 数组名 [大小][大小]类型 = [...][大小]类型{{初值...},{初值...}}
var 数组名 = [大小][大小]类型{{初值...},{初值...}}
var 数组名 = [...][大小]类型{{初值...},{初值...}}
var a = [3][4]int{
{0, 1, 2, 3} , /* 第一行索引为 0 */
{4, 5, 6, 7} , /* 第二行索引为 1 */
{8, 9, 10, 11}, /* 第三行索引为 2 */
}
package main
import "fmt"
func main() {
//演示二维数组的遍历
var arr3 = [2][3]int{{1,2,3}, {4,5,6}}
//for循环来遍历
fmt.Println(arr3)
for i := 0; i < len(arr3); i++ {
for j := 0; j < len(arr3[i]); j++ {
fmt.Printf("%v\t", arr3[i][j] )
}
fmt.Println()
}
//for-range来遍历二维数组
for i, v := range arr3 {
for j,v2 := range v{
fmt.Printf("arr3[%v][%v]=%v \t",i, j, v2)
}
fmt.Println()
}
}
func main() {
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string
}
package main
import "fmt"
func main() {
//map的声明和注意事项
var a map[string]string
//在使用map前,需要先make,make的作用就是给map分配数据空间
a = make(map[string]string, 10)
a["no1"] = "宋江" //ok?
a["no2"] = "吴用" //ok?
a["no1"] = "武松" //ok?
a["no3"] = "吴用" //ok?
fmt.Println(a)
}
package main
import "fmt"
func main() {
// 第一种使用方式
//map的声明和注意事项
var a map[string]string
//在使用map前,需要先make,make的作用就是给map分配数据空间
a = make(map[string]string, 10)
a["no1"] = "宋江" //ok?
a["no2"] = "吴用" //ok?
a["no1"] = "武松" //ok?
a["no3"] = "吴用" //ok?
fmt.Println(a)
//第二种 方式 不用给出个数
cities := make(map[string]string)
cities["no1"] = "北京"
cities["no2"] = "天津"
cities["no3"] = "上海"
fmt.Println(cities)
//第三种方式 最后的,别忘记
heroes := map[string]string{
"hero1" : "宋江",
"hero2" : "卢俊义",
"hero3" : "吴用",
}
heroes["hero4"] = "林冲"
fmt. Println("heroes=", heroes)
/*案例
课堂练习:演示个key-value 的value是map的案例
比如:我们要存放3个学生信息,每个学生有name和sex 信息
思路:
map[string]map[string]string
*/
studentMap := make(map[string]map[string]string)
studentMap["stu01"] = make(map[string]string, 3)
studentMap["stu01"]["name"] = "tom"
studentMap["stu01"]["sex"] = "男"
studentMap["stu01"]["address"] = "北京长安街~"
studentMap["stu02"] = make(map[string]string, 3) //这句话不能少!!
studentMap["stu02"]["name"] ="mary"
studentMap["stu02"]["sex"] = "女"
studentMap["stu02"]["address"] = "上海黄浦江~"
fmt.Println(studentMap)
fmt.Println(studentMap["stu02"])
fmt.Println(studentMap["stu02"]["address"])
}
package main
import "fmt"
func main() {
cities := make(map[string]string)
cities["no1"] = "北京"
cities["no2"] = "天津"
cities["no3"] = "上海"
fmt.Println(cities)
//因为no3这个key已经存在,因此下面的这句话就是修改
cities["no3"]="上海~"
fmt.Println(cities)
//演示删除
delete(cities, "no1" )
fmt.Println(cities)
//当delete指定的key不存在时,删除不会操作,也不会报错
delete(cities, "no4")
fmt.Println(cities)
//如果希望一次性删除所有的key
//1.遍历所有的key,如何逐一删除[遍历]
//2.直接make一个新的空间
cities = make(map[string]string)
fmt.Println(cities)
//演示map的查找
val, ok := cities["no2"]
if ok{
fmt.Printf("有no1 key值为%v\n", val)
} else {
fmt.Printf("没有no1 key\n")
}
studentMap := make(map[string]map[string]string)
studentMap["stu01"] = make(map[string]string, 3)
studentMap["stu01"]["name"] = "tom"
studentMap["stu01"]["sex"] = "男"
studentMap["stu01"]["address"] = "北京长安街~"
studentMap["stu02"] = make(map[string]string, 3) //这句话不能少!!
studentMap["stu02"]["name"] ="mary"
studentMap["stu02"]["sex"] = "女"
studentMap["stu02"]["address"] = "上海黄浦江~"
// map的遍历
for k1, v1 := range studentMap {
fmt.Println("k1=", k1)
for k2, v2 := range v1 {
fmt.Printf("\t k2=%v v2=%v\n", k2, v2)
fmt.Println()
}
}
fmt.Println(len(studentMap))
}
package main
import "fmt"
func main() {
//演示map切片的使用
/*
要求:使用一个map来记录monster的信息
name和age, 也就是说一个
monster对应个map 并且妖怪的个数 可以动态的增加=>map切片
*/
//1.声明一个map切片
var monsters []map[string]string
monsters = make([]map[string]string, 2) //准备放入两个妖怪
//2.增加第一个妖怪的信息
if monsters[0] == nil {
monsters[0] = make(map[string]string, 2)
monsters[0]["name"] = "牛魔王"
monsters[0]["age"] = " 500"
}
if monsters[1] == nil {
monsters[1] = make(map[string]string, 2)
monsters[1]["name"] = "玉兔精"
monsters[1]["age"] ="400"
}
/* 下面这个写法越界panic: runtime error: index out of range
if monsters[2] == nil {
monsters[2] = make(map[string]string, 2)
monsters[2]["name"] = "越界精"
monsters[2]["age"] ="400"
}
*/
//这里我们需要使用到切片的append函数,可以动态的增加monster
//1.先定义个monster信息
newMonster := map[string]string{
"name" : "新的妖怪~火云邪神",
"age" : "200",
}
monsters = append(monsters, newMonster)
fmt.Println(monsters)
}
package main
import (
"fmt"
"sort"
)
func main() {
//map的排序
map1 := make(map[int]int, 10)
map1[10] = 100
map1[1] = 13
map1[4] = 56
map1[8] = 90
fmt.Println(map1)
//如果按照map的key的顺序进行排序输出
//1.先将map的key 放入到切片中
//2.对切片排序
//3.遍历切片,然后按照key来输出map的值
var keys []int
for k,_ := range map1 {
keys = append(keys, k)
}
//排序
sort.Ints(keys)
fmt.Println(keys)
for _, k := range keys{
fmt.Printf("map1[%v]=%v\n", k, map1[k])
}
}