>백엔드 개발 >Golang >동일한 유형이 있음에도 불구하고 Go 유형 변환이 실패합니다.

동일한 유형이 있음에도 불구하고 Go 유형 변환이 실패합니다.

WBOY
WBOY앞으로
2024-02-13 16:45:081070검색

尽管类型相同,Go 类型转换仍失败

Go 유형 변환은 동일한 유형임에도 불구하고 실패할 수 있습니다. 유형 변환은 서로 다른 데이터 유형 간을 변환하는 프로세스이지만 Go 언어에서는 두 유형이 동일해 보이더라도 변환이 성공한다는 보장이 없습니다. Go 언어의 엄격한 유형 검사에서는 변환된 유형이 유형 이름, 구조, 메소드 등을 포함하여 정확하게 일치해야 하기 때문입니다. 따라서 개발자는 변환 실패를 방지하기 위해 유형 변환을 수행할 때 주의하고 Go 언어의 유형 규칙을 따라야 합니다.

질문 내용

저는 jackc/pgx 드라이버와 gorm 라이브러리를 사용하여 postgresql 데이터베이스와 상호작용하고 있습니다.

postgresql 오류 코드를 확인하고 특정 오류 유형을 다르게 처리해야 하는 경우가 있습니다. pgx 驱动程序时,gorm 方法返回 *pgconn.pgerror 类型作为 error를 사용하면 특정 오류 코드가 있는 필드가 포함됩니다.

필드에 액세스하려면 error 转换为 *pgconn.pgerror해야 하지만 어떤 이유로든 실패합니다.

으아아아

참고:

  1. pgxpgconn 패키지는 동일한 프로젝트 내에 있으므로 동일한 이름을 가진 다른 버전의 유형을 반환하지 않습니다. 즉, go.mod에는 가져오기가 하나만 있습니다.
  2. 반환 값이 0이 아닙니다.
  3. 디버거는 유형이 *pgconn.pgerror임을 보여줍니다.

해결 방법

이미 문제를 해결했지만 도움이 될 수 있는 배경 지식과 소스를 찾은 방법은 다음과 같습니다.

가져오기 경로가 다르면 동일한 이름을 가진 패키지가 동일한 프로그램에 존재할 수 있습니다. 예를 들어, 표준 라이브러리에는 math/rand,也有crypto/rand,分别称为r和。这是 *pgconn.PgError*pgconn.PgError 서로 다른 첫 번째 힌트가 있습니다. 즉, 서로 다른 가져오기 경로에서 나옵니다.

Go의 모듈이 대규모 개정을 거치면 가져오기 경로를 변경해야 합니다. 이는 가져오기 경로의 이전 버전과의 호환성을 유지하기 위한 것입니다. 이는 일반적으로 코드를 실제로 하위 디렉터리로 이동하는 대신 go.mod 파일의 module 선언을 업데이트하여 수행됩니다. 예를 들어 commit go.mod 文件中的 module 声明来完成的,而不是实际将代码移动到子目录中。例如,请参阅此 提交,其中 pgxv4 碰撞到 v5 。这是第二个提示:来自 pgx을 참조하세요. 여기서 pgxv4에서 왔습니다. code>가 <code>v5와 충돌합니다. 두 번째 팁은 다음과 같습니다. pgx 프로젝트의 코드는 여러 가져오기 경로에서 사용할 수 있습니다(여러 주요 버전으로 인해).

이 배경을 염두에 두고 git 태그를 사용하여 최신 v4.x.x 게시물 v4.x.x 发布。我注意到奇怪的是,pgconn 包在 v4 中不存在。这似乎排除了 github.com/jackc/pgx/v4/pgconngithub.com/jackc/pgx/v5/pgconn 冲突的想法。然后我在 Google 上搜索“pgconn”并找到了 github.com/jackc/pgconn. 이상하게도 v4에는 pgconn 패키지가 없다는 것을 알았습니다. 이는 github.com/jackc/pgx/v4/pgconngithub.com/jackc/pgx/v5/pgconn과 충돌한다는 생각을 배제하는 것 같습니다. 그런 다음 "pgconn"을 검색하여 readme에서 본 github.com/jackc/pgconn 저장소를 찾았습니다.

이 버전은 pgx v4에서 작동합니다. pgx v5에서는 https://www.php.cn/link/a0fb5dd4b80c7e9411ba9667315d20c3 저장소의 일부입니다.

제공하신 다른 정보에 따르면 실수로 가져오기 경로를 사용하고 있을 수 있습니다"github.com/jackc/pgx/pgconn"。如 pgx 的示例代码所示,您应该用于基本模块的当前导入路径是 "github.com/jackc/pgx/v5",并且其中的包将被类似地指定,例如 "github .com/jackc/pgx/v5/pgconn".

위 내용은 동일한 유형이 있음에도 불구하고 Go 유형 변환이 실패합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제