Golang中国

stevewang

Golang China 第 1556 号会员,加入于 2014-07-06 00:47


stevewang最近创建的主题


go1.7.3 is released.
公告stevewang • 2016-10-20 09:44
1 go1.7.1 is released!
公告stevewang • 2016-09-09 09:06 • 最后回复来自 elvindu
1 Go 1.6.3 and 1.7rc2 are released
公告stevewang • 2016-07-19 12:50 • 最后回复来自 jimmykuu
1 go1.6.2 is released
业界消息stevewang • 2016-04-21 15:26 • 最后回复来自 jimmykuu
2 go1.6.1和go1.5.4发布了
业界消息stevewang • 2016-04-14 09:53 • 最后回复来自 rockman
stevewang 创建的更多主题

stevewang最近回复了


回复了 harrykobe 创建的主题: Struct含有匿名字段,该匿名字段有MarshalJSON方法,导致Struct不能正确转换成json字符串!! 7 小时前

你要是嫌这个写法笨,其实自己实现MarshalJSON岂不是更笨?因为你这个例子根本就没有必要自己实现MarshalJSON。我写的只是一个示例,用来说明在自己实现MarshalJSON的情况下怎么做而已。
你要想容易维护扩展性能好,可以自己组织调整一下。
比如

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io"
    "strings"
)

type Person struct {
    Name string
}

func (p *Person) MarshalJSON() ([]byte, error) {
    var buf bytes.Buffer
    buf.WriteByte('{')
    p.marshalJSON(&buf)
    buf.WriteByte('}')
    return buf.Bytes(), nil
}

func (p *Person) marshalJSON(w io.Writer) {
    fmt.Fprintf(w, `"name":"%s"`, strings.ToLower(p.Name))
}

type Employee struct {
    Person
    JobRole string
}

func (e *Employee) MarshalJSON() ([]byte, error) {
    var buf bytes.Buffer
    buf.WriteByte('{')
    e.Person.marshalJSON(&buf)
    buf.WriteByte(',')
    fmt.Fprintf(&buf, `"jobRole":"%s"`, e.JobRole)
    buf.WriteByte('}')
    return buf.Bytes(), nil
}
func main() {
    p := Person{"Bob"}
    e := Employee{
        Person:  p,
        JobRole: "Sales",
    }
    output, err := json.Marshal(&e)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(output))
}
回复了 583125614 创建的主题: 新手刚接触go语言 请教下为什么我编译好的exe 总是闪退 2017-01-23 14:10

执行结束自然会退出。
你预期看到什么结果呢?

回复了 harrykobe 创建的主题: Struct含有匿名字段,该匿名字段有MarshalJSON方法,导致Struct不能正确转换成json字符串!! 2017-01-23 10:08
package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type Person struct {
    Name string
}

func (p *Person) MarshalJSON() ([]byte, error) {
    str := fmt.Sprintf(`{"name":"%s"}`, strings.ToUpper(p.Name))
    return []byte(str), nil
}

type Employee struct {
    Person
    JobRole string
}

func (e *Employee) MarshalJSON() ([]byte, error) {
    str := fmt.Sprintf(`{"name":"%s", "jobRole":"%s"}`,
        strings.ToUpper(e.Name),
        e.JobRole)
    return []byte(str), nil
}

func main() {
    p := Person{"Bob"}
    e := Employee{
        Person:  p,
        JobRole: "Sales",
    }
    output, err := json.Marshal(&e)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(output))
}
回复了 zhaoyangwyyx 创建的主题: Golang 网络程序中,关于信号处理:例如服务器程序要处理一些信号吗,例如PIPE等信号。 2017-01-22 17:24
SIGPIPE

When a Go program writes to a broken pipe, the kernel will raise a SIGPIPE signal.

If the program has not called Notify to receive SIGPIPE signals, then the behavior depends on the file descriptor number. A write to a broken pipe on file descriptors 1 or 2 (standard output or standard error) will cause the program to exit with a SIGPIPE signal. A write to a broken pipe on some other file descriptor will take no action on the SIGPIPE signal, and the write will fail with an EPIPE error.

If the program has called Notify to receive SIGPIPE signals, the file descriptor number does not matter. The SIGPIPE signal will be delivered to the Notify channel, and the write will fail with an EPIPE error.

This means that, by default, command line programs will behave like typical Unix command line programs, while other programs will not crash with SIGPIPE when writing to a closed network connection.
回复了 adodo08 创建的主题: 对指针不是很理解 2016-12-10 17:53

*rp.width = 100改成(*rp).width = 100
*rp.width是对rp.width进行dereference,而(*rp).width是对rp进行dereference,然后访问*rp这个对象的width成员。

回复了 gomgo 创建的主题: 写了个 两个数相加的 goroutine,也没见快啊! 2016-11-25 20:59

你这计算规模不够大,不能抵消并行运行导致的负载。

回复了 aaaaaaaa 创建的主题: 我想写个闹钟程序, 请问思路是怎样的? 2016-11-24 19:47

计算出下一次闹钟起闹的时间与当前时间的间隔,然后设定这么长间隔时间的Timer不就可以了?

stevewang 创建的更多回复