
文章插图
Golang的匿名结构是什么?匿名结构就像普通结构一样,但是它没有名称定义,因此不能在代码的其他地方引用 。Go中的结构类似于C等其他语言中的结构 。它们是字段的类型化集合,用于将数据分组在一起,以使我们作为程序员更易于管理 。要创建匿名结构,只需在声明类型后立即实例化实例:
newCar := struct {make stringmodel stringmileage int}{make: "Ford",model: "Taurus",mileage: 200000,}将其与创建结构的“常规”方式进行对比:// declare the 'car' struct typetype car struct {make stringmodel stringmileage int}// create an instance of a carnewCar := car{make: "Ford",model: "taurus",mileage: 200000,}什么时候应该使用匿名结构?【匿名结构在golang中的妙用】我经常使用匿名结构在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处理程序 。他们提供的强类型输入同时仍是“一次性”解决方案,是一个强大的工具 。推荐阅读
- 在windows下搭建可以外网访问的ftp服务,支持在线播放
- 心脏病有什么前兆
- 明朝官员俸禄相当于现在多少钱 明朝官员的俸禄工资收入表
- 东汉天文学家张衡在其著作 张衡是我国汉代著名的天文学家
- 西装|辣目洋子教你玩转西装穿搭,微胖女生这样穿也能在职场脱颖而出
- 春节在宋代被称为什么 北宋年间每逢过年过节
- 老人被飞来轮胎砸伤怎么办
- 老人经常头晕吃什么好
- 老年人突然头晕出冷汗是怎么了?
- 老年人胃酸烧心怎么办
