ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [go] " ... " 에 대해
    Backend/GO 2019. 12. 13. 14:48

    Discord github을 보다가 golang에서 제공하는 net/http 라이브러리를 튜닝하여 fasthttp를 만들어서 사용한다는 것을 봤다. 

     

    어떻게 fasthttp를 만들었으며, 어떤 특징이 있나 보던 중 

     

    Tricks with []byte buffers

     

    discordapp/fasthttp

    Fast HTTP package for Go. Tuned for high performance. Zero memory allocations in hot paths. Up to 10x faster than net/http - discordapp/fasthttp

    github.com

    이 부분에서 dst = append(src, "foobar"...) 인 부분을 보고 ...에 대해 자세히 조사가 하고 싶어져 이 글을 작성합니다.


     

     

    > 배열 선언시에 사용하는 "..."

    days := [...]string{"Sat", "Sun"} // len(days) == 2

    위 처럼 배열 선언시에 [ ] 사이에 특정 크기를 지정해주는 대신 "..." 을 사용하게 되면 이 배열의 최대 인덱스 값 + 1로 크기가 정해진다.

     


     

     

    > 파라미터에서 사용하는 "..."

     

    func Greeting(prefix string, who ...string) { }
    
    Greeting("Test")
    Greeting("Test", "blanc")
    Greeting("Test", "blanc", "cobb")

    위 예제에서 2번째 파라미터인 who ...string에서 ...을 사용하고 있다. 어떤 의미일까?

    우선 2번째 줄인 Greeting("Test")를보면 분명 파라미터엔 2개를 입력받아야 한다고 명시되어있는데, 1개만 받았다. 

    에러없이 잘 동작한다.

    3번째 줄은 명시된대로 2개를 받았다. 4번째 줄은 명시된 2개보다 1개를 더 받았다. 

     

    위 코드는 정상적으로 동작합니다. 

    "..."은 arguments로 0개 이상 올 수 있음을 뜻합니다. 그래서 Greeting에서 who 변수에 접근을 하면 slice로 받아 확인을 할 수가 있다.

    출력 화면

    또한, 2번째 파라미터로 slice자체가 올 수 있는데 이는 아래처럼 사용할 수 있다.

    str := []string{"blanc", "cobb"}
    
    Greeting("Test", str...)
    Greeting("Test", str) // Error

    첫 번째로 사용했던 예제 Greeting("Test", "blanc", "cobb")는 "blanc" 과 "cobb"를 새로운 slice로 만들어서 사용하고,

    위 예제로 슬라이스 자체를 파라미터로 넣게되면 str slice를 그대로 사용하게 된다.

     

    슬라이스를 (변수 ...타입) 형식의 파라미터로 넣을 때는 슬라이스를 그대로 넣으면 (위 예제처럼) Error가 나게 된다. 

     

     


    다음으로 보실 예는 slice에 값을 붙여넣을 수 있는 append 함수입니다.

    append(s S, ...T) S // T는 S의 element type이다.

    append함수는 시그니처가 위 처럼 나와있습니다.

    (매개변수에 "..."이 붙는 매개변수를 variadic 이라고 부르며 0개 이상의 파라미터를 받을 수 있다)

    2번째 파라미터에 "..."이 사용되고 있는데 제가 설명드린것 처럼 0개이상의 파라미터를 받을 수 있습니다. 

     

    여기서 특히점이 하나 있습니다. 

     

    var (
        dst []byte
        src []byte
    )
    
    dst = append(dst, "String") // Error
    dst = append(dst, "String"...)
    

     

    byte slice임에도 불구하고 string타입 변수에 "..."을 붙여주면 slice로 바뀌고 append된다는 점입니다.

    찾아보니 특별한 경우로 byte slice에 String을 붙일 수 가 있는데 "..."을 string변수 뒤에 추가하면 된다고 설명이 되어 있었습니다. 

    'Backend > GO' 카테고리의 다른 글

    [go] practice : web crawl  (0) 2016.08.10
    [go] slice 연습문제  (0) 2016.07.20
    [go] go-tour중 import문제  (0) 2016.07.20
Designed by Tistory.