나는 왜 우리가 new
Go에 있는지에 대해 여전히 의아해 합니다.
구조체를 인스턴스화하고 싶을 때
t := Thing{}
그리고 당신은 새로운 인스턴스에 대한 포인터를 얻을 수 있습니다
t := &Thing{}
그러나이 가능성도 있습니다.
t := new(Thing)
이 마지막 언어는 나머지 언어에 약간 외계인처럼 보입니다. &Thing{}
명확하고 간결하며 new(Thing)
다른 곳에서 자주 사용하는 구문 만 사용합니다. &Thing{3}
또는로 변경할 수 있으므로 확장 성이 뛰어납니다 &Thing{Feets:7}
.
내 생각에, 보충 키워드 1을 갖는 것은 비용이 많이 들고, 언어를 더 복잡하게 만들고 알아야 할 것을 추가합니다. 그리고 그것은 구조화 인스턴스화의 배후에있는 새로운 이민자에게 가면을 감출 수 있습니다.
또한 예약어를 하나 더 만듭니다.
뒤에 추론은 new
무엇입니까? 때때로 유용합니까? 우리는 그것을 사용해야합니까?
1 : 예, 문법 수준의 키워드가 아니라는 것을 알고 있습니다. 섀도 잉 할 수는 있지만 합리적인 개발자에게는 예약어라는 사실이 바뀌지 않습니다.
답변
물어 보는 가장 좋은 방법은 아마 그 일을하는 사람들에게하는 것입니다. 정확히 내가 한 일 !
Tl; dr : 원래 make
와 이전에 있었으며 &{}
일부 상황에서 여전히 사용할 수있는 기능입니다.
기본적으로 가장 중요한 부분은 다음과 같습니다.
새로운 이유는 무엇입니까? 유용한가요? 우리는 그것을 사용해야합니까?
새 없이는 할 수 없습니다
v := new(int)
*v++
fmt.Println(*v)
새로운 기능은 Go의 헤드 라인 기능이 아니며 자주 사용되지는 않지만 필요할 때 사용할 수 있습니다.
건배
데이브
이런 종류의 해결책을 보여주는 또 다른 대답 후에 :
vv := 0
v := &vv
*v++
fmt.Println(*v)
추가 설명을 요청했습니다.
기본적으로 Dave의 요점은 실제로 서 있지 않습니까?
주소를 취하기 위해 새로운 변수를 몰래 불편한 곳이 있습니다.
new (T)는 다단계 관용구가 아니라 즉각적인 의미를 갖습니다.
Dave의 요점은 단순한 기술적 가능성 (없이도 수행
new
)이 자체적으로 강렬한 경우에만 떨어집니다
.거의 모든 언어가 가지고 있기 때문에 Go가 가지고 있어야한다는 것이 명백했기 때문에 이것이 논의되지 않았습니까?
“우리가 지켜야
new
할까?” 때때로 토론이 나타납니다. Go 2까지는 꺼낼 수 없기 때문에 Promise를 올바르게 이해하면 루프를 다시 돌아 다니지 않아도 될 것 같습니다. Go 2가 생각할 수있을 때까지 우리는 다른 더 나은 아이디어를 가질 수 있습니다 …크리스
또한 역사적 이유로 주로 있습니다.
프로젝트의 역사를 고려해야합니다. 나는 make가 있기 전에 new가 먼저 소개 된 것 같아요.
사실입니다. 사실 우리는 make라는 아이디어를 내놓기 전에 한동안 고투했습니다. 리포지토리 로그를 보면 2009 년 1 월 개정 9a924177598f에만 표시되는 것을 볼 수 있습니다.
새로운 내장 함수는 또한 복합 리터럴의 주소를 취하기위한 & {}의 아이디어보다 우선합니다 (구문은 어떤 의미에서는 잘못된 것입니다. 아마도 T의 필드 * 일 것입니다) 변경 이유).
새로운 기능은 꼭 필요한 것은 아니지만 코드가 실제로 사용하는 것 같습니다. 이 시점에서 제거하기가 어렵습니다.
이안