猿问

解组为指针与值接收器字段

我最近在学习 Golang。我知道指针和值接收器通常是如何工作的。


当 Unmarshal JSON string like following 2示例时,我觉得第一个(指针接收器)更有效地使用内存。但是我看到很多例子和文章没有使用这种方式。这有什么原因吗?它们的用例是什么?


package main


import (

    "encoding/json"

    "fmt"

)


type Outer struct {

    ID           int          `json:"id"`

    PointerValue *string      `json:"pointer_str"`

    Inner        *Inner `json:"inner"`

}

type Inner struct {

    Value string `json:"value"`

}


func main() {

    testJson := `{

            "id": 1,

            "pointer_str": "example-value",

            "inner": {

                "value": "some-value"

            }

        }`

    testStruct := &Outer{}

    json.Unmarshal([]byte(testJson), testStruct)

    fmt.Printf("%+v\n", testStruct)

    fmt.Printf("%+v\n", *testStruct.PointerValue)

    fmt.Printf("%+v\n", testStruct.Inner)

}

输出:


&{ID:1 PointerValue:0x40c250 Inner:0x40c258}

example-value

&{Value:some-value}

或者


package main


import (

    "encoding/json"

    "fmt"

)


type Outer struct {

    ID           int          `json:"id"`

    PointerValue string      `json:"pointer_str"`

    Inner        Inner `json:"inner"`

}

type Inner struct {

    Value string `json:"value"`

}


func main() {

    testJson := `{

            "id": 1,

            "pointer_str": "example-value",

            "inner": {

                "value": "some-value"

            }

        }`

    testStruct := &Outer{}

    json.Unmarshal([]byte(testJson), testStruct)

    fmt.Printf("%+v\n", testStruct)

    fmt.Printf("%+v\n", testStruct.Inner)

}

输出:


&{ID:1 PointerValue:example-value Inner:{Value:some-value}}

{Value:some-value}

更新:我对效率的含义是“使用内存的有效方式”


动漫人物
浏览 119回答 1
1回答

Helenr

认为它更有效的假设是错误的。没有指针的那个效率更高,因为不需要间接,并且该值与 的其他值一起在内存缓存中Outer。访问会更快。当内部值是可选的时使用指针。nil当该值不存在时,它将具有一个值。否则使用没有指针的表格。如果 JSON 字符串中的 Inner 的值可能是 ,您也可以使用指针null。
随时随地看视频慕课网APP

相关分类

Go
我要回答