你可以将结构字段名传递给golang中的函数吗?

时间:2015-06-11 17:24:40

标签: struct types go func

比如说你有类似的东西,试图让这个例子尽可能简单。

#!/usr/bin/env node
var http = require('http')
  , jade = require('jade')
  , static = require('node-static')
  , jadeRe = /\.jade$/
  , path = process.argv.slice(2)[0]
  , fileServer = new static.Server(path || '.')

http.createServer(function (req, res) {
  if (req.url.match(jadeRe)) {
    res.writeHead(200, {'Content-Type': 'text/html'})
    res.end(jade.renderFile('.' + req.url, {
      filename: '.' + req.url.replace(jadeRe, '')
    }))
  } else {
    req.addListener('end', function () {
      fileServer.serve(req, res)
    }).resume()
  }
}).listen(8080)

如何将字段名称或者您可以传递给函数?

type Home struct {
    Bedroom string
    Bathroom string
}

显然这不起作用......我能看到的唯一方法是使用两个函数,当struct变得非常大并且有很多相似的代码时会增加很多额外的代码。

func (this *Home) AddRoomName(fieldname, value string) {
    this.fieldname = value
}

3 个答案:

答案 0 :(得分:1)

我所知道的唯一方法是使用反射:

{{1}}

http://play.golang.org/p/ZvtF_05CE_

答案 1 :(得分:0)

我想到的另一个想法就是这样,不确定它在你的情况下是否有意义:

func Set(field *string, value string) {
    *field = value
}

home := &Home{"asd", "zxc"}
fmt.Println(home)
Set(&home.Bedroom, "bedroom")
Set(&home.Bathroom, "bathroom")
fmt.Println(home)

http://play.golang.org/p/VGb69OLX-X

答案 2 :(得分:0)

在接口值上使用类型断言:

package main

import "fmt"

type Test struct {
    S string
    I int
}

func (t *Test) setField(name string, value interface{}) {
    switch name {
        case "S":
            t.S = value.(string)
        case "I":
            t.I = value.(int)
    }
}

func main() {
    t := &Test{"Hello", 0}
    fmt.Println(t.S, t.I)
    t.setField("S", "Goodbye")
    t.setField("I", 1)
    fmt.Println(t.S, t.I)
}