为了账号安全,请及时绑定邮箱和手机立即绑定

来自 Goroutine 通道的随机结果,该通道接收指向底层对象的指针

来自 Goroutine 通道的随机结果,该通道接收指向底层对象的指针

Go
临摹微笑 2022-06-13 15:56:23
我刚开始学习GO。我正在尝试接收一个对象,但想通过指向底层对象的指针来更新它。但是代码不能正常工作,有人可以告诉我如何修复它吗?package mainimport (    "encoding/json"    "fmt")type JSONStr struct {    str []byte    err error}type person struct {    First string    Last  string    Age   int}func test(ch chan *JSONStr) {    t := <-ch    p1 := person{        First: "James",        Last:  "Bond",        Age:   32,    }    p2 := person{        First: "Miss",        Last:  "Moneypenny",        Age:   27,    }    people := []person{p1, p2}    fmt.Println(people)    t.str, t.err = json.Marshal(people)}func main() {    ch := make(chan *JSONStr)    var result JSONStr    go test(ch)    ch <- &result    fmt.Println(result)}
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

到您 printresult时,它可能还没有被变异test。解决此问题的一种简单方法是通过使用两个通道,如下所示:


package main


import (

    "encoding/json"

    "fmt"

)


type JSONStr struct {

    str []byte

    err error

}


func (j JSONStr) String() string {

    return fmt.Sprintf("str=%s, err=%s", j.str, j.err)

}


type person struct {

    First string

    Last  string

    Age   int

}


func test(in <-chan bool, out chan<- *JSONStr) {

    <-in


    people := []person{

        {First: "James", Last: "Bond", Age: 32},

        {First: "Miss", Last: "Moneypenny", Age: 27},

    }

    fmt.Println(people)


    b, err := json.Marshal(people)

    out <- &JSONStr{str: b, err: err}

}


func main() {

    in, out := make(chan bool), make(chan *JSONStr)

    go test(in, out)

    in <- true

    result := <-out

    fmt.Println(result)

}

编辑:从函数返回指针在 Go 中是安全且惯用的。从有效围棋:


请注意,与 C 不同,返回局部变量的地址是完全可以的;与变量关联的存储在函数返回后仍然存在。事实上,获取复合文字的地址会在每次评估时分配一个新实例


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信