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最近回复了


回复了 zzhbbdbbd 创建的主题: golang中,unsafe.sizeof到底是干嘛的? 2018-04-19 19:56

只返回数据类型的大小,不管引用数据的大小,string类型不是直接存的数据,而是一个结构体,用指针指向实际数据地址

type StringHeader struct {
        Data uintptr
        Len  int
}

在64位系统上uintptr int都是8字节,加起来就16了。

https://golang.org/pkg/reflect/#StringHeader

回复了 51300520 创建的主题: 请问怎样限制http server的goroutine个数 2018-03-20 11:03

https://github.com/golang/net/blob/master/netutil/listen.go
可以用这个直接限制连接数,也可以参考这个实现一个HTTP中间件。

回复了 snake117 创建的主题: n++ 和 n= n+1、n+=1 不一样? 2018-03-15 22:02

我用go1.9.2 windows/amd64简单跑了一下你的代码,多跑几次发现有几率会出现空指针异常,可以肯定你的实现是有问题的,debug断点定位到main的for循环里的p.Key(),p为nil,没时间帮你看细节,你还是自己梳理一下逻辑吧,问题应该不是在n怎么+1上面。

回复了 snake117 创建的主题: n++ 和 n= n+1、n+=1 不一样? 2018-03-14 23:46

我在docker里用1.10试了一下,没问题。

这个不应该会有问题,再仔细debug一下吧,这要是真的有问题就非常致命了,排查出来真的有问题就及早向官方提issue

回复了 gao88 创建的主题: io.ReadFull接收不到数据 2018-03-03 14:56

func ReadFull(r Reader, buf []byte) (n int, err error)

ReadFull读取会有两种返回情况:

  1. 读满了buf
  2. 读到EOF

你要debug这几种情况:

  1. buf是否在其他地方被修改,导致无法读满buf
  2. 客户端是否正确的发送了数据

另外能收到EOF,说明连接是通的。

回复了 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就一样了,他这个字符串是用的十六进制不是二进制。

heimeil 创建的更多回复