2017-12-31 33 views
0

현재 golang (대부분 Java/C# 개발자)을 배우고 있으며 포인터와 지연 문제가 발생했습니다.구조체에서 Golang 포인터가 보존되는 방법에 대한 혼동

OO와 같은 스타일의 구조체 아래에서 CSV 파일에 쓰기를 래핑하려고합니다.

type MyObject struct { 
    fp *os.File 
    csv *csv.Writer 
} 

func (mo MyObject) Open(filepath string) { 

    println(&mo) 
    var err error 
    mo.fp, err = os.Create(filepath) 
    if err != nil { 
     panic(err) 
    } 

    mo.csv = csv.NewWriter(mo.fp) 
} 

한번 내가 Open 메서드를 방치 충돌 문제는, FP 및 CSV에 대한 포인터가 다시 갔다 : 나는 온라인으로 발견 된 예에서, 구조체의 "방법"을 작성하는 것은과 같이 할 수 있다는 것 null로. 이후에이 클래스를 호출하면 오류가 발생합니다. 전체 예제는 here입니다.

많은 검색 결과를 통해 골란이 어떻게 구현되었는지 살펴 보았습니다. logger. 그들은과 같이 객체에 대한 포인터를 사용 :

type MyObject struct { 
    fp *os.File 
    csv *csv.Writer 
} 

func New() *MyObject { 
    return &MyObject{} 
} 

func (mo *MyObject) Open(filepath string) { 

    println(&mo) 
    var err error 
    mo.fp, err = os.Create(filepath) 
    if err != nil { 
     panic(err) 
    } 

    mo.csv = csv.NewWriter(mo.fp) 
} 

내 코드의 리팩토링 예상대로 작동 표시 (here 참조). 왜 첫 번째 방법이 효과가 없었는지 나는 아직도 혼란 스럽다. 나는 구조체, 포인터 및/또는 작업 연기 방법에 대해 오해하고 있다고 생각합니다. 내가 뭘 놓치고 있니?

+2

https://golang.org/doc/faq#methods_on_values_or_pointers에게 –

답변

3

func (mo MyObject) Open(filepath string)에만 로컬 복사본 MyObject이 포함되어 있기 때문에 첫 번째 경우에는 작동하지 않았습니다. 모든 변경 사항은 해당 컨텍스트 내에서 유지됩니다.

하지만 수신기에 *을 추가하면 (예 : (mo *MyObject)) 함수 내의 변경 사항이 원본 MyObject에 영향을줍니다.

you can check here for more info

희망이 더 많은 의미가 그 질문에 나를 가리키는 위해

+1

감사를하는 데 도움이! – Bryan

+0

willkommen..glad 도움을! –

관련 문제