2016-11-15 4 views
0

문자열 목록에서 구조체를 초기화하려고하는데 컴파일러에서 다음 오류가 발생합니다. 나는 아직도 언어를 배우고있어 내 무지를 변명하지만 형식 어설 션을 활용하여 해결할 수 있습니까?문자열 목록에서 구조체 초기화

ERROR: v.UberX undefined (type string has no field method UberX)

type Galaxy struct { 
    UberX  int64 
    UberY  int64 
} 

func main() { 
    galaxies := []string{"andromeda", "milkyway", "maffei"} 
    for _, v := range galaxies { 
     v := &Galaxy{} 
    } 
    for _, v := range galaxies { 
     v.UberX += 1000 
     v.UberY += 750 
    } 
} 

답변

2

심지어 이름과 구조체 값 사이에 연결이되지 않습니다 귀하의 시도로, 이름을 저장하지 않습니다 Galaxy 구조체. 구조체에 이름을 추가

type Galaxy struct { 
    Name string 
    UberX int64 
    UberY int64 
} 

다음, 첫 번째 루프에서 당신은 *Galaxy 값을 만들 수 있지만 당신은 단지 루프 변수 v 그림자 그런데 지역 변수 v에 저장 :

for _, v := range galaxies { 
    v := &Galaxy{} 
} 

당신은 당신이 채울 수있는 Galaxy의 조각 또는 *Galaxy의 조각이 필요합니다

gs := make([]*Galaxy, len(galaxies)) 

다음 1 루프는 은하계의 이름을 반복하기에 충분하고, gs 슬라이스 웁니다

for _, v := range gs { 
    fmt.Printf("%+v\n", v) 
} 

출력합니다 (Go Playground에 그것을 시도) :

&{Name:andromeda UberX:1000 UberY:750} 
&{Name:milkyway UberX:1000 UberY:750} 
&{Name:maffei UberX:1000 UberY:750} 
결과를 확인

for i, v := range galaxies { 
    gs[i] = &Galaxy{ 
     Name: v, 
     UberX: 1000, 
     UberY: 750, 
    } 
} 

기본 사항을 알아 보려면 먼저 Golang Tour을 통과하는 것이 좋습니다.

+0

의심 할 여지없이 나는 많은 독서를해야합니다. 그 동안 그 중 일부를 연습 할 수 있기를 바랬습니다. 내 생각 프로세스는 적절한 이름으로 구조체를 초기화 할 수 있다면 "이름"필드가 불필요하다는 것입니다. 감사 –