Skip to content

πŸ•΅οΈβ€β™‚οΈ Extract a string representation of Go type

License

Notifications You must be signed in to change notification settings

samber/go-type-to-string

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

23 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Extract a string representation of Go type

tag Go Version GoDoc Build Status Go report Coverage Contributors License

Motivations

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 as any instead of string (see #2)

Examples

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

πŸš€ Install

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.

πŸ’‘ How to

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"
}

🀝 Contributing

Don't hesitate ;)

# Install some dev dependencies
make tools

# Run tests
make test
# or
make watch-test

πŸ‘€ Contributors

Contributors

πŸ’« Show your support

Give a ⭐️ if this project helped you!

GitHub Sponsors

πŸ“ License

Copyright Β© 2023 Samuel Berthe.

This project is MIT licensed.