고 언어를 사용할 때range에 주의해야 한다
TL;DR
결론적으로 range{}의 임시 변수는 임시 변수일 뿐이므로 원래의 배열을 넣지 않도록 주의하십시오.
i, u := range users{
u = User{} //uは値渡しであり、元々のusersには何も入らないのでダメ
users[i] = User{} //iにはusersのインデックスが入っているのでそこに代入する
}
이걸 몰랐어요. 한 시간 넘게 고민했어요. 주의하세요...일어난 일
기본적으로 goo 언어의 편리성 때문에 찰칵 쓴 코드로 한 시간가량 고민하다 보니 기사를 쓰게 됐다.
우선 두 개의 끼워 넣는 구조가 있다
type User struct{
id int
profile Profile
}
type Profile struct{
zenn string
}
그리고 다음 코드를 정의했습니다.
func main() {
users := []User{
User{},
User{},
User{},
}
_, u := range users{
u.profile.zenn = "zenn is awesome!"
}
log.Printf("%#v", users)
}
그럼 어떻게 되는 거야?평소에 고 언어를 쓰는 사람은 "그건 안 되는 거죠!"내 생각에는
모든 users의 user 프로필에는 아무것도 없습니다
나는 이 때문에 한 시간 넘게 고민했다.도무지 움직이지 않는다!!!!!
이 단점은 외관상 정확한 코드로 보인다.뭐가 웃긴지 모르겠다.
뭐가 안 되지?
방금 코드로 임시 변수
u
를 대입하는 것이 문제입니다.u는 값에 맡기기 때문에users{}의 값은 상관없습니다.
자세히 생각해 보면 php의foreach,java의 확장 for 등도 마찬가지다. 기본적인foreach는 그 배열 중의 요소를 하나하나 처리하고 계산하여 대입 목적에서 잘 사용하지 않는다.
말하자면 PHP를 사용할 때도 이런 느낌!!내 생각엔
프로그램의 기본 문법은 변하지 않았다...
그게 다야.
Reference
이 문제에 관하여(고 언어를 사용할 때range에 주의해야 한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/diwamoto/articles/818897af8edb02텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)