匿名结构在golang中的妙用

欢迎加入go语言学习交流群:636728449

Golang的匿名结构是什么?

匿名结构就像普通结构一样,但是它没有名称定义,因此不能在代码的其他地方引用。Go中的结构类似于C等其他语言中的结构。它们是字段的类型化集合,用于将数据分组在一起,以使我们作为程序员更易于管理。要创建匿名结构,只需在声明类型后立即实例化实例:

newCar := struct {
	make    string
	model   string
	mileage int
}{
	make:    "Ford",
	model:   "Taurus",
	mileage: 200000,
}

将其与创建结构的“常规”方式进行对比:

// declare the 'car' struct type
type car struct {
	make    string
	model   string
	mileage int
}

// create an instance of a car
newCar := car{
	make:    "Ford",
	model:   "taurus",
	mileage: 200000,
}

什么时候应该使用匿名结构?

我经常使用匿名结构在HTTP处理程序中封装和解封JSON数据。如果一个结构只打算被使用一次,那么以这样一种方式声明它是有意义的,即使得开发人员不会试图再次使用它。看下面的代码。我们能够将HTTP请求直接解析到newCar结构中,而无需给结构命名。仍然可以通过点运算符访问所有字段,但是我们不必担心项目的另一部分尝试使用非预期类型。

func createCarHandler(w http.ResponseWriter, req *http.Request) {
	defer req.Body.Close()
	decoder := json.NewDecoder(req.Body)
	newCar := struct {
		Make    string `json:"make"`
		Model   string `json:"model"`
		Mileage int    `json:"mileage"`
	}{}
	err := decoder.Decode(&newCar)
	if err != nil {
		log.Println(err)
		return
	}
	makeCar(newCar.Make, newCar.Model, newCar.Mileage)
	return
}

map[string]interface{}如果可以避免,请不要用于JSON数据。

我经常看到使用map[string]interface{},而不是声明用于JSON解组的快速匿名结构。在大多数情况下,这是很糟糕的,原因如下:

  1. 没有类型检查。如果客户端发送称为“Model”的密钥作为bool,但应该是string,则解析到map中将无法捕获错误
  2. map是模糊的。解析数据后,我们被迫使用运行时检查来确保我们关心的数据存在。如果这些检查不彻底,则可能导致抛出nil指针取消引用panic。
  3. map[string]interface{}很冗长。深入研究map并不像使用点运算符访问命名字段那样简单newCar.model。相反,它类似于:
func createCarHandler(w http.ResponseWriter, req *http.Request) {
	myMap := map[string]interface{}{}
	decoder := json.NewDecoder(req.Body)
	err := decoder.Decode(&myMap)
	if err != nil {
		log.Println(err)
		return
	}
	model, ok := myMap["model"]
	if !ok {
		fmt.Println("field doesn't exist")
		return
	}
	modelString, ok := model.(string)
	if !ok {
		fmt.Println("model is not a string")
	}
	// do something with model field
}

如果使用正确,匿名结构可以简化您的API处理程序。他们提供的强类型输入是一个强大的工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值