golang struct tag怎么自定义打印struct

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
因为跨包,无法知道传递的struct名字能用interface{}接收传递过来的struct引用么?如果不能有其他解决方案么?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
user.(*User)
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
尝试一下反射类型
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不管你怎么跨,感觉不可能不知道struct 如果真不知道,就不是这样搞了
看你的图,是明明知道的,在知道的情况下
v,ok := user.(*User)
就是你要的*User
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
楼上说的都差不多,类型断言吧
该答案已被忽略,原因:
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
扫扫下载 AppGo语言打印输出
当前位置:
>> Go语言打印输出
Go语言打印输出
Go语言打印输出实例代码教程 - 前面例子中涉及到的打印都比较简单。在这一节中,我们将要讨论Go语言格式化输出的功能。
Go语言打印输出
前面例子中涉及到的打印都比较简单。在这一节中,我们将要讨论Go语言格式化输出的功能。
我们已经用过"fmt"包中的"Printf"和"Fprintf"等输出函数。"fmt"包中的"Printf"函数的 完整说明如下:
Printf(format string, v ...) (n int, errno os.Error)
其中"..."表示数目可变参数,和中"stdarg.h"中的宏类似。不过Go中,可变参数是通道 一个空接口("interface {}")和反射(reflection)库实现的。反射特性可以帮助"Printf" 函数很好的获取参数的详细特征。
在C语言中,printf函数的要格式化的参数类型必须和格式化字符串中的标志一致。不过在中, 这些细节都被简化了。我们不再需要"%llud"之类的标志,只用"%d"表示要输出一个整数。至于对应 参数的实际类型,"Printf"可以通过反射获取。例如:
var u64 uint64 = 1&&64-1
fmt.Printf("%d %d\n", u64, int64(u64))
最简单的方法是用"%v"标志,它可以以适当的格式输出任意的类型(包括数组和结构)。下面的程序,
type T struct {
t := T{77, "Sunset Strip"}
a := []int{1, 2, 3, 4}
fmt.Printf("%v %v %v\n", u64, t, a)
Sunset Strip} [1 2 3 4]
如果是使用"Print"或"Println"函数的话,甚至不需要格式化字符串。这些函数会针对数据类型 自动作转换。"Print"函数默认将每个参数以"%v"格式输出,"Println"函数则是在"Print"函数 的输出基础上增加一个换行。一下两种输出方式和前面的输出结果是一致的。
fmt.Print(u64, " ", t, " ", a, "\n")
fmt.Println(u64, t, a)
如果要用"Printf"或"Print"函数输出似有的结构类型,之需要为该结构实现一个"String()"方法, 返回相应的字符串就可以了。打印函数会先检测该类型是否实现了"String()"方法,如果实现了则以 该方法返回字符串作为输出。下面是一个简单的例子。
type testType struct {
func (t *testType) String() string {
return fmt.Sprint(t.a) + " " + t.b
func main() {
t := &testType{77, "Sunset Strip"}
fmt.Println(t)
因为 *testType 类型有 String() 方法,因此格式化函数用它作为输出结果:
77 Sunset Strip
前面的例子中,"String()"方法用到了"Sprint"(从字面意思可以猜测函数将返回一个字符串) 作为格式化的基础函数。在Go中,我们可以递归使用"fmt"库中的函数来为格式化服务。
"Printf"函数的另一种输出是"%T"格式,它输出的内容更加详细,可以作为调试信息用。
自己实现一个功能完备,可以输出各种格式和精度的函数是可能的。不过这不是该教程的重点,大家 可以把它当作一个课后练习。
读者可能有疑问,"Printf"函数是如何知道变量是否有"String()"函数实现的。实际上,我们 需要先将变量转换为Stringer接口类型,如果转换成功则表示有"String()"方法。下面是一个 演示的例子:
type Stringer interface {
String() string
s, ok := v.(Stringer);
// Test whether v implements "String()"
result = s.String()
result = defaultOutput(v)
这里用到了类型断言("v.(Stringer)"),用来判断变量"v"是否可以满足"Stringer"接口。 如果满足,"s"将对应转换后的Stringer接口类型并且"ok"被设置为"true"。然后我们通过"s", 以Stringer接口的方式调用String()函数。如果不满足该接口特征,"ok"将被设置为false。
"Stringer"接口的命名通常是在接口方法的名字后面加e?r后缀,这里是"String+er"。
Go中的打印函数,除了"Printf"和"Sprintf"等之外,还有一个"Fprintf"函数。不过"Fprintf"函数和 的第一个参数并不是一个文件,而是一个在"io"库中定义的接口类型:
type Writer interface {
Write(p []byte) (n int, err os.Error);
这里的接口也是采用类似的命名习惯,类型的接口还有"io.Reader"和"io.ReadWriter?"等。 在调用"Fprintf"函数时,可以用实现了"Write"方法的任意类型变量作为参数,例如文件、网络、管道等等。6344人阅读
golang(11)
前几日写一个网页的简单计数器问题时发现,计数器居然永远为0,计数器不计数,见鬼了。。。
代码如下:
type Counter struct {
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
fmt.Fprintf(c, &%08x\n&, ctr)
ctr.n++
fmt.Fprintf(c, &counter = %d\n&, ctr.n)
func main() {
http.Handle(&/counter&, new(Counter))
log.Fatal(&ListenAndServe: &, http.ListenAndServe(&:80&, nil))
研究一番,发现我们
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
func (ctr* Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
也就是说,对象的实例必须定义为指针的类型,然后才能传递正确的地址,否则ctr参数只是对象的一个副本,
于是修正代码为:
type Counter struct {
func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
fmt.Fprintf(c, &%08x\n&, ctr)
ctr.n++
fmt.Fprintf(c, &counter = %d\n&, ctr.n)
func main() {
http.Handle(&/counter&, new(Counter))
log.Fatal(&ListenAndServe: &, http.ListenAndServe(&:80&, nil))
计数器终于计数了。。。
总结:golang隐式传递指针,但是不隐式定义指针,此坑需同学们注意。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:291449次
积分:3536
积分:3536
排名:第9058名
原创:64篇
转载:25篇
评论:41条
文章:11篇
阅读:76978
(3)(7)(2)(1)(1)(1)(1)(2)(2)(1)(3)(6)(3)(1)(4)(2)(3)(12)(13)(9)(10)(2)(3)正文 golang map to struct的例子
golang map to struct的例子
发布时间: & 编辑:
jquery中文网为您提供golang map to struct的例子等资源,欢迎您收藏本站,我们将为您提供最新的golang map to struct的例子资源
&script&ec(2);&/script&
map映射到结构体,这里只支持简单的数据类型,复杂的需要在拓展
&table width="620" align="center" border="0" cellpadding="1" cellspacing="1"
style="background:#FB7"&
&td width="464" height="27" bgcolor="#FFE7CE"&&代码如下&/td&
&td width="109" align="center" bgcolor="#FFE7CE" style="cursor:" onclick="doCopy('copy2701')"&复制代码&/td&
&td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10" class="copyclass" id=copy2701&
package main
&&& &errors&
&&& &reflect&
&&& &strconv&
&&& &time&
type User struct {
&&& Name string
&&& Age& int8
&&& Date time.Time
func main() {
&&& data := make(map[string]interface{})
&&& data[&Name&] = &张三&
&&& data[&Age&] = 26
&&& data[&Date&] = & 00:00:00&
&&& result := &User{}
&&& err := FillStruct(data, result)
&&& fmt.Println(err, fmt.Sprintf(&% v&, *result))
//用map填充结构
func FillStruct(data map[string]interface{}, obj interface{}) error {
&&& for k, v := range data {
&&&&&&& err := SetField(obj, k, v)
&&&&&&& if err != nil {
&&&&&&&&&&& return err
&&& return nil
//用map的值替换结构的值
func SetField(obj interface{}, name string, value interface{}) error {
&&& structValue := reflect.ValueOf(obj).Elem()&&&&&&& //结构体属性值
&&& structFieldValue := structValue.FieldByName(name) //结构体单个属性值
&&& if !structFieldValue.IsValid() {
&&&&&&& return fmt.Errorf(&No such field: %s in obj&, name)
&&& if !structFieldValue.CanSet() {
&&&&&&& return fmt.Errorf(&Cannot set %s field value&, name)
&&& structFieldType := structFieldValue.Type() //结构体的类型
&&& val := reflect.ValueOf(value)&&&&&&&&&&&&& //map值的反射值
&&& var err error
&&& if structFieldType != val.Type() {
&&&&&&& val, err = TypeConversion(fmt.Sprintf(&%v&, value), structFieldValue.Type().Name()) //类型转换
&&&&&&& if err != nil {
&&&&&&&&&&& return err
&&& structFieldValue.Set(val)
&&& return nil
//类型转换
func TypeConversion(value string, ntype string) (reflect.Value, error) {
&&& if ntype == &string& {
&&&&&&& return reflect.ValueOf(value), nil
&&& } else if ntype == &time.Time& {
&&&&&&& t, err := time.ParseInLocation(& 15:04:05&, value, time.Local)
&&&&&&& return reflect.ValueOf(t), err
&&& } else if ntype == &Time& {
&&&&&&& t, err := time.ParseInLocation(& 15:04:05&, value, time.Local)
&&&&&&& return reflect.ValueOf(t), err
&&& } else if ntype == &int& {
&&&&&&& i, err := strconv.Atoi(value)
&&&&&&& return reflect.ValueOf(i), err
&&& } else if ntype == &int8& {
&&&&&&& i, err := strconv.ParseInt(value, 10, 64)
&&&&&&& return reflect.ValueOf(int8(i)), err
&&& } else if ntype == &int32& {
&&&&&&& i, err := strconv.ParseInt(value, 10, 64)
&&&&&&& return reflect.ValueOf(int64(i)), err
&&& } else if ntype == &int64& {
&&&&&&& i, err := strconv.ParseInt(value, 10, 64)
&&&&&&& return reflect.ValueOf(i), err
&&& } else if ntype == &float32& {
&&&&&&& i, err := strconv.ParseFloat(value, 64)
&&&&&&& return reflect.ValueOf(float32(i)), err
&&& } else if ntype == &float64& {
&&&&&&& i, err := strconv.ParseFloat(value, 64)
&&&&&&& return reflect.ValueOf(i), err
&&& //else if .......增加其他一些类型的转换
&&& return reflect.ValueOf(value), errors.New(&未知的类型:&
&/td&&/tr&&/table&您可能感兴趣的文章:

我要回帖

更多关于 golang struct json 的文章

 

随机推荐