You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

io.go 1.3 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package io
  2. import "io"
  3. type PromiseWriteCloser[T any] interface {
  4. io.Writer
  5. Abort(err error) // 中断发送文件
  6. Finish() (T, error) // 发送文件完成,等待返回结果
  7. }
  8. func WriteAll(writer io.Writer, data []byte) error {
  9. pos := 0
  10. dataLen := len(data)
  11. for pos < dataLen {
  12. writeLen, err := writer.Write(data[pos:])
  13. if err != nil {
  14. return err
  15. }
  16. pos += writeLen
  17. }
  18. return nil
  19. }
  20. type readCloserHook struct {
  21. readCloser io.ReadCloser
  22. callback func(closer io.ReadCloser)
  23. isBefore bool // callback调用时机,true则在closer的Close之前调用
  24. }
  25. func (hook *readCloserHook) Read(buf []byte) (n int, err error) {
  26. return hook.readCloser.Read(buf)
  27. }
  28. func (hook *readCloserHook) Close() error {
  29. if hook.isBefore {
  30. hook.callback(hook.readCloser)
  31. }
  32. err := hook.readCloser.Close()
  33. if !hook.isBefore {
  34. hook.callback(hook.readCloser)
  35. }
  36. return err
  37. }
  38. func BeforeReadClosing(closer io.ReadCloser, callback func(closer io.ReadCloser)) io.ReadCloser {
  39. return &readCloserHook{
  40. readCloser: closer,
  41. callback: callback,
  42. isBefore: true,
  43. }
  44. }
  45. func AfterReadClosed(closer io.ReadCloser, callback func(closer io.ReadCloser)) io.ReadCloser {
  46. return &readCloserHook{
  47. readCloser: closer,
  48. callback: callback,
  49. isBefore: false,
  50. }
  51. }

公共库

Contributors (1)