golang 使用匿名结构体的问题

golang允许使用匿名结构体,形如

type Test struct {
  param1 struct {
    param2 string
  }
}

 一般在使用的时候可以直接这样初始化

a := Test{
    param1: struct{ param2 string }{param2: "test"},
}

  或者

b := new(Test)
b.param1.param2 = "test"

  

但今天遇到一种情况

匿名结构体的成员上有tag声明,形如

type Test struct {
  param1 struct {
    param2 string `json:"param2"`
  }
}

  这时使用第一种初始化方式,始终报错,说类型不匹配,查了很久,偶然情况下去掉了结构体定义中的tag声明,居然不报错了,这时反应过来,使用第一种初始化方式,必须保证跟定义完全一样,包括tag声明等

a := Test{
    param1: struct{ param2 string `json:"param2"` }{param2: "test"},
}

  这样就没问题了

最后觉得如果遇到这种匿名结构体,还是使用第二种初始化方式简洁方便。

原文地址:https://www.cnblogs.com/oliverCJ/p/10612012.html

时间: 2024-10-29 19:29:05

golang 使用匿名结构体的问题的相关文章

结构体5之匿名结构体

注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 1 //匿名结构体不会出现重名的情况 2 struct //无名结构体 3 { 4 char name[100]; 5 char phone[50]; 6 int num; 7 };//不能引用 没有任何意义 8 struct //无名结构体 9 { 10 char name[100]; 11 char phone[50]; 12 int num; 13 }a1,a2,a3; 14 //有名结构体 重名有

Golang基础之结构体

Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: // 将MyInt定义为int类型 type MyInt i

golang 服务或结构体可选参数的赋值

// 服务结构体 type Server struct { opts options //可选参数变量 addr string } //可选参数列表 type options struct { A int B string C bool D int } // 为可选参数赋值的函数 type ServerOption func(*options) func Afunc(a int) ServerOption { return func(o *options) { o.A = a } } func

Golang项目之结构体版学生管理系统

前言 学习第4天,基于结构体的方式对函数版本重构编写小项目:学生管理系统 代码 package main import ( "fmt" "os" ) // 菜单系统(将菜单系统封装到函数中) func showMenu(){ fmt.Println("欢迎光临学生管理系统") fmt.Println(` 1.查看所有学生 2.新增学生 3.删除学生 4.退出 `) } // 造一个存储学生数据的类型 type student struct{ id

Golang中函数结构体,将函数转换为接口

函数结构体,将函数转换为接口 定义一个函数类型 F,并且实现接口 A 的方法,然后在这个方法中调用自己.这是 Go 语言中将其他函数转换为接口 A 的常用技巧(参数返回值定义与 F 一致) 实现一个动态生成的"回调函数",比如缓存中,当key不存在,则需要从数据库或文件等远程数据源中取数据.所以回调函数不能写死. 采用用户自定义回调函数的方法,因此,在缓存的数据结构中,有一个成员方法变量为回调函数. 下面这段代码就是一个示例. type Getter interface { Get(k

golang 结构体笔记

一.概念 结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体.每个值称为结构体的成员. 二.结构体声明及使用 // 声明结构体 type Employee struct { ID int Name string } func main() { // 结构体实例化 emp := Employee{ID: 1, Name: "Frod"} // 匿名字段实例化 emp2 := Employee{1, "Frod2"} fmt.Println(emp) f

golang 碎片整理之 结构体

什么是结构体? 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础.结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type).在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样.因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位. 如何定义一个结构体 type Coordinate struct {

Golang 入门 : 结构体(struct)

Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和一个类型. 结构体的目的就是把数据聚集在一起,以便能够更加便捷地操作这些数据.结构体的概念在 C 语言里很常见,被称为 struct.Golang 中的结构体也是 struct.Go 语言中没有类的概念,因此在 Go 中结构体有着更为重要的地位.结构体是复合类型(composite types),当

C 入门 第七节 结构体

//声明结构体  关键字  struct // 声明一个用于描述学生对象的结构体类型// 声明成员变量时不能赋值,因为这是在声明结构体类型// struct student// {//     int num; //学号  //成员变量之间用分号;隔开//     char name[30]; //姓名  //必须指定字符数组的大小//     char sex;  //性别//     float score;  //分数// }; //不要忘了 ; // typedef struct stu