2017-12-16 8 views
1
package main 

import "fmt" 

type Circle struct { 
    x string 
} 

func main() { 
    circle := Circle{x: "blah"} 
    results := make([]*Circle, 1) 
    results = append(results, &circle) 
    fmt.Printf("Here: %s\n", results[0].x) 
} 

results = append(results, &circle)에서 results[0] = &circle으로 변경하면 문제가 없습니다. 그 이유에 대해서는 어떤 이유도 찾을 수 없었습니다.배열에 포인터를 추가 할 수없는 이유는 무엇입니까?

답변

6

당신이 할 수있는, 당신 있습니다이 추가 요소가 results[1]에 있음을 의미 슬라이스로 추가하는 것이 단지, 그리고 results[0]nil 포인터 (포인터에 대한 기본 값)입니다. 당신은 results := make([]*Circle, 0, 1)을 할 수

은 1의 용량하지만 0의 길이를 제공하기 위해, 또는 당신은 results := []*Circle{} (가장 컴팩트를) 할 수있는, 또는 당신이 results[0]에 할당 곳이 잘 작동하기 때문에 당신은 단순히 버전을 유지할 수 있습니다.

2

당신은 할 수 있지만, 길이 1 make를 사용하므로 [0] 인덱스가 이미 설정되어 (A 전무 서클에 ...)

당신의 results[0].xresults[1].x에 작품을 변경하지만 make 작품을 사용하지 않고 예상대로 : 놀이터에서

package main 

import "fmt" 

type Circle struct { 
    x string 
} 

func main() { 
    circle := Circle{x: "blah"} 
    results := []*Circle{} // initialize empty slice of Circle pointers 
    results = append(results, &circle) 
    fmt.Printf("Here: %s\n", results[0].x) 
} 

실행 : https://play.golang.org/p/7vMOfAXvgI