在GraphQL API中返回字符串指针的正确方式是什么?

huangapple go评论89阅读模式
英文:

Proper way to return string pointers in Graphql API

问题

我正在使用99designs/gqlgen构建一个GraphQL API,但我对返回指针的正确方式有些困惑。

GraphQL类型定义如下:

type GraphType {
  image_url: String
}

Go代码如下:

type GraphType struct {
    ImageURL *string `json:"image"`
}

type T struct {
    value string
}

func (t T) toImageUrl() string {
    return fmt.Sprintf("http://test.localhost/%s", t.value)
}

func (t T) toGraphType() *GraphType {
    var items = &GraphType{}
    return items
}

有三种方法可以实现这个功能:

  1. toImageUrl函数返回一个指针:
func (t T) toImageUrl() *string {
    image := fmt.Sprintf("http://test.localhost/%s", t.value)
    return &image
}

var items = &GraphType{
    ImageURL: t.toImageUrl(),
}
  1. 存储值并获取指针:
image := t.toImageUrl()
var items = &GraphType{
    ImageURL: &image,
}
  1. 创建一个返回指针的实用函数:
func getPointerString(s string) *string {
    return &s
}

var items = &GraphType{
    ImageURL: getPointerString(t.toImageUrl()),
}

最简单的方法是使用getPointerString函数,但我不知道内存使用情况如何,这样做是否安全?

英文:

I'm building a graphql API using 99designs/gqlgen but I'm a bit confused about the proper way of returning pointers.

The graphql type

type GraphType {
  image_url: String
}

The go code is:

type GraphType struct {
	ImageURL *string `json:"image"`
}

type T struct {
	value string
}

func (t T) toImageUrl() string {
	return fmt.Sprintf("http://test.localhost/%s", t.value)
}

func (t T) toGraphType() *GraphType {
	var items = &GraphType{
	}
	return items
}

There a 3 ways that I can do this

// toImageUrl returns a pointer
func (t T) toImageUrl() *string {
	image := fmt.Sprintf("http://test.localhost/%s", t.value)
	return &image
}
var items = &GraphType{
	ImageURL: t.toImageUrl(),
}

// store the value and get a pointer
image := t.toImageUrl()
var items = &GraphType{
	ImageURL: &image,
}

// make a utility function for poiters
func getPointerString(s string) *string {
	return &s
}
var items = &GraphType{
	ImageURL: getPointerString(t.toImageUrl()),
}

The easyest is to use getPointerString but I don't know what happens to the momory usages, is this memory safe?

答案1

得分: 1

不同于其他语言,由于Go语言的出色的“逃逸分析”,你可以安全地返回一个指向局部变量的指针。所以,是的,使用getPointerString是安全的。

但我真的不认为你需要返回NULL。所以你的模式中不需要一个可为空的字符串。只需使用String!代替String,然后你可以直接返回一个Go字符串,而不需要一个指向字符串的指针。例如:

type GraphType {
  image_url: String!
}
type GraphType struct {
    ImageURL string `json:"image"`
}
英文:

Unlike other languages you can safely return a pointer to a local variable due to Go's amazing "escape analysis". So yes, using getPointerString is safe.

But I really don't think you need to return NULL. So you don't need a nullable string in your schema. Simply use String! instead of String then you can just return a Go string instead of needing a pointer to the string. Ie:

type GraphType {
  image_url: String!
}
type GraphType struct {
    ImageURL string `json:"image"`
}

huangapple
  • 本文由 发表于 2022年10月20日 16:37:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/74136790.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定