몇 달 전에 Go를 처음 조사하기 시작했을 때이 질문을했습니다. 그 이후로 매일 Go에 대해 읽고 Go로 코딩하고 있습니다.
이 질문에 대한 명확한 답변을받지 못했기 때문에 (하나의 답변을 수락했지만) 이제 제가 질문 한 이후 배운 내용을 바탕으로 직접 답변하겠습니다.
하드 코딩 된 배열 크기없이 Go에서 배열 / 슬라이스를 만드는 방법이 있습니까?
예. 슬라이스는 하드 코딩 된 배열이 필요하지 않습니다 slice
.
var sl []int = make([]int,len,cap)
이 코드 할당 슬라이스 sl
크기에 len
의 용량 cap
- len
및 cap
런타임시에 할당 될 수있는 변수이다.
왜 list.List
무시됩니까?
list.List
Go에서 거의 주목을받지 못하는 주된 이유 는 다음과 같습니다.
@Nick Craig-Wood의 답변에서 설명했듯이 슬라이스로는 수행 할 수없는 목록으로 할 수있는 일이 거의 없습니다. 예를 들어 범위 구성 :
for i:=range sl {
sl[i]=i
}
목록과 함께 사용할 수 없습니다. C 스타일 for 루프가 필요합니다. 그리고 대부분의 경우 C ++ 컬렉션 스타일 구문은 목록과 함께 사용해야합니다
push_back
.
아마도 더 중요한 list.List
것은 강력한 유형이 아니라는 것입니다. Python의 목록 및 사전과 매우 유사하여 컬렉션에서 다양한 유형을 함께 혼합 할 수 있습니다. 이것은 사물에 대한 Go 접근 방식과 반대되는 것 같습니다. Go는 매우 강력한 형식의 언어입니다. 예를 들어 Go에서 절대 허용되지 않는 암시 적 형식 변환은 upCast from int
to int64
도 명시 적이어야합니다. 그러나 list.List의 모든 메서드는 빈 인터페이스를 사용합니다.
내가 Python을 포기하고 Go로 옮긴 이유 중 하나는 Python이 "강력한 형식"이라고 주장하지만 (IMO는 그렇지 않습니다) Python 형식 시스템의 이러한 종류의 약점 때문입니다. Go list.List
는 C ++ vector<T>
과 Python에서
태어난 일종의 "잡종"으로 보이며 List()
Go 자체에서 약간 벗어난 것 같습니다.
그리 멀지 않은 미래의 어느 시점에서 우리가 list.List를 찾는다면 놀라지 않을 것입니다. List.List는 아마도 남아있을 것이지만 좋은 디자인 관행을 사용하더라도 문제를 가장 잘 해결할 수 있는 드문 상황 을 수용하기 위해 남아있을 것입니다. 다양한 유형의 컬렉션이 있습니다. 또는 C 제품군 개발자가 Go, AFAIK에 고유 한 슬라이스의 뉘앙스를 배우기 전에 Go에 익숙해 지도록 "브리지"를 제공 할 수도 있습니다. (일부 측면에서 슬라이스는 C ++ 또는 Delphi의 스트림 클래스와 비슷해 보이지만 완전히는 아닙니다.)
Delphi / C ++ / Python 배경에서 왔지만 Go를 처음 접했을 때 Go에 list.List
익숙해 졌기 때문에 Go의 슬라이스보다 더 친숙하다는 것을 알게 되었고 모든 목록을 슬라이스로 변경했습니다. 나는 아직 아무것도 찾지 못했고 slice
/ 또는 map
내가하도록 허용하지 않았으므로 list.List
.
list
유형은 연결 목록을 사용하여 구현되지 않습니다. Go 슬라이스와 유사하게 작동하며 때때로 데이터 사본을 확장해야합니다.