2017-05-02 3 views
2

나는 주요 기능에 여러 값을 반환하는 방법을 학습을위한 내 자신의 코드를 만들려고 :두 가지 변형의 차이점은 무엇입니까?

package main 

import "fmt" 

func main() { 
    fmt.Println("Enter a integer:") 
    var I int 
    fmt.Scanf("%d", &I) 
    fmt.Println("Accepted:", I) 

    O := half(I) 
    fmt.Println("Returned:", O) 
} 

func half(N int) (int, bool) { 
    var NA int 
    NA = N/2 
    if NA%2 == 0 { 
     fmt.Println("even") 
     return NA, true 
    } else { 
     fmt.Println("odd") 
     return NA, false 
    } 
} 

그리고 주어진 오류 : half.go|11| multiple-value half() in single-value context합니다. 그러나 또 다른 변형 작업 : 내가 잘못 뭐하는 거지

package main 

import (
    "fmt" 
) 

func half(number int) (int, bool) { 
    if x := int(number % 2); x == 0 { 
     return x, true 
    } else { 
     return x, false 
    } 
} 

func main() { 
    fmt.Println(half(1)) 
    fmt.Println(half(2)) 
} 

? 내 실수를 극복하는 방법?

답변

1

fmt.Println은 많은 인수를 허용하므로 half의 결과를 수락하는 것이 좋습니다.

첫 번째 경우 두 변수에 대한 위치를 제공해야합니다. 다음 중 하나를

i,b := half(2)

또는

i, _ := half(2)

당신은 두 번째 복귀가 필요하지 않은 경우.

3

함수에 2 개의 반환 값이있는 경우 두 값 모두 "필요"하거나 전혀 반환하지 않아야합니다. 이에 대한 자세한 : Return map like 'ok' in Golang on normal functions

귀하의 half() 기능이 개 반환 값을 가지고 있으므로 변수에 반환 된 값을 저장하는 short variable declaration를 사용하는 경우, 당신은이 개 변수를 제공해야합니다 : 두 번째 경우

O, even := half(I) 
fmt.Println("Returned:", O, even) 

을, 당신 당신이 어떤 납입을 통과 할 수 있도록

func Println(a ...interface{}) (n int, err error) 

fmt.Println()은, 가변 인자 매개 변수가 있습니다 : 반환 값을 저장하지 "다시, 당신은 서명이있는 fmt.Println()로 전달된다 그것에 대한 논쟁의 여지가있다. 여기서 일어나는 일은 half()의 다중 반환 값이 모두 variadic 매개 변수의 값인 Println()으로 전달된다는 것입니다.

fmt.Println("Returned:", half(10)) 
// Error: multiple-value half() in single-value context 
: 이것은 그렇게 할 때 예를 들어, 다음도 컴파일 타임 오류 그래서, 당신은 합격/추가 매개 변수를 제공 할 수 없습니다 것을 Spec: Calls:

As a special case, if the return values of a function or method g are equal in number and individually assignable to the parameters of another function or method f , then the call f(g(parameters_of_g)) will invoke f after binding the return values of g to the parameters of f in order. The call of f must contain no parameters other than the call of g , and g must have at least one return value. If f has a final ... parameter, it is assigned the return values of g that remain after assignment of regular parameters.

주에서 허용하고 상세한됩니다 이러한 유사한 질문에 밖으로

확인 :

Go: multiple value in single-value context

Avoid nesting from conjunction with function that returns 2 values in go?