Go 언어에서 고유한 매핑 키를 생성하는 가장 효율적인 방법은 항상 개발자의 관심사였습니다. 키가 고유해야 하는 시나리오에 직면하면 효율적이고 안정적인 방법을 찾아야 합니다. PHP 편집자 Baicao는 이 기사에서 Go 언어로 고유한 매핑 키를 생성하여 코드를 더욱 최적화하고 효율적으로 만드는 데 도움이 되는 가장 효과적인 방법 중 하나를 공유합니다. 대규모 데이터를 처리하든 고도의 동시 애플리케이션을 구현하든 이러한 방법은 성능과 효율성을 향상시키는 데 도움이 될 수 있습니다. 함께 알아봅시다!
도서관 어딘가에 map[any]SomeType
하나 있어요. 나는 라이브러리 사용자가 이 지도에 대한 키를 생성하여 단일 애플리케이션 실행 내에서 충돌이 발생하지 않도록 보장하고 이러한 키가 지도 조회에 효율적이기를 원합니다.
가장 먼저 떠오르는 것은 고유한 빈 개체의 메모리 주소를 사용하는 것입니다. 하지만 지금까지 시도한 모든 것이 실패했습니다.
으아악인쇄
으아악그래서 빈 구조체 변수의 주소를 얻는 것은 함수에 전달할 때까지 거의 가능합니다. 그러면 차이가 사라집니다.
키 레지스트리는 불필요한 합병증이므로 소개하고 싶지 않습니다. 또한 문자열을 사용하고 싶지 않습니다. 라이브러리의 서로 다른 소비자가 키를 협상하거나 네임스페이스를 사용해야 하고 문자열을 해시하고 비교해야 하는 필요성도 불필요하기 때문입니다.
내가 생각하지 못한 방법이 있는 걸까요?
표준 라이브러리는 모든 유형 값의 context.Context
时使用了一个“技巧”:上下文能够在其中携带任意值,并且这些值使用 interface{}
进行键控(从一段时间以来 any
)1。然后,您自己的包可以为其将要使用的上下文键定义一个新的未导出类型,然后定义一组具有该类型的常量作为该包已知的上下文键。现在的技巧是,类型始终是 interface{}
부분을 사용하므로 패키지 키와 충돌하는 인터페이스 값을 생성할 수 없습니다.
기본적으로는 다음과 같습니다.
으아악이제 실행하면 key interface{} = KeyFoo
时,几乎可以保证程序中任何其他代码段都不能具有与 key
相同的值,因为其中一部分将(指向的内部指针)未导出输入 contextKey
.
작동 방식을 이해하려면 이 고전 기사를 읽어보세요(조금 녹슬었지만 여전히 99% 정확함).
나에게는 이것이 앞으로 나아갈 길처럼 보입니다. 패키지 사용자는 자신의 키를 생성하여 지도에 제출할 수 있으며 키 유형은 interface{}
或 any
이어야 합니다. 이러한 키를 전달하기 위해 중앙 집중식 레지스트리가 필요하지 않습니다.
1 자세한 내용은 context.Context.Value() 및 context.WithValue()를 참조하세요. 후자는 키 생성 방법에 대한 추가 팁을 제공합니다.
위 내용은 Go에서 고유한 지도 키를 생성하는 가장 효율적인 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!