Go语言学习笔记(三)复杂数据类型切片和Map

0 阅读4分钟

1.值类型和指针类型:

可以用"*"来声明一个变量是指针类型的数据(常量的值不可变,因此不能声明为指针类型).指针存储的是内存地址,而内存地址指向真实存储的数据内容.

可以用&操作符来获取某个变量或者常量的内存地址,从而产生一个指针.

1.1demo:

package main

import "fmt"

func main() {
	//	值变量
	var a = 2665
	fmt.Println("值类型a的内容是:", a, "\n")

	var b = 65536
	//	指针变量p
	p := &b
	fmt.Println("指针类型p的内容:", p)

}

执行结果:

可以看出指针p打印出来的其实是一个内存地址值.

2.切片(slice)

切片可以看做是大小可变的数组.

2.1make函数创建切片:

package main

import "fmt"

func main() {

	s := make([]int, 5, 10)

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))
}

利用make函数创建了一个长度为5,容量为10的int类型的切片.

执行结果:

2.2切片元素:

package main

import "fmt"

func main() {

	s := make([]int, 5, 10)

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))

	for i := 0; i < len(s); i++ {
		s[i] = i
	}

	for _, e := range s {
		fmt.Println(e)
	}
}

执行结果:

2.3切片长度扩展:

package main

import "fmt"

func main() {

	s := make([]int, 5, 10)

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))

	s = append(s, 5, 6, 7, 8, 9)

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))
}

执行结果:

2.4切片容量的扩展:

package main

import "fmt"

func main() {

	s := make([]int, 5, 10)

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))

	fmt.Printf("切片地址:%p\n", s)

	s = append(s, 5, 6, 7, 8, 9)
	fmt.Printf("切片追加元素,未超过容量地址:%p\n", s)

	s = append(s, 10, 11)

	fmt.Printf("切片追加元素,超过容量地址:%p\n", s)

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))
}

执行结果:

超过容量后,切片的地址变化了.说明容量的扩充是底层数组的重新创建来实现的.

2.5切片的复制:

package main

import "fmt"

func main() {
	s := make([]int, 5, 10)

	fmt.Printf("s 初始长度:%d 初始容量:%d\n", len(s), cap(s))

	_ = append(s, 5, 6, 7, 8, 9)

	fmt.Printf("追加后s长度:%d 初始容量:%d\n", len(s), cap(s))

	s1 := append(s, 10)
	fmt.Printf("追加后s长度:%d 初始容量:%d\n", len(s), cap(s))
	fmt.Printf("追加后s长度:%d 初始容量:%d\n", len(s1), cap(s1))
}

 执行结果:

转存失败,建议直接上传图片文件​编辑

通过执行结果可以看出,append函数内部并没有改变原始切片的值.只能通过重新赋值 来改变原来的切片.

2.6数组创建切片:

package main

import "fmt"

func main() {
	
	array := [5]int{1, 2, 3, 4, 5}

	fmt.Printf("数组地址:%p\n", &array)

	s := array[:]

	fmt.Printf("切片的长度:%d\n", len(s))

	fmt.Printf("切片的容量:%d\n", cap(s))

	fmt.Printf("切片地址:%p\n", s)

	s1 := array[1:3]

	fmt.Printf("切片的长度:%d\n", len(s1))

	fmt.Printf("切片的容量:%d\n", cap(s1))

	fmt.Printf("切片地址:%p\n", s1)
}

执行结果:

2.7:切片创建切片:

package main

import "fmt"

func main() {

	s := make([]int, 5, 10)

	fmt.Printf("切片地址:%p\n", s)

	s1 := s[1:]
	fmt.Printf("切片地址:%p\n", s1)

}

执行结果:

2.8切片元素修改:

package main

import "fmt"

func main() {

	s := make([]int, 5, 10)

	fmt.Printf("切片地址:%p\n", s)
	
	s1 := s[1:]
	s1[1] = 100

	fmt.Println("s=", s)

	fmt.Println("s1=", s1)

	fmt.Printf("切片地址:%p\n", s1)

}

执行结果:

因为他们所在元素的地址是一样的,所以修改了一个元素的值,对应的也会被修改.

2.9切片循环处理:

package main

import "fmt"

func main() {
	array := [5]int{1, 2, 3, 4, 5}

	s1 := array[1:3]

	for i, e := range s1 {
		fmt.Printf("第%d个元素为:%d\n", i, e)
	}

}

执行结果:

3.map(映射)

3.1make函数创建map:

m := make(map[string]int)

[]里的是key的类型,int是value的类型.

3.2遍历map:

package main

import "fmt"

func main() {

	m := make(map[string]int)

	m["a"] = 1
	m["b"] = 2
	m["c"] = 3

	for k, v := range m {
		fmt.Printf("key的值为%s,value值为%d\n", k, v)
	}
}

执行结果:

3.3map元素查找:

package main

import "fmt"

func main() {

	m := make(map[string]int)

	m["a"] = 1
	m["b"] = 2
	m["c"] = 3

	for k, v := range m {
		fmt.Printf("key的值为%s,value值为%d\n", k, v)
	}

	flag := m["d"]

	fmt.Println(flag)
}

执行结果:

如果元素不存在就会返回一个0.

3.4map删除元素:

package main

import "fmt"

func main() {

	m := make(map[string]int)

	m["a"] = 1
	m["b"] = 2
	m["c"] = 3

	for k, v := range m {
		fmt.Printf("key的值为%s,value值为%d\n", k, v)
	}
	delete(m, "a")

	for k, v := range m {
		fmt.Printf("删除后key的值为%s,删除后value值为%d\n", k, v)
	}
}

 执行结果:

语雀地址www.yuque.com/itbosunmian…?

《Go.》 密码:xbkk 欢迎大家访问.提意见.