golang里的数据结构 | 青训营笔记

304 阅读3分钟

在Go语言中,有类似于Java中的Set、List和Map的数据结构,尽管它们的实现和用法可能会有所不同。

  1. Set(集合):

    • 在Java中,Set是一个不允许重复元素的无序集合。常用的实现类包括HashSet和TreeSet。

    • 在Go语言中,没有直接对应Java的Set接口或类似的实现。但是,可以使用一个空结构体的映射(map)来实现类似的功能。由于映射的键是唯一的,可以将一个类型为空结构体的映射视为一个Set。

      set := make(map[T]struct{})
      

      这里的T是元素类型,struct{}是空结构体类型。通过将元素作为映射的键,可以实现类似Set的功能。可以使用映射的存在性来检查元素是否存在于"Set"中。

  2. List(列表):

    • 在Java中,List是一个有序的动态数组,允许元素重复。常用的实现类包括ArrayList和LinkedList。

    • 在Go语言中,可以使用切片(slice)来实现类似的功能。切片是一个动态大小的序列,可以根据需要动态增长或缩小。

      var list []T
      

      这里的T是元素类型。通过对切片进行操作,如添加、删除、索引等,可以实现类似List的功能。

  3. Map(映射):

    • 在Java中,Map是一个键值对的集合,允许通过键来访问值。常用的实现类包括HashMap和TreeMap。

    • 在Go语言中,可以使用内建的映射(map)类型来实现类似的功能。映射是一种哈希表,用于存储键值对。

      var m map[K]V
      

      这里的K是键的类型,V是值的类型。通过映射,可以通过键快速查找对应的值。

    • 也可以通过字面量语法进行初始化。

    •   m := map[K]V{
            key1: value1,
            key2: value2,
            key3: value3,
        }    
      
    • 也可以通过make函数来初始化

    •   m := make(map[K]V)
      

需要注意的是,尽管Go语言中没有与Java中的Set和List完全对应的类型,但切片和映射提供了类似的功能,可以满足大多数相同的需求。根据具体的使用场景和需求,选择合适的数据结构来替代Java中的Set、List和Map。

除了Set、List和Map之外,在Go语言中还有其他一些常见的数据结构,如下所示:

  1. 数组(Array):数组是一组具有固定长度的相同类型元素的集合。在Go语言中,数组的长度是固定的,并且在声明时需要指定长度。

    var arr [5]int  // 声明一个包含5个整数的数组
    
  2. 栈(Stack):栈是一种具有后进先出(LIFO)特性的数据结构,只允许在栈顶进行插入和删除操作。在Go语言中,可以使用切片来实现栈的功能。

    var stack []T   // 声明一个切片作为栈
    stack = append(stack, element)  // 入栈
    element = stack[len(stack)-1]   // 获取栈顶元素
    stack = stack[:len(stack)-1]    // 出栈
    
  3. 队列(Queue):队列是一种具有先进先出(FIFO)特性的数据结构,允许在队尾进行插入操作,而在队头进行删除操作。在Go语言中,可以使用切片或使用container/list包来实现队列。

    var queue []T   // 声明一个切片作为队列
    queue = append(queue, element)  // 入队
    element = queue[0]               // 获取队首元素
    queue = queue[1:]                // 出队