英文:
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
}
有三种方法可以实现这个功能:
toImageUrl
函数返回一个指针:
func (t T) toImageUrl() *string {
image := fmt.Sprintf("http://test.localhost/%s", t.value)
return &image
}
var items = &GraphType{
ImageURL: t.toImageUrl(),
}
- 存储值并获取指针:
image := t.toImageUrl()
var items = &GraphType{
ImageURL: &image,
}
- 创建一个返回指针的实用函数:
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"`
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论