Using generics to get a pointer to any type, in Go

Featured image for sharing metadata for article

In Go, we use pointers to define that a value may be optional.

Often, we'll use the & operator to provide the pointer value to a method, so we can do something like this:

method(&api.Response{})

The issue is that not every type can use the & operator, for instance we can't do this with a string:

ptr := &"foo"
// compilation error:
// invalid operation: cannot take address of "foo" (untyped string constant)

So how can we get around this? One option is to use an intermediate variable:

s := "foo"
ptr := &s

But depending on how many parameters need to be coerced into pointers, this can be a little awkward.

Alternatively, with Go 1.18's support for generics, we can create a helper method like the below, which gives us the ability to do this with any type:

func PtrTo[T any](v T) *T {
  return &v
}

func main() {
	fmt.Println("foo")
	fmt.Println(PtrTo("foo"))
}

Written by Jamie Tanna's profile image Jamie Tanna on , and last updated on .

Content for this article is shared under the terms of the Creative Commons Attribution Non Commercial Share Alike 4.0 International, and code is shared under the Apache License 2.0.

#blogumentation #go.

Also on:

This post was filed under articles.

Interactions with this post

Interactions with this post

Below you can find the interactions that this page has had using WebMention.

Have you written a response to this post? Let me know the URL:

Do you not have a website set up with WebMention capabilities? You can use Comment Parade.