还未发布过话题
  • println 是 buildin,一般用在 bootstrap 或者 debug 的时候(不想引入 fmt 包)。 但 golang 不一定会保留 println,一般我们自己打印还是用 fmt 包好了。

  • 这样写有什么问题? at 2018年01月28日

    golang 1.9 引入的新特性,type alias http://www.infoq.com/cn/news/2017/08/go-1-9-Type-Alias

  • https://golang.org/ref/spec#Method_declarations

    A non-blank receiver identifier must be unique in the method signature.** If the receiver's value is not referenced inside the body of the method, its identifier may be omitted in the declaration. **The same applies in general to parameters of functions and methods.

  • 代码看上去没啥问题,我用你的代码跑了下,varchar 插入正常。有点意思。

    fmt.Println(name, pwd) 这里打印出来的正确吗?

  • 命令找不到,要么是 go get 失败,要么是 path 设置的路径不对(应该是 $GOPATH/bin),要么是改了环境变量但没有载入配置文件(source .bashrc 之类)

  • 感兴趣可以看看 /usr/local/go/src/syscall/asm_linux_386.s

    #define INVOKE_SYSCALL  INT $0x80
    
    TEXT    ·Syscall(SB),NOSPLIT,$0-28
        CALL    runtime·entersyscall(SB)
        MOVL    trap+0(FP), AX  // syscall entry
        MOVL    a1+4(FP), BX
        MOVL    a2+8(FP), CX
        MOVL    a3+12(FP), DX
        MOVL    $0, SI
        MOVL    $0,  DI
        INVOKE_SYSCALL
        CMPL    AX, $0xfffff001
        JLS ok
        MOVL    $-1, r1+16(FP)
        MOVL    $0, r2+20(FP)
        NEGL    AX
        MOVL    AX, err+24(FP)
        CALL    runtime·exitsyscall(SB)
        RET
    ok:
        MOVL    AX, r1+16(FP)
        MOVL    DX, r2+20(FP)
        MOVL    $0, err+24(FP)
        CALL    runtime·exitsyscall(SB)
        RET
    

    AX 为 syscall 的 num,linux 定义在/usr/include/asm/unistd_32.h,不过 go 自己定义了一份,在 /usr/local/go/src/syscall/zsysnum_linux_386.go 用户态和内核态通过 syscall num 约定具体是哪个系统调用,如SYS_OPEN = 5,通过 int 0x80 陷入内核系统调用(x86)。

  • func (*Template) Lookup

    func (t *Template) Lookup(name string) *Template Lookup returns the template with the given name that is associated with t. It returns nil if there is no such template or the template has no definition.

    看上去是个 typo

  • golang 循环中的闭包问题 at 2017年06月13日

    尝试答一下。

    > The method set of the corresponding pointer type *T is the set of all methods with receiver *T or T (that is, it also contains the method set of T)

    也就是说 print 函数对于 TestClosure1 里的 go v.print() 会当做 go (&v).print()

    TestClosure 循环中,传给 print 函数的值,是 data 数组里 3 个成员各自的地址(v 是指针,值是变化的),用%p 打印:

    0xc82000a300 0xc82000a310 0xc82000a320

    所以等到 print 函数去打印的时候,可以取到正确的值;

    但 TestClosure1 循环中传给 print 函数的值,实际是 v 的地址指针(v 是 struct,每次循环都是一次值拷贝,但 v 的地址不变),因此 3 个平 print 函数看到的 p 值是一样的,都是 v 的地址;等到 print 函数去打印的时候,此时去取值,完全看 v 当前值拷贝的结果是什么。 在你的例子里,for 循环此时已经结束,v 的值就是最后一次值拷贝的结果 ({three})。 如果你在循环里加一个 time.Sleep(),给 goroutine 足够的启动时间,看到的结果跟 TestClosure 是一样的。

  • channel传输指针变量问题 at 2017年06月08日

    尝试回答下。 我认为不会,变量是否会被 GC 掉,取决于是否可达,line1 这种情况应该是 “逃逸” 了,并不会被回收。