For the samber/do project, I needed to convert a Go type into a string. I used to convert it with fmt.Sprintf("%T", t)
-> mypkg.MyStruct
, but it does not insert package path into type representation, leading to collision when types from different pacakges match.
This package export type using the following representation:
*[]**<-chan github.com/samber/example .Example
| | ^
| | Type name
| ^
| The package path (including package name)
^
Type indicators (map, slice, pointer, channel...)
This library supports:
- primitive types
- pointers
- structs
- functions with input and output
- vaargs
- interfaces
- maps
- arrays
- slices
- channels
- generics
- anonymous types
- named types
Known limitations:
- structs in anonymous types
- structs in generic type
any("foobar")
is currently reported asany
instead ofstring
(see #2)
Using the following types:
package example
type testStruct struct{}
type testGeneric[T any] struct{ t T }
type testNamedType testStruct
Type | Exported |
---|---|
int |
int |
*int |
*int |
**[]*int |
**[]*int |
**[]*map[int]bool |
**[]*map[int]bool |
func (a string, b bool) int |
func (string, bool) int |
func(int, ...string) (bool, error) |
func(int, ...string) (bool, error) |
testStruct |
github.com/samber/example.testStruct |
*testStruct |
*github.com/samber/example.testStruct |
***testStruct |
***github.com/samber/example.testStruct |
***testNamedType |
***github.com/samber/example.testNamedType |
[][3]***testStruct |
[][3]***github.com/samber/example.testStruct |
testGeneric[string] |
github.com/samber/example.testGeneric[string] |
*map[testStruct]chan<- testGeneric[string] |
*map[github.com/samber/example.testStruct]chan<- github.com/samber/example.testGeneric[string] |
See more examples here
go get github.com/samber/go-type-to-string
This library is v1 and follows SemVer strictly. No breaking changes will be made to exported APIs before v2.0.0.
GoDoc: https://pkg.go.dev/github.com/samber/go-type-to-string
package example
import converter "github.com/samber/go-type-to-string"
type Example struct{
foo string
bar int
}
func main() {
name1 := converter.GetType[*Example]()
// "*github.com/samber/example.Example"
name2 := converter.GetValueType(Example{})
// "github.com/samber/example.Example"
}
- Ping me on Twitter @samuelberthe (DMs, mentions, whatever :))
- Fork the project
- Fix open issues or request new features
Don't hesitate ;)
# Install some dev dependencies
make tools
# Run tests
make test
# or
make watch-test
Give a βοΈ if this project helped you!
Copyright Β© 2023 Samuel Berthe.
This project is MIT licensed.