Golang练习题Day03

121 阅读3分钟

考核知识点: 1.指针类型 2.数组与切片 3.Map类型

  1. 代码执行结果
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.

  1. 代码执行结果
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]了

  1. 代码执行结果
p1 := 1
p2 := &p1
*p2++
fmt.Println(p1)  // 2
fmt.Println(p2)  // 变量p1的内存地址

解析:

&p1就是对变量p1的取址操作,因此p2的值就是变量p1的内存地址,*p2++则是通过地址直接操作变量p1的值使其自增1,因此p1的值为2

  1. 代码执行结果
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了。

  1. 代码执行结果
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]
  1. 代码执行结果
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本身是无序的
  1. 切片的反转 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
  1. 基于切片和map数据类型实现一个客户信息管理系统
  1. 模拟实现基于文本界面的《客户关系管理软件》
  2. 该软件能够实现客户对象(map存储)向容器对象(切片)的插入,修改和删除,并且能够打印客户信息明细表
  3. 项目的界面设计:参考以下图片

image.png

image.png

image.png