stevewang

第 1556 号会员 /

回复了 ssqq 创建的主题: byte 比 rune 更快吗?

数据处理速度是确定的,当然数据越少处理所化的时间就越少,速度也就越快了。

但是如果处理中文,汉字的utf-8编码至少占用3个字节,那相对utf-16就没有优势了。

回复了 ssqq 创建的主题: go 不支持类型别名

以下代码编译失败:

type estr string

func f(s string) {}

func main(){
    var s estr = "hello"
    f(s)
}

错误信息:
cannot use s (type estr) as type string in argument to f

回复了 ssqq 创建的主题: go 不支持类型别名

不同类型之间的方法集是互相隔离的。
就你上面的例子而言,A并不会”继承”B的方法。
A对象要使用B类型的方法,必须做类型转换。

回复了 ssqq 创建的主题: 编译器 return 提示

go1.7rc6里你的那个示例函数肯定不会编译失败。

回复了 ssqq 创建的主题: go 不支持类型别名

区别就是属于两种不同的类型。
好处是可以为新的类型定义一套独立的方法,C/C++里的typedef就没法做到这点,因为typedef只是定义一个别名而不是真正的新类型。

回复了 Zhangyc310 创建的主题: 如果根据不同的域名,选择不同的handler

你自己实现一个http.Handler就可以:

package main

import(
    "fmt"
    "net/http"
    "strings"
)

type HostMux struct {
    muxes map[string]*http.ServeMux
}

func (this *HostMux) GetMux(host string) *http.ServeMux {
    mux, ok := this.muxes[host]
    if !ok {
        mux = http.NewServeMux()
        this.muxes[host] = mux
    }
    return mux
}

func (this *HostMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    host := r.Host
    if index := strings.IndexByte(r.Host, ':'); index > 0 {
        host = host[:index]
    }
    mux, ok := this.muxes[host]
    if ok {
        mux.ServeHTTP(w, r)
    }
}

func hello1(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello1")
}

func hello2(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello2")
}

func main() {
    mux := &HostMux{
        muxes: make(map[string]*http.ServeMux),
    }
    mux.GetMux("localhost").HandleFunc("/hello", hello1)
    mux.GetMux("127.0.0.1").HandleFunc("/hello", hello2)
    http.ListenAndServe(":6061", mux)
}

访问http://localhost:6061/hellohttp://127.0.0.1:6061/hello跳转到不同处理函数。

回复了 lwhile 创建的主题: Go语言圣经中的一道练习题

type limitReader struct {
    r io.Reader
    n int
}

func (this *limitReader) Read(b []byte) (int, error) {
    if this.n <= 0 {
        return 0, io.EOF
    }
    size := len(b)
    if size > this.n {
        size = this.n
    }
    n, err := this.r.Read(b[:size])
    if err != nil {
        return 0, err
    }
    this.n -= n
    return n, nil
}

func LimitReader(r io.Reader, n int64) io.Reader {
    return &limitReader{
        r: r,
        n: int(n),
    }
}

回复了 zhjphp 创建的主题: 求助一个golang的闭包问题

adder这个函数的返回类型是func(int) int,函数中返回了func(int) int类型的一个实例(闭包)。
所以你画的红框指明了adder函数的返回类型,蓝框是定义了一个符合adder函数返回类型的闭包,也就是adder函数的返回值。

回复了 haroldT 创建的主题: map 使用

map是引用类型的对象。

m1 := make(map[string]string)
m2 := m1

这段代码中,m1和m2都是指向底层的同一个map对象。

回复了 aaa 创建的主题: 关于sync.Mutex 如何具体使用?

mutex只是不让多个goroutine同时读写特定数据,但是没有办法让其他goroutine无法访问特定数据。

回复了 haroldT 创建的主题: map 使用

你的cols里两个对象其实是同一个map,自然输出同样的结果。
我猜测你想要的是:

package main

import (
    "fmt"
    "strings"
)

func main() {
    var cols []map[string]string
    a := "status:success,status:failed"
    b := strings.Split(a, ",")
    for _, vals := range b {
        val := strings.Split(vals, ":")
        cols = append(cols, map[string]string{
            val[0]: val[1],
        })
    }
    fmt.Println(cols)
}

回复了 zykzhang 创建的主题: go test坑

为什么不go test project/dir_a/dir_d?