Golang 中国

heimeil

Golang China 第 1925 号会员,加入于 2014-09-01 17:04


heimeil最近创建的主题


有了解加密相关的人吗?
问与答heimeil • 2016-04-12 22:24
12 系统库函数如何重写且不影响其他地方引用?
问与答heimeil • 2015-07-24 09:59 • 最后回复来自 wuhanyucheng
6 append函数的实现在哪?
问与答heimeil • 2015-01-20 18:08 • 最后回复来自 stevewang
11 go的float和int怎么玩啊
Web开发heimeil • 2014-10-17 08:48 • 最后回复来自 facat
1 分享一个windows更换bing壁纸的小程序
分享heimeil • 2014-10-08 21:58 • 最后回复来自 facat
5 struct Tag定义后还能再修改吗?
Web开发heimeil • 2014-09-07 13:39 • 最后回复来自 jimmykuu
3 struct如何包含未知数量的其他struct或自己?
Web开发heimeil • 2014-09-01 22:39 • 最后回复来自 David
heimeil 创建的更多主题

heimeil最近回复了


回复了 Szzzl 创建的主题: 刚刚开始学Golang,请问这个是什么意思? 2018-01-14 18:25

二进制操作,大多数语言差不多都是类似的操作。将1左移100位,这个数就非常大了,都已经超过了常用整形中最大的Int64了,得要13个字节才能装得下,不能指派类型,但能做比较使用,这个取名Big应该就是要这么用的。

回复了 aaaaaaaa 创建的主题: context包 WithValue(ctx, key ,val) 的key参数应该是非导出的内置类型, 如何理解? 2018-01-08 10:38

官方文档没有特别描述GC啊,我看见的是使用非内置类型是为了避免和其他包冲突,直接看源码:

// WithValue returns a copy of parent in which the value associated with key is
// val.
//
// Use context Values only for request-scoped data that transits processes and
// APIs, not for passing optional parameters to functions.
//
// The provided key must be comparable and should not be of type
// string or any other built-in type to avoid collisions between
// packages using context. Users of WithValue should define their own
// types for keys. To avoid allocating when assigning to an
// interface{}, context keys often have concrete type
// struct{}. Alternatively, exported context key variables' static
// type should be a pointer or interface.
func WithValue(parent Context, key, val interface{}) Context {
    if key == nil {
        panic("nil key")
    }
    if !reflect.TypeOf(key).Comparable() {
        panic("key is not comparable")
    }
    return &valueCtx{parent, key, val}
}

// A valueCtx carries a key-value pair. It implements Value for that key and
// delegates all other calls to the embedded Context.
type valueCtx struct {
    Context
    key, val interface{}
}

func (c *valueCtx) String() string {
    return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val)
}

func (c *valueCtx) Value(key interface{}) interface{} {
    if c.key == key {
        return c.val
    }
    return c.Context.Value(key)
}

关键在L39,当前ctx没有还会去父ctx获取,和JS原型链调用类似,如果在不知情的情况下用了和父ctx相同的key并且是内置类型就可能会有异常情况,文档说用自定义类型来避免这种情况是用了interface的特性,看下面例子:

package main

import (
    "fmt"
)

func main() {
    type myInt int
    i := myInt(1)
    fmt.Println(1 == i)     // true
    fmt.Println(compare(i)) // false
    fmt.Println(compare(1)) // true
}

func compare(key interface{}) bool {
    return 1 == key
}

interface的比较不只比较值还比较类型,这就是文档说的用非内置类型来避免冲突。

回复了 Justin 创建的主题: 如何通过RSA指数和模数进行加密 2017-12-21 12:51

@leavesdrift L28改16就一样了,他这个字符串是用的十六进制不是二进制。

回复了 wepiehr 创建的主题: 小而美的公司 武汉微派网络科技有限公司 招聘新人啦! (各类职位应有尽有 总有一个是你的style) 2017-11-23 13:20

请问本科学历是固定门槛吗?前几天投你们简历直接被刷掉了。

回复了 jiaion 创建的主题: 阿里云CDN诚聘Go程序猿 2017-11-16 16:37

阿里招人必须得本科以上才能合格吧

回复了 cumt_21g 创建的主题: 妈蛋,整个go社区就没有一个正常的日志库? 2017-11-16 11:05
package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

type writer struct {
    io.Writer
}

// 3
func (w *writer) Write(p []byte) (n int, err error) {
    fmt.Println(string(p))
    return w.Writer.Write(p)
}

func main() {
    logFile, err := os.Create("hello.log")
    if err != nil {
        panic(err)
    }
    defer logFile.Close()

    // 1
    w := io.MultiWriter(os.Stdout, logFile)

    // 4 2
    logger := log.New(&writer{Writer: w}, "| GOGOGO | ", log.Llongfile)

    logger.Println("Hello World!")
}

1、2用标准库的log直接能满足,3、4可能还是要看具体需求,但自己实现这种功能的log还是不难的。

回复了 haha03942008 创建的主题: 怎么样通过pid得到进程的stderrpipe,求代码,谢谢大家了! 2017-11-15 10:49

先搞清楚你程序是怎么挂掉的

回复了 haha03942008 创建的主题: 怎么样通过pid得到进程的stderrpipe,求代码,谢谢大家了! 2017-11-14 18:31

三种情况:
1)这个进程如果能由你启动的话,直接在你的程序里用https://golang.org/pkg/os/exec/#Command来执行就直接能拿到全部标准流,或者用命令行参数重定向stderr到文件./cmd 2>/path/to/file,再读文件就行了;

2)如果是基础功能(系统组件或数据库之类),你不好去控制进程启动的话,这类标准组件都能配置日志输出到指定文件,配置后读文件就行了;

3)如果不允许你碰这个进程,只能通过pid去获取的话就比较麻烦,涉及Linux底层,拿不拿的到也还要看几种情况。

heimeil 创建的更多回复