fanyang

第 6369 号会员 /

回复了 Tommy4021 创建的主题: 求助 如何用go 写一个类似 redis的 server

用map解决大部分数据类型,例如集合:

package set

type Set Struct{
    m map[interface{}]bool
}
func NewSet *Set{
    return &Set{m:make(map[interface{}]bool)}
}
func (set *Set) Add(e interface{})bool {
    if !set.m[e]{
        set.m[e]=true
        return true
    }
    return false
}
func (set *Set) Remove(e interface{}) {
    delete(set.m,e)
}
func (set *Set) Contains(e interface{})bool {
    return set.m[e]
}

回复了 netaxcess 创建的主题: golang读mysql中的null值的问题

package main

import (
    "fmt"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

func main() {
    db, err := gorm.Open("mysql", "root:mima@tcp(127.0.0.1:3306)/test?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    rows, err := db.Raw(`SELECT * from goods`).Rows()
    if err != nil {
        panic(err)
    }
    for rows.Next() {
        var (
            goods_id                     int
            goods_name, goods_desc, bref string
        )

        err = rows.Scan(&goods_id, &goods_name, &goods_desc, &bref)
        if err != nil {
            panic(err)
        }
        fmt.Println(goods_id, goods_name, goods_desc, bref)
    }
}

回复了 sax1412 创建的主题: gorm,怎么获取结果集呢?

type Table struct{
        ID  int `gorm:"column:id;primary_key"`
        Name string `gorm:"column:name"`
}

var tables []Table
query:=db.where().find(&tables)
query.Error!=nil{
    panic(query.Error)
}
fmt.Println(tables)

回复了 sax1412 创建的主题: gorm,怎么获取结果集呢?

type Table struct{
        ID  int `gorm:"column:id;primary_key"`
        Name string `gorm:"column:name"`
}

var tables []Table
query:=db.where().find(&tables)
query.Error!=nil{
    panic(query.Error)
}
fmt.Println(tables)

回复了 natars 创建的主题: 如何动态创建对象?

看到有点晚,希望帮助其他,可扩展生成任何所需文件

// test.go
package main

import (
    "encoding/xml"
    "html/template"
    "io/ioutil"
    "os"
    "os/exec"
)

type (
    Var struct {
        Name      string `xml:"name,attr"`
        Type      string `xml:"type,attr"`
        Sizelimit string `xml:"sizelimit,attr"`
    }
    Message struct {
        Name string `xml:"name,attr"`
        Vars []Var  `xml:"var"`
    }
    Xml struct {
        XMLName xml.Name `xml:"xml"`
        Message Message  `xml:"message"`
    }
)

const (
    fileName = "./message.go"
    cfgName  = "./message.xml"
    tplName  = "./message.tpl"
)

func main() {
    //解析配置文件
    cfgData, err := ioutil.ReadFile(cfgName)
    if err != nil {
        panic(err)
    }
    var x Xml
    err = xml.Unmarshal(cfgData, &x)
    if err != nil {
        panic(err)
    }
    //加载模板文件
    tplData, err := ioutil.ReadFile(tplName)
    if err != nil {
        panic(err)
    }
    msg := template.Must(template.New("message").Parse(string(tplData)))

    file, err := os.Create(fileName)
    if err != nil {
        panic(err)
    }
    defer file.Close()
    //用模板生成go文件
    err = msg.Execute(file, x)
    if err != nil {
        os.Remove(fileName)
        panic(err)
    }
    //自动格式化并且导入需要的包
    cmd := exec.Command("goimports", "-w", fileName)
    err = cmd.Run()
    if err != nil {
        os.Remove(fileName)
        panic(err)
    }
}
// message.xml
<xml>
 <message name="login">
  <var  name="username" type="string" sizelimit="32">
  </var>
  <var  name="password"  type="string" sizelimit="32">
  </var>
 </message>
</xml>
// message.tpl
package message

type message_{{.Message.Name}} struct { 
    {{range .Message.Vars}}{{.Name}} {{.Type}}
    {{end}}
}

func (m *message_{{.Message.Name}}) Read() { 
    {{range .Message.Vars}} fmt.Println(m.{{.Name}}) 
    {{end}}
}

func (m *message_{{.Message.Name}}) Write() { 
    {{range .Message.Vars}} m.{{.Name}}="hello" 
    {{end}}
}
// message.go
package message

import "fmt"

type message_login struct {
    username string
    password string
}

func (m *message_login) Read() {
    fmt.Println(m.username)
    fmt.Println(m.password)

}

func (m *message_login) Write() {
    m.username = "hello"
    m.password = "hello"

}

回复了 dyllen 创建的主题: slice的容量是怎回事?

//长度是第二个参数,容量是三个参数
test := make([]string, 10, 11)
//len计算长度,cap计算容量
fmt.Println(len(test), cap(test))//10 11
//使用append追加元素会存放到空闲区域
test = append(test, "h")
fmt.Println(len(test), cap(test))//11 11
//如果超出容量值将扩展容量为原值*2
test = append(test, "h")
fmt.Println(len(test), cap(test))//12 22

回复了 samete 创建的主题: go死锁的问题

Q:为什么打印的结果是0 1 2 3 4 ?
A:c := <-ch1每次从通道里取出一个数,len(ch1)就会减1,当j=5, len(ch1)=5