Go每日一题 今日(2025-03-28) 的题目如下

4523 次点击 · 4 赞 ·大约8小时之前 开始浏览   · 来源「公众号「polarisxu」」

以下代码输出什么?

package main

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

func main() {
	t := struct {
		time.Time
		N int
	}{
		time.Date(2020, 12, 20, 0, 0, 0, 0, time.UTC),
		5,
	}

	m, _ := json.Marshal(t)
	fmt.Printf("%s", m)
}

A:{"Time": "2020-12-20T00:00:00Z", "N": 5};B:"2020-12-20T00:00:00Z";C:{"N": 5};D:<nil>

4523 阅读
63 回复
flyZ
flyZ · #51 · 2年之前

make

YuPeng
YuPeng · #52 · 2年之前

mark 前些天好像出过一个类似的

hupeng
hupeng · #53 · 2年之前

mark

xiaoyugogogo
xiaoyugogogo · #54 · 2年之前

time.Time 内部实现过 Marshaler 接口,并且是直接内嵌类型,因此结构体 t 自动实现了 Marshaler 接口

TimLiuDream
TimLiuDream · #55 · 2年之前

mark

cherGou
cherGou · #56 · 2年之前

基础。

BigBigGopher
BigBigGopher · #57 · 大约1年之前

mark

brothersam
brothersam · #58 · 大约1年之前

B, N have no json:"n"

a406299736
a406299736 · #59 · 大约1年之前

mark

BigBigGopher
BigBigGopher · #60 · 大约1年之前

t里面还有个N呀,也是大写的,为啥没导出呢?,json.Marshal 函数优先调用 MarshalJSON,然后是 MarshalText,如果都没有,才会走正常的类型编码逻辑。是因为time.Time有MarshalJson,所有不调用正常的类型编码逻辑了吗?求大佬解答

1174en
1174en · #61 · 大约1年之前

m

Qmfuser
Qmfuser · #62 · 大约1年之前

mark

BigBigGopher
BigBigGopher · #63 · 11月之前

time.Time 内部实现过 Marshaler 接口,并且是直接内嵌类型(内嵌模拟继承)所以t直接继承了time的 Marshaler 接口,相当于结构体 t 自动实现了 Marshaler 接口,time的Marshaler接口只会解析time字段,因此N不会被导出

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传