Guest User

Untitled

a guest
Oct 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func Append(slice, data []byte) []byte {
  6. l := len(slice)
  7. if l+len(data) > cap(slice) { // 재할당 여부 체크
  8. // 두배의 크기로 할당
  9. newSlice := make([]byte, (l+len(data))*2)
  10. // 내장함수 copy를 사용해 복사
  11. copy(newSlice, slice)
  12. slice = newSlice
  13. }
  14. slice = slice[0 : l+len(data)]
  15. copy(slice[l:], data)
  16. return slice
  17. }
  18.  
  19. // 메소드의 시그니처
  20. // func (r ReceiverType) methodName(p ParamType)
  21. // func (r *ReceiverType) methodName(p ParamType)
  22.  
  23. type ByteSlice []byte
  24.  
  25. // 리시버를 값으로 받는 경우
  26. func (v ByteSlice) AppendV(data []byte) []byte {
  27. v = Append(ByteSlice(v), data)
  28. return v
  29. }
  30.  
  31. // 리시버를 포인터로 받는 경우
  32. func (p *ByteSlice) AppendP(data []byte) {
  33. *p = Append(*p, data)
  34. }
  35.  
  36. // ByteSlice를 좀 더 범용으로 쓸 수 있게 하려면 표준 io.Writer의 인터페이스를 만족시키면 된다.
  37. func (p *ByteSlice) Write(data []byte) (n int, err error) {
  38. *p = Append(*p, data)
  39. return len(data), nil
  40. }
  41.  
  42. func main() {
  43. greeting := []byte("Hello ")
  44.  
  45. // 함수를 사용해 처리
  46. fmt.Println("함수:\t\t\t", string(Append(greeting, []byte("World"))))
  47. // 리시버가 값인 메서드를 사용하는 경우
  48. bGreeting := ByteSlice(greeting)
  49. fmt.Println("리시버가 값인 메서드:\t", string(bGreeting.AppendV([]byte("Value"))))
  50. fmt.Println("bGreeting after:\t", string(bGreeting))
  51. // 리시버가 포인터인 메서드
  52. bGreeting.AppendP([]byte("Pointer"))
  53. fmt.Println("리시버가 포인터인 메서드:\t", string(bGreeting))
  54. fmt.Println("bGreeting after:\t", string(bGreeting))
  55.  
  56. var b ByteSlice
  57. fmt.Fprintf(&b, "Hello, %s", "World")
  58. fmt.Println("[", string(b), "]\n")
  59. }
Add Comment
Please, Sign In to add comment