Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
51 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
  • unsafe.Pointer
  • recursive types

Known limitations:

  • 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.

About

🕵️‍♂️ Extract a string representation of Go type

Topics

Resources

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.