Go에“새로운”이유가있는 이유는 무엇입니까? 가능성도 있습니다. t := new(Thing) 이

나는 왜 우리가 newGo에 있는지에 대해 여전히 의아해 합니다.

구조체를 인스턴스화하고 싶을 때

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의 필드 * 일 것입니다) 변경 이유).

새로운 기능은 꼭 필요한 것은 아니지만 코드가 실제로 사용하는 것 같습니다. 이 시점에서 제거하기가 어렵습니다.

이안


답변