2014-07-18 3 views
3

Int 값을 조각에 삽입하려고합니다.누락 된 값 삽입이 작동하지 않습니다. GoLang

내 코드 :

package main 

import (
    "fmt" 
) 

func AppendIfMissing(slice []int, i int) []int { 
    for _, ele := range slice { 
     if ele == i { 
      fmt.Println(i) 
      return slice 
     } 
    } 
    fmt.Println("i value is ", i) 
    slice = append(slice, i) 
    return slice 
} 

func main() { 
    slice1 := []int{1, 2, 3, 4} 
    AppendIfMissing(slice1, 60) 
    fmt.Println("slice after adding :", slice1) 
} 

출력 :

i value is 60 
    slice after adding : [1 2 3 4] 

내 코드 문제 happening.What되어 있지 않으며 슬라이스 덧붙이?

답변

8

AppendIfMissing은 변수에 영향을 줄 필요가있는 슬라이스를 반환합니다.

  • 변수에 영향을받을 필요가있는 단부
  • 에 반환된다
    append(slice, i) 그것이 모든 새로운 슬라이스를 지칭 파라미터 슬라이스가 변경되지 않음을 의미 새로운 슬라이스를 생성

    slice1 = AppendIfMissing(slice1, 60) 
    

go playground example를 참조하십시오.


나는 문서는 "Arrays, slices (and strings): The mechanics of 'append'"는 슬라이스 헤더 값으로 전달 되더라도

는, 헤더 어레이의 엘리먼트를 가리키는 포인터를 포함 언급 동의 때문에 원래 슬라이스 헤더 모두 및 함수에 전달 된 헤더의 복사본은 동일한 배열을 나타냅니다.
따라서 함수가 반환되면 원래 슬라이스 변수를 통해 수정 된 요소를 볼 수 있습니다.

그러나 문서의 기능이 append를 사용하지 않은 :

func AddOneToEachElement(slice []byte) { 
    for i := range slice { 
     slice[i]++ 
    } 
} 

내용 슬라이스 인수의는 함수에 의해 수정,하지만 헤더 수 없습니다

할 수있다
slice = append(slice, i) 

헤더를 수정하면 완전히 다른 배열에 결과 슬라이스를 다시 할당합니다.
함수 밖에서는 보이지 않습니다.

+0

새로운 통찰력을 주셔서 감사합니다 !! –

관련 문제