跳到主要内容

第十六课

PR #130

Move labels and tests to new package 这个pr 有12个commit 我们来一个个看

PR #142

When the apiserver panics, log a stacktrace. 我遇到了一个问题,在那里 apiserver 是panic... 但发现很难调试没有backtrace。这是panic时的回溯记录

PR #138 *

Normalize etcd_registry's storage & error handling

我们来讲讲 extractList函数 : 这个方法接受一个字符串类型的key参数和一个空接口类型的slicePtr参数。它的主要功能是从Etcd中读取key对应的值列表,反序列化为Go结构体,并将结果追加到slicePtr所指向的切片中。

  1. 首先,它调用了r.listEtcdNode(key)方法来获取Etcd中的节点列表。如果发生错误,直接返回错误。
  2. 然后,使用reflect.ValueOf获取slicePtr的反射值,并检查其类型是否为指针类型,同时检查其元素类型是否为切片类型。如果不满足条件,则触发运行时错误。
  3. 使用pv.Elem()获取切片的反射值。
  4. 遍历从Etcd获取的节点列表。对于每个节点:
    • a. 使用reflect.New创建一个新的切片元素实例。
    • b. 使用json.Unmarshal将节点值反序列化为新创建的实例。
    • c. 如果发生错误,直接返回错误。
    • d. 将新实例追加到切片中。
  5. 完成遍历后返回nil。
提示

作业:编写一个函数,将一个任意类型的切片转换为[]interface{}类型的切片。函数原型如下:

func convertToInterfaceSlice(slice interface{}) ([]interface{}, error)

函数接受一个interface{}类型的参数slice,这个参数实际上是一个任意类型的切片。返回值是一个[]interface{}类型的切片和一个错误(如果发生错误)。在实现这个函数时,您需要使用反射来完成以下任务:

  1. 检查输入参数的类型是否为切片。
  2. 创建一个新的[]interface{}类型的切片,长度和输入切片相同。
  3. 遍历输入切片,将每个元素添加到新的[]interface{}类型的切片中。
  4. 返回新的[]interface{}类型的切片。 请注意,在这个练习中,您需要使用Golang的reflect包来处理任意类型的切片