고 언어를 사용할 때range에 주의해야 한다

3601 단어 golangtech

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를 사용할 때도 이런 느낌!!내 생각엔
프로그램의 기본 문법은 변하지 않았다...
그게 다야.

좋은 웹페이지 즐겨찾기