code: func (f *file) lintFuncDoc(fn *ast.FuncDecl) {
  	if !ast.IsExported(fn.Name.Name) {
  		// func is unexported
  		return
  	}
  	kind := "function"
  	name := fn.Name.Name
  	if fn.Recv != nil && len(fn.Recv.List) > 0 {
  		// method
  		kind = "method"
  		recv := receiverType(fn)
  		if !ast.IsExported(recv) {
  			// receiver is unexported
  			return
  		}
  		if commonMethods[name] {
  			return
  		}
  		switch name {
  		case "Len", "Less", "Swap":
  			if f.pkg.sortable[recv] {
  				return
  			}
  		}
  		name = recv + "." + name
  	}
  	if fn.Doc == nil {
  		f.errorf(fn, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment or be unexported", kind, name)
  		return
  	}
  	s := fn.Doc.Text()
  	prefix := fn.Name.Name + " "
  	if !strings.HasPrefix(s, prefix) {
  		f.errorf(fn.Doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix)
  	}
  }
docs: // lintFuncDoc examines doc comments on functions and methods.
  // It complains if they are missing, or not of the right form.
  // It has specific exclusions for well-known methods (see commonMethods above).