인수로 배열 압축 풀기


106

따라서 Python과 Ruby에는 배열을 인수로 풀기위한 표시 연산자 (*)가 있습니다. Javascript에는 .apply () 함수가 있습니다. Go에서 함수 인수로 배열 / 슬라이스를 풀 수있는 방법이 있습니까? 이것에 대한 모든 리소스도 훌륭합니다!

이것의 라인을 따라 뭔가 :

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    sum := my_func(arr)
}

구문 상 / 다양한 실수를 저질렀다면 사과드립니다. Go를 처음 사용합니다.


4
우선 arr, 배열이 아닙니다. 그것은이다 슬라이스 .
newacct 2013

답변:


164

C와 유사한 vararg 구문을 사용할 수 있습니다.

package main
import "fmt"

func my_func( args ...int) int {
   sum := 0
   for _,v := range args {
      sum = sum + v
   }

   return sum;
}

func main() {
    arr := []int{2,4}
    sum := my_func(arr...)
    fmt.Println("Sum is ", sum)
}

이제 원하는만큼 많은 것을 합산 할 수 있습니다. 함수 ...를 호출 할 때 중요한 점 을 주목하십시오 my_func.

실행 예 : http://ideone.com/8htWfx


9

함수는 ...Hunter McMillen이 보여준 것처럼 표기법과 함께 슬라이스를 사용할 수있는 varargs 이거나 함수에 고정 된 수의 인수가 있고 코드를 작성할 때 압축을 풀 수 있습니다.

고정 된 수의 인수 함수에 대해이 작업을 동적으로 수행하려면 리플렉션을 사용할 수 있습니다.

package main
import "fmt"
import "reflect"

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    var args []reflect.Value
    for _, x := range arr {
        args = append(args, reflect.ValueOf(x))
    }
    fun := reflect.ValueOf(my_func)
    result := fun.Call(args)
    sum := result[0].Interface().(int)
    fmt.Println("Sum is ", sum)
}

이 벤치 마크가 varargs 접근 방식에 대해 어떻게 비교되는지 궁금합니다. 성능이 떨어질 것이라고 생각하지만 조사해야합니다.
Hunter McMillen 2013

@HunterMcMillen 성능 비교에 대한 통찰력을 얻었습니까?
AkiRoss

@AkiRoss 아마,하지만 너무 오래 전에 결과를 잊었습니다 : |
Hunter McMillen 2015 년

lol ok, 큰 문제는 아닙니다. 어쨌든 속도가 느리다고 생각합니다. 직접 테스트를 실행할 수도 있습니다. Thanx
AkiRoss 2015 년

0

https://play.golang.org/p/2nN6kjHXIsd

나는지도 [문자열] 문자열에서 일부 변수를 작은 따옴표로 묶어서 풀어야하는 이유가 있었다. 여기에 대한 논리가 있으며 상단의 재생 링크에는 전체 작동 스 니펫이 있습니다.

func unpack(a map[string]string) string {

var stmt, val string
var x, y []string
for k, v := range a {
    x = append(x, k)
    y = append(y, "'"+v+"'")
}

stmt = "INSERT INTO tdo.rca_trans_status (" + strings.Join(x, ", ")
val = ") VALUES (" + strings.Join(y, ",") + ");"

return stmt + val}

mssql 쿼리에 대해 다음과 같이 명확하게 표시됩니다.

INSERT INTO tdo.rca_trans_status (rca_json_body, original_org, md5sum, updated, rca_key) VALUES ('blob','EG','2343453463','2009-11-10 23:00:00','prb-180');

-17

아니요, 이에 대한 직접적인 지원은 없습니다. Python과 Ruby, 그리고 당신이 언급 한 자바 스크립트; 모두 동적 / 스크립팅 언어입니다. 예를 들어 Go는 동적 언어보다 C에 훨씬 더 가깝습니다. '적용'기능은 동적 언어에는 편리하지만 C 또는 Go와 같은 정적 언어에는 거의 사용되지 않습니다.


@ user7610 당신이 틀 렸습니다. 귀하는 문제의 경우와 다른 사례를 다루고 있습니다. 원래 질문에는 함수 선언에 가변 매개 변수가 없습니다.
user2846569 jul.

네, 그런 것 같아요. 파이썬 / 루비가 반사 통화에 대해 문법적으로 간주 할 수 있습니다 무엇을하는지 그 이동 지원 ...
user7610
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.