how to use go

代码与吐槽

  • 下面的代码实现了支持比较的泛型的链表
    • 头部新增
    • 尾部新增
    • 删除指定元素
    • string格式化打印
  • 不得不说,go语言方法前面的p是接收者不能直接修改外部指针的引用,也就是说令p等于新增元素是不成立的
  • 但是又不想让函数有返回值,于是就改成了传入头指针的地址来实现
type List[T comparable] struct {
 next *List[T]
 val  T
}

func (p *List[T]) String() string {
 result := ""
 for p != nil {
  result += fmt.Sprintf("%v ", p.val)
  p = p.next
 }
 return result
}

func (p *List[T]) addHead(root **List[T], val T) {
 *root = &List[T]{val: val, next: p}
}

func (p *List[T]) push(val T) {
 tp := &List[T]{val: val, next: nil}
 for p.next != nil {
  p = p.next
 }
 p.next = tp
}

func (p *List[T]) delete(val T) {
 // 如果链表为空,直接返回
 if p == nil {
  return
 }
 if p.val == val {
  *p = *p.next
 }
 // 遍历链表,找到要删除的节点
 current := p
 for current.next != nil {
  if current.next.val == val {
   current.next = current.next.next
   return
  }
  current = current.next
 }
}

func NewList[T comparable](val T) *List[T] {
 return &List[T]{val: val}
}

func main() {
 l := NewList(1)
 fmt.Println("Original list:", l.String())
 l.addHead(&l, 2)
 l.addHead(&l, 3)
 l.delete(2)
 l.delete(3)
 l.push(2)
 l.push(3)
 l.push(4)
 fmt.Println("Updated list:", l.String())
}