青海住房和城乡建设厅网站,深圳定制网站,做网站注册商标哪一类,wordpress注册错误Golang中的结构体结构体和结构体变量(实例)的区别和联系结构体变量(实例)在内存中的布局如何声明结构体字段/属性注意事项和细节说明创建结构体实例的四种方式结构体使用细节结构体和结构体变量(实例)的区别和联系
1.结构体是自定义的数据类型#xff0c;代表一类事物2.结构体…
Golang中的结构体结构体和结构体变量(实例)的区别和联系结构体变量(实例)在内存中的布局如何声明结构体字段/属性注意事项和细节说明创建结构体实例的四种方式结构体使用细节结构体和结构体变量(实例)的区别和联系
1.结构体是自定义的数据类型代表一类事物2.结构体变量(实例)是具体的实际的代表一个具体变量
结构体变量(实例)在内存中的布局 如何声明结构体
type 结构体名称 struct{
field1 type
field2 type
}
字段/属性注意事项和细节说明
1.字段声明语法同变量2.字段的类型可以为基本类型数组或引用类型3.在创建一个结构体变量后如果没有给字段赋值都对应一个零值(默认值)指针、slice和map的零值都是nil即还没有分配空间4.不同结构体变量的字段是独立互不影响一个结构体变量字段的更改不影响另外一个
package main
import (fmt
)//不影响另外一个结构体是值类型
type Monster struct {Name stringAge int
}
func main() {var monster1 Monstermonster1.Name 牛魔王monster1.Age 500monster2 : monster1 //结构体是值类型默认为值拷贝monster2.Name 青牛精fmt.Println(monster1, monster1)fmt.Println(monster2, monster2)
}//monster1 {牛魔王 500}
//monster2 {青牛精 500} 创建结构体实例的四种方式
1.方式一—直接声明var person Person
2.方式二—{}var person Person Person{}
3.方式三—var perosn *Person new(Person)
4.方式四—{}var person *Person Person{}
package main
import (fmt
)//不影响另外一个结构体是值类型
type Person struct {Name stringAge int
}
func main() {//方式2p2 : Person{}p2.Name tomp2.Age 19fmt.Println(p2)//方式3var p3 *Person new(Person)//底层会对p3.Name smith进行处理//会给p3加上取值运算 (*p).Name Smith(*p3).Name smithp3.Name johnp3.Age 20fmt.Println(*p3)//方法四var person *Person Person{}//底层会对person.Name scott进行处理会加上(*person)//(*person).Name scottperson.Name ddd(*person).Age 44fmt.Println(*person)}/*
{tom 19}
{john 20}
{ddd 44}
*/说明- 1.第三种和第四种方式返回的是结构体指针
- 2.结构体指针访问字段的标准方式应该是( *结构体指针).字段名比如( *person).Name tom
- 3.但是go做了一个简化也支持结构体指针.字段名比如person.Name tom。go编译器底层对person.Name做了转化(*Person).Name## 结构体内存分配机制变量总是在内存中的那么结构体变量在内存中就近是怎样存在的 结构体使用细节
1.结构体的所有字段在内存中时连续的 2.结构体是用户单独定义的类型和其他类型转换时需要有完全相同的字段(名字个数和类型)
package main
import (fmt
)type A struct {Num int
}
type B struct {Num int
}
func main(){var a Avar b Ba A(b) //可以转换但是结构体的字段要完全一样(名字个数类型)fmt.Println(a,b)
}//{0} {0}
3.结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型但是相互间可以强转
4.struct的每个字段上可以写上一个tag该tag可以通过反射机制获取常见的使用场景就是序列化和反序列化 序列化使用场景 package main
import (fmtencoding/json
)type Monster struct{Name string json:name //json:name就是struct tagAge int json:ageSkill string json:string
}func main(){//创建一个MOnster变量monster : Monster{kunkun, 27, sing~}//将monster变量序列化为json格式字符串jsonStr , err : json.Marshal(monster)if err ! nil {fmt.Println(json c处理错误, err)}fmt.Println(jsonStr, string(jsonStr))
}//jsonStr {name:kunkun,age:27,string:sing~}