考核知识点: 1.指针类型 2.数组与切片 3.Map类型
- 代码执行结果
const (
x = iota
_
y
z = "zzz"
k
p = iota
)
func main() {
fmt.Println(x,y,z,k,p) // 0 2 zzz zzz 5
}
解析:
iota是一个常量计数器,在一个常量组中,第一个iota的值为0,并且在其常量域内按行递增,因此程序到y时,已经累积到了2,对于常量k,本身k是没有值的,默认按照和它的上一行常量值相等的原则(实际上是go的语法糖),值和常量z保持一致都为"zzz",对于常量p,此时已经是iota出现后的第5行,因此值为5.
- 代码执行结果
s := make([]int, 5)
s = append(s, 1, 2, 3)
fmt.Println(s) // 0 0 0 0 0 1 2 3
解析:
第一行即初始化了一个长度为5,元素为int类型,默认为0的一个切片,因此实例化后,整个切片就已经是[0,0,0,0,0]了
- 代码执行结果
p1 := 1
p2 := &p1
*p2++
fmt.Println(p1) // 2
fmt.Println(p2) // 变量p1的内存地址
解析:
&p1就是对变量p1的取址操作,因此p2的值就是变量p1的内存地址,*p2++则是通过地址直接操作变量p1的值使其自增1,因此p1的值为2
- 代码执行结果
a := [3]int{0, 1, 2}
s := a[1:2]
s[0] = 11
s = append(s, 12)
s = append(s, 13)
s[0] = 21
fmt.Println(a) // 0 11 12
fmt.Println(s) // 21 12 13
解析
首先对于 a = [0, 1, 2], 容量为3 , s = [1],容量为2(扩容前可以再append一个值)
执行s[0] = 11,由于a,s共享同一个底层数组,此时:a = [0,11,2] , s = [11]
执行s = append(s, 12),s尚未扩容,由于a,s共享同一个底层数组,此时:a = [0,11,12] , s = [11,12]
执行s = append(s, 13),s扩容,a与s不再共享同一个底层数组,s = [11,12,13],最终为[21,12,13],已经影响不到a了。
- 代码执行结果
var a = [5]int{1, 2, 3, 4, 5}
var r [5]int
for i, v := range &a {
if i == 0 {
a[1] = 12
a[2] = 13
}
r[i] = v
}
fmt.Println("r = ", r) // r = [1 12 13 4 5]
fmt.Println("a = ", a) // a = [1 12 13 4 5]
- 代码执行结果
slice := []int{10, 11, 12, 13}
m := make(map[int]*int)
for key, val := range slice {
m[key] = &val
}
fmt.Println(m)
for k, v := range m {
fmt.Println(k, "-v", *v)
}
// 结果:
// 0 -v 13
// 1 -v 13
// 2 -v 13
// 3 -v 13 // 四行打印顺序不固定,因为map本身是无序的
- 切片的反转
s := []int{1,2,3,5,4}
s := []int{1,2,3,5,4}
s_reverse := make([]int,0,cap(s))
for i := 0; i < len(s); i++ {
s_reverse = append(s_reverse, s[len(s)-i-1])
}
fmt.Println(s_reverse,reflect.TypeOf(s_reverse)) // [4 5 3 2 1] []int
- 基于切片和map数据类型实现一个客户信息管理系统
- 模拟实现基于文本界面的《客户关系管理软件》
- 该软件能够实现客户对象(map存储)向容器对象(切片)的插入,修改和删除,并且能够打印客户信息明细表
- 项目的界面设计:参考以下图片