Go type conversion fails despite having the same type
Go type conversion can fail despite having the same type. Type conversion is the process of converting between different data types, but in Go language, even if two types look the same, there is no guarantee that the conversion will be successful. This is because the Go language's strict type checking requires that the converted types must match exactly, including type names, structures, methods, etc. Therefore, developers must be careful and follow the type rules of the Go language when performing type conversion to avoid conversion failures.
Question content
I use jackc/pgx driver and gorm library to interact with postgresql database.
I have an instance where I have to check postgresql error codes and handle a certain error type differently. When using the pgx
driver, the gorm methods return the *pgconn.pgerror
type as error
, which contains a field with the specific error code.
In order to access the field I have to convert error
to *pgconn.pgerror
, but for some reason this fails:
res := tx.Take(&f, "id = ?", id) if res.Error != nil { if pqErr, ok := res.Error.(*pgconn.PgError); ok { // does not reach here } else { fmt.Printf("Error type: %T\n", res.Error) // Output: "Error type: *pgconn.PgError" } }
Comments:
-
The
-
pgx
andpgconn
packages are within the same project, so they do not return different versions of types with the same name. In other words, I only have one import in my go.mod. - The return value is not zero.
- The debugger shows that the type is
*pgconn.pgerror
.
SOLUTION
You've already solved your own problem, but here's some background that might be helpful, and how I found the source.
Packages with the same name can exist in the same program, as long as they have different import paths. For example, the standard library has both math/rand
and crypto/rand
, which are called r and
respectively. This is the first hint that *pgconn.PgError
and *pgconn.PgError
are different: they come from different import paths.
When modules in Go undergo major revisions, they should change their import paths. This is to maintain backward compatibility of import paths. Note that this is usually done by updating the module
declaration in the go.mod
file, rather than actually moving the code into the subdirectory. For example, see this Commit where pgx
collides from v4
to v5
. Here's the second tip: code from the pgx
project can be used under multiple import paths (due to multiple major versions).
With this background in mind, I used the git tag to view the latest v4.x.x
release. I noticed strangely that the pgconn
package does not exist in v4
. This seems to rule out the idea that github.com/jackc/pgx/v4/pgconn
conflicts with github.com/jackc/pgx/v5/pgconn
. Then I searched Google for "pgconn" and found the github.com/jackc/pgconn
repository, where I saw in the readme:
This version is used with pgx v4. In pgx v5, it is part of the https://www.php.cn/link/a0fb5dd4b80c7e9411ba9667315d20c3 repository.
Judging from the other information you provided, your error may be using the import path "github.com/jackc/pgx/pgconn"
. As shown in the example code for pgx
, the current import path you should use for the base module is "github.com/jackc/pgx/v5"
, and the packages within it will be like Specify it locally, for example "github .com/jackc/pgx/v5/pgconn"
.
The above is the detailed content of Go type conversion fails despite having the same type. For more information, please follow other related articles on the PHP Chinese website!

Golangisidealforbuildingscalablesystemsduetoitsefficiencyandconcurrency,whilePythonexcelsinquickscriptinganddataanalysisduetoitssimplicityandvastecosystem.Golang'sdesignencouragesclean,readablecodeanditsgoroutinesenableefficientconcurrentoperations,t

Golang is better than C in concurrency, while C is better than Golang in raw speed. 1) Golang achieves efficient concurrency through goroutine and channel, which is suitable for handling a large number of concurrent tasks. 2)C Through compiler optimization and standard library, it provides high performance close to hardware, suitable for applications that require extreme optimization.

Reasons for choosing Golang include: 1) high concurrency performance, 2) static type system, 3) garbage collection mechanism, 4) rich standard libraries and ecosystems, which make it an ideal choice for developing efficient and reliable software.

Golang is suitable for rapid development and concurrent scenarios, and C is suitable for scenarios where extreme performance and low-level control are required. 1) Golang improves performance through garbage collection and concurrency mechanisms, and is suitable for high-concurrency Web service development. 2) C achieves the ultimate performance through manual memory management and compiler optimization, and is suitable for embedded system development.

Golang performs better in compilation time and concurrent processing, while C has more advantages in running speed and memory management. 1.Golang has fast compilation speed and is suitable for rapid development. 2.C runs fast and is suitable for performance-critical applications. 3. Golang is simple and efficient in concurrent processing, suitable for concurrent programming. 4.C Manual memory management provides higher performance, but increases development complexity.

Golang's application in web services and system programming is mainly reflected in its simplicity, efficiency and concurrency. 1) In web services, Golang supports the creation of high-performance web applications and APIs through powerful HTTP libraries and concurrent processing capabilities. 2) In system programming, Golang uses features close to hardware and compatibility with C language to be suitable for operating system development and embedded systems.

Golang and C have their own advantages and disadvantages in performance comparison: 1. Golang is suitable for high concurrency and rapid development, but garbage collection may affect performance; 2.C provides higher performance and hardware control, but has high development complexity. When making a choice, you need to consider project requirements and team skills in a comprehensive way.

Golang is suitable for high-performance and concurrent programming scenarios, while Python is suitable for rapid development and data processing. 1.Golang emphasizes simplicity and efficiency, and is suitable for back-end services and microservices. 2. Python is known for its concise syntax and rich libraries, suitable for data science and machine learning.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

Dreamweaver Mac version
Visual web development tools

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software