This library parses a DSN of the form:

Each of the sections is optional, so, for example, a DSN can be without schema or credentials.
go get github.com/kos-v/dsnparserimport "github.com/kos-v/dsnparser"
dsn := dsnparser.Parse("mysql://user:password@tcp(example.local:3306)/dbname?encoding=utf8mb4");
dsn.GetScheme() // string "mysql"
dsn.GetUser() // string "user"
dsn.GetPassword() // string "password"
dsn.GetHost() // string "example.local"
dsn.GetPort() // string "3306"
dsn.GetPath() // string "dbname"
dsn.GetParam("encoding") // string "utf8mb4"
dsn.GetParams() // map[string]string [encoding: "utf8mb4"]
dsn.GetTransport() // string "tcp"
dsn.HasParam("encoding") // bool true
dsn.GetRaw() // string "mysql://user:password@example.local:3306/dbname?encoding=utf8mb4"user:password@example.localexample.local:65535user:password@socket:///foo/bar.sockmysql://user:password@example.local/dbnamemysql://example.local/?db=dbname&user=user&password=password
user:password@ - user and password.
user@ or user:@ - only user, without password.
:password@ - only password, without user.
You can escape the ":" and "@" characters in credentials, as well as the "=" and "&" characters in the extra options. To do this, specify "\" before the desired character.
Examples:
us\:e\@r:p\@ssw\:ord@ -> us:e@r:p@ssw:ord
us\:e\@r:p\@ssw\:ord@ -> us:e@r:p@ssw:ord
?key1=foo \& bar&key2=baz \= quux -> key1=foo & bar&key2=baz = quux
?foo\&key=fool val&bar\=key=bar val -> foo&key=fool val&bar=key=bar val