stevewang

第 1556 号会员 /

回复了 a24729298 创建的主题: 如何用golang在mysql的表格创建自定义的字段

你自己生成一个sql语句增加字段不就好了。只是要注意下字段名的检查。

err := db.Exec(fmt.Sprintf("alter table user add column %s varchar(128)", user.Biaotou))
if err != nil {
    log.Fatal(err)
}

回复了 kidddd 创建的主题: 如何遍历 map[string]interface{} 类型的value值?

package main

import(
    "encoding/json"
    "fmt"
    "reflect"
)

func main() {
    txt := `{"a":1,"b":2,"c":[{"name":"1","group":"2"},{"name":"3","group":"4"}]}`
    var m map[string]interface{}
    if err := json.Unmarshal([]byte(txt), &m); err != nil {
        panic(err)
    }
    v := reflect.ValueOf(m["c"])
    count := v.Len()
    for i := 0; i < count; i++ {
        fmt.Println(v.Index(i))
    }
}

回复了 jimmykuu 创建的主题: Go 排序代码悬赏

package main

import (
    "fmt"
    "sort"
    "strings"
)

type VersionList []string

func (v VersionList) Len() int {
    return len(v)
}

func (v VersionList) Swap(i, j int) {
    v[i], v[j] = v[j], v[i]
}

func (v VersionList) Less(i, j int) bool {
    vi := v.parse(v[i])
    vj := v.parse(v[j])
    for index := 0; index < 3; index++ {
        if vi[index] != vj[index] {
            return vi[index] < vj[index]
        }
    }
    return true
}

func (v VersionList) parse(version string) []string {
    fields := strings.Split(version, ".")
    for i := len(fields); i < 3; i++ {
        fields = append(fields, "")
    }
    middle := []byte(fields[1])
    digital := true
    for i := 0; i < len(middle); i++ {
        switch {
        case middle[i] < '0' || middle[i] > '9':
            digital = false
        case middle[i] >= 'A' && middle[i] <= 'Z':
            middle[i] = 'a' + middle[i] - 'A'
        }
    }
    if digital {
        fields[1] = string(middle) + "z"
    }
    return fields[:3]
}

func VersionSort(versions []string) []string {
    sort.Sort(VersionList(versions))
    return versions
}

func main() {
    versions := []string{"1.6beta1", "1.5rc1", "1.5beta2", "1.5beta1", "1.5.1", "1.5", "1.4rc2", "1.4rc1", "1.4beta1", "1.4.2", "1.4.1", "1.4", "1.3rc2", "1.3rc1", "1.3beta2", "1.3beta1", "1.3.3", "1.3.2", "1.3.1", "1.3", "1.2rc5", "1.2rc4", "1.2rc3", "1.2rc2", "1.2rc1", "1.2.2", "1.2.1", "1.2", "1.1.2", "1.1.1", "1.1", "1.0.3", "1.0.2", "1.5.2", "1.5alpha1"}
    VersionSort(versions)
    fmt.Println(versions)
}

回复了 xhy854 创建的主题: 用GO写的一个读数据库的URL记录并每次同时访问1000个URL的HEADER,然后根据结果再写入数据库。但是不是很稳定,会报错(看不懂错误是什么意思)有时候能跑完20万个URL,有时候就只能跑完几万个。麻烦各位大神帮忙分析一下什么原因。。谢了!!

我不认为是mysql驱动程序的问题,更可能是你的mysql server的配置和处理能力的问题。

其实你的程序的瓶颈不是访问mysql,而是访问url。对mysql的访问完全可以只用几个goroutine就搞定。

另外,你有20万个url,每个url都用一个goroutine去处理,这也是不现实的。建议你再斟酌一下你的并发模型。

回复了 xhy854 创建的主题: 用GO写的一个读数据库的URL记录并每次同时访问1000个URL的HEADER,然后根据结果再写入数据库。但是不是很稳定,会报错(看不懂错误是什么意思)有时候能跑完20万个URL,有时候就只能跑完几万个。麻烦各位大神帮忙分析一下什么原因。。谢了!!

看异常信息,错误发生在第37行:
stmt1.Exec("NOTACCESS",url)
stmt1为空指针。

你最好在第35行
stmt1,_:=db.Prepare("update url_stat set state=? where url=?")
这里检查一下返回的错误。

根本原因可能还是数据库连接太多了超过mysql server的上限。你可以把数据库连接从现在的200左右降到20试试。不过35行的错误处理仍然还是需要的。

回复了 zjhh116 创建的主题: 请问struct 匿名数组如何定义?

type Human struct {
    name  string
    age   int
    phone string //Human类型拥有的字段
}

type HumanSlice []Human

type EmployeeList struct {
    HumanSlice //匿名字段Human数组
    speciality string
    phone      string //雇员的phone字段
}

回复了 suisisuisi 创建的主题: go 实现kmeans算法,但是效率好差

稍微看了下代码,func (s *SeedFactory) KSeed(plen int)(p int)这个函数会比较低效,因为每次生成一个随机数都要遍历一次历史随机数队列,而且这个队列还会越来越长。
另外可以使用go自带的profiling工具来分析程序的瓶颈。