Golang中国

sryan

Golang China 第 5413 号会员,加入于 2016-05-11 14:26


sryan最近创建的主题


sryan最近回复了


回复了 kerr 创建的主题: 请教如何优雅的实现回调? 2016-10-17 10:55

golang的interface大概就是c++里的纯虚类,通过调用它的接口来解耦
结构体初始化的时候传入对应的interface的实现

很多面向对象语言都有这种设计吧

回复了 kerr 创建的主题: 请教如何优雅的实现回调? 2016-10-17 10:31

可以使用interface来解耦

回复了 yl32940 创建的主题: gorountine 错误 这个是什么情况下引起的 直接导致程序退出 2016-10-14 11:55

你的goroutine太多了,看不到你逻辑goroutine的堆栈

回复了 jikai507 创建的主题: 工作一个月了,谈谈如今对Go的感觉 2016-10-13 08:49

其实很多公司内部的新项目已经开始用golang了,基础服务用的很多,只是招聘没有写出来而已
当然我之前是c++程序员,至少在写后端服务首选肯定是golang,其余golang做不了的,那么继续c++

回复了 aaa 创建的主题: 结构体中有map, 这个map默认nil初始化,无法赋值, 怎么解决? 2016-10-12 11:48

同一楼 自己写一个构造函数
另外直接new不是坑吧 熟悉c++都知道new只是分配内存和调用构造函数,内部指针还是要自己管理的

回复了 shuaixinga 创建的主题: 越学,越是感觉好多坑. 为了编译速度,牺牲的太多了吧; 2016-09-22 14:37

我以前是c++程序员 我只想说 呵呵

回复了 shuaixinga 创建的主题: 学习GOLANG很久,还是感觉struct和interface很乱,如何解决? 2016-09-12 10:24

封装的越简单 那么可扩展性和通用性越差

回复了 q464610036 创建的主题: 关于结构体复制问题 2016-09-08 21:05

不能直接复制
可以使用反射来赋值

type A struct {
    ID   int
    Name string
}

type B struct {
    ID   int
    Name string
}

func CopyStruct(src interface{}, dest interface{}) error {
    vsrc := reflect.ValueOf(src)
    vdest := reflect.ValueOf(dest)

    if vsrc.Kind() != reflect.Ptr ||
        vdest.Kind() != reflect.Ptr {
        return fmt.Errorf("Invalid input")
    }

    esrc := vsrc.Elem()
    edest := vdest.Elem()

    if esrc.Kind() != reflect.Struct ||
        esrc.Kind() != reflect.Struct {
        return fmt.Errorf("Invalid input")
    }

    tsrc := esrc.Type()
    for i := 0; i < esrc.NumField(); i++ {
        sourceField := esrc.Field(i)
        sourceFieldName := tsrc.Field(i).Name
        destFiled := edest.FieldByName(sourceFieldName)

        if !destFiled.IsValid() {
            continue
        }
        if destFiled.Kind() != sourceField.Kind() {
            continue
        }

        switch sourceField.Kind() {
        //    int...
        case reflect.Int:
            fallthrough
        case reflect.Int8:
            fallthrough
        case reflect.Int16:
            fallthrough
        case reflect.Int32:
            fallthrough
        case reflect.Int64:
            {
                destFiled.SetInt(sourceField.Int())
            }
        // uint...
        case reflect.Uint:
            fallthrough
        case reflect.Uint8:
            fallthrough
        case reflect.Uint16:
            fallthrough
        case reflect.Uint32:
            fallthrough
        case reflect.Uint64:
            {
                destFiled.SetUint(sourceField.Uint())
            }
        // string
        case reflect.String:
            {
                destFiled.SetString(sourceField.String())
            }
        }
    }

    return nil
}

func main() {
    a := &A{
        ID:   1,
        Name: "hehe",
    }
    b := &B{}

    CopyStruct(a, b)
    log.Println(b)
}
回复了 maki 创建的主题: 求问 包:github.com/go-sql-driver/mysql 出现了下面这个错误有人遇到么,我要崩溃了~ 2016-09-05 09:48

的确会报很多这个错误
大概看了下原因,大概是mysql将一段时间没有sql操作的连接主动关闭了,然而golang的sql封装是实现了连接池的,旧的连接取出来后,假设进行了sql操作,那么就会报这个错误。
但是不影响实际的逻辑,在连接不可用的情况下,会重新连接获取新的sql连接的。

sryan 创建的更多回复