2016-11-26 3 views
0

golang을 처음 사용하여 julienschmidt/httprouter를 사용하여 웹 프로젝트를 만들려고합니다. 좋은 형식의 잘 짜여진 프로젝트를 만들기 위해 검색 중이므로 퍼포먼스에 대한 두 가지 질문이 있습니다. 내가 만든 그래서 내 경우
나는 요청에서 개체를 반환하는 함수를 만들려면 :Golang - 변수 전달 및 모범 사례

// StoreController 
func (storeController *StoreController) New(w http.ResponseWriter, r *http.Request) { 
    store, err := utilities.GetStoreFromRequest(r) 
    // other stuff 
    return 
} 

// Utilities package 
func GetStoreFromRequest(r *http.Request) (*models.Store, error) { 
    store := models.Store{} 
    err := json.NewDecoder(r.Body).Decode(&store) 
    // return a pointer is better than returning an object? 
    return &store, err 
} 

은 마우스 오른쪽 아니면 storeController에 저장 객체를 만들고에 전달하는 것이 좋습니다 같은 기능 : 다른 질문은 포인터에 관한

// StoreController 
func (storeController *StoreController) New(w http.ResponseWriter, r *http.Request) { 
    store := models.Store{} 
    err := utilities.GetStoreFromRequest(r, &store) 
    // other stuff 
    return 
} 

// Utilities package 
func GetStoreFromRequest(r *http.Request, store *models.Store) error { 
    err := json.NewDecoder(r.Body).Decode(store) 
    return err 
} 

은 항상 대신 객체 및 오류 여부의 포인터 전달하고 반환 너무 편집증? 감사합니다.

+0

가능한 반환 주소를 생성해야하는 이유는 무엇입니까? (http://stackoverflow.com/questions/31932822/why-should-constructor-of-go-return-address/31934189#31934189); 및 [포인터와 매개 변수의 값 및 반환 값] (http://stackoverflow.com/questions/23542989/pointers-vs-values-in-parameters-and-return-values)을 참조하십시오. – icza

답변

1

무의미한 매개 변수를 제거하는 것이 보통 중복되고 더 좋습니다. 사실 매개 변수로 사용하면 실제로는 nil 값으로 초기화됩니다. 다음은이 작업을 수행하는 모든 유효한 방법은 다음과 같습니다

func GetStoreFromRequest(r *http.Request) (store *models.Store, err error) { 
    err = json.NewDecoder(r.Body).Decode(store) 
    return 
} 

func GetStoreFromRequest(r *http.Request, store *models.Store) error { 
    err := json.NewDecoder(r.Body).Decode(store) 
    return err 
} 

func GetStoreFromRequest(r *http.Request) (*models.Store, error) { 
    var store models.Store // or store := models.Store{} 
    err = json.NewDecoder(r.Body).Decode(&store) 
    return &store, err 
} 

그것은 일반적으로 지역의 지역 변수를 유지하는 가장 좋은 방법입니다 - 내가 for 루프에서 사용하는 매개 변수를 전달 상상한다. 별로 말이 안되지, 그렇지? 따라서이 상황에서는 옵션 1 또는 3 (본질적으로 동일한 실행)을 권장하고 로컬 변수를 함수 서명 밖으로 남겨 두십시오.

+0

질문을 오해 한 경우 기본적으로 포인터는 기본 데이터를 수정해야 할 때이며 값은 값이 필요할 때입니다. – AniSkywalker