Go에“새로운”이유가있는 이유는 무엇입니까?


49

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

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

t := Thing{}

그리고 당신은 새로운 인스턴스에 대한 포인터를 얻을 수 있습니다

t := &Thing{}

그러나이 가능성도 있습니다.

t := new(Thing)

이 마지막 언어는 나머지 언어에 약간 외계인처럼 보입니다. &Thing{}명확하고 간결하며 new(Thing)다른 곳에서 자주 사용하는 구문 만 사용합니다. &Thing{3}또는로 변경할 수 있으므로 확장 성이 뛰어납니다 &Thing{Feets:7}.

내 생각에, 보충 키워드 1을 갖는 것은 비용이 많이 들고, 언어를 더 복잡하게 만들고 알아야 할 것을 추가합니다. 그리고 그것은 구조화 인스턴스화의 배후에있는 새로운 이민자에게 가면을 감출 수 있습니다.

또한 예약어를 하나 더 만듭니다.

뒤에 추론은 new무엇입니까? 때때로 유용합니까? 우리는 그것을 사용해야합니까?


1 : 예, 문법 수준의 키워드가 아니라는 것을 알고 있습니다. 섀도 잉 할 수는 있지만 합리적인 개발자에게는 예약어라는 사실이 바뀌지 않습니다.


3
"... 코더를 가기 위해 ..."-이것이 바로 그 이유입니다. F # / Haskell / 등 C 개발자들에게 매우 외계인이므로 ~ 0의 견인력을 얻습니다. 스칼라는 노력을 기울였으며 이제는 더 접근하기 쉽고 들었습니다.
Den

12
같은 개념으로 파이썬과 루비는 익숙하지 않은 키워드, "이상한"구문 규칙 (중괄호는 어디에 있습니까?)과 이상한 의미 개념 (제너레이터? 메타 클래스? 데코레이터?)을 사용하기 때문에 C 개발자에게는 매우 외계인입니다. 그러나 그들은 ~ 0 견인력을 얻지 못합니다.
시온

8
@Xion : Ruby의 초기 성장률을 보았습니까? 현재 위치에 도달하는 데 오랜 시간 이 걸렸습니다 (18 년, 정확함). 파이썬은 더 오래되었습니다 (1991!).
Joachim Sauer 2018 년

2
@AndresF. 스칼라에 대한 저항 중 일부는 언어와 관련이 없습니다. 나이가 어린 프로그래머 (25 세)라는 이름 자체는 Matlab (나쁜 기억이있는)과 같은 수학 기반 언어와 포트란 (Fortran)과 같은 오래된 언어 사이의 교차점을 생각하게합니다. 그것을 보려는 충동은 없었습니다.
이즈 카타

4
참고 : new 는 Go의 키워드가 아닙니다. 내장 기능입니다.
Manish Malik

답변:


44

물어 보는 가장 좋은 방법은 아마 그 일을하는 사람들에게하는 것입니다. 정확히 내가 한 일 !

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

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

이안


나는 다른 "우리가 새로운 것을 유지해야 할까?" 때때로 나타나는 토론 .
Denys Séguret

v := &(0)temp 변수 를 수행 하고 건너 뛸 수 없도록하는 것이 있습니까? (나는 더 이동을 알 수 없습니다.)
알렉스 Feinman

3
@AlexFeinman 0리터럴 상수이므로 주소를 사용할 수 없습니다. 특정 유형을 원할 경우 문제가 발생합니다. 그렇기 때문에 구문 이 유용 &int하거나 &int(0)유용 할 수 있습니다 (최상의 구문에 대해서는 많이 생각하지 않았습니다). 그러나 Collins가 보여준 것처럼 두 줄로하는 것도 괜찮습니다 ( vv := 0; v := &vv).
Denys Séguret

14
"우리는 Go 2까지 그것을 꺼낼 수 없기 때문에 Go 2."
메이슨 휠러

2
@MasonWheeler 당신은 거의 나를 죽였다 ... 여전히 "유해한 것으로 간주 2 이동"에 웃고 ... 오늘 점심에 그 기사에 대해 이야기하고 이상하게.
Daniela Petruzalek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.