Golang struct结构
结构struct
- Go中的struct与C中的struct非常相似,并且Go没有class,代替了class的位置,但并没有代替class的功能
- 使用type struct{} 定义结构,名称遵循可见性规则
- 支持指向自身的指针类型成员
- 支持匿名结构,可用作成员或定义成员变量
- 匿名结构也可以用于map的值
- 可以使用字面值对结构进行初始化
- 允许直接通过指针来读写结构成员
- 相同类型的成员可进行直接拷贝赋值
- 支持==与!=比较运算符,但不支持>或<
- 支持匿名字段,本质上是定义了以某个类型名为名称的字段
- 嵌入结构作为匿名字段看起来像继承,但不是继承
- 可以使用匿名字段指针
- tag是结构体的元信息,可以在运行的时候通过反射机器读取出来;字段类型的后面,以反引号扩起来的key-value结构的字符串,多个tag以逗号隔开。
结构的定义
package main
import (
"fmt"
)
type Person struct { //结构也是一中类型
Name string //定义struct的属性
Age int
}
func main() {
a := Person{}
a.Name = "joe" //对struct的属性进行操作,类型与class的使用方法
a.Age = 19
fmt.Println(a)
}
字面值初始化
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
a := Person{
Name: "jack",
Age: 19, //对结构的属性进行字面值的初始化
}
fmt.Println(a)
}
结构的传递
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
a := Person{
Name: "jack",
Age: 19, //对结构的属性进行字面值的初始化
}
fmt.Println(a)
A(a)
fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per Person) {
per.Age = 13
fmt.Println("A", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
{jack 19}
A {jack 13}
{jack 19}
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
a := Person{
Name: "jack",
Age: 19, //对结构的属性进行字面值的初始化
}
fmt.Println(a)
A(&a)
fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
per.Age = 13
fmt.Println("A", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
{jack 19}
A &{jack 13}
{jack 13}
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
a := &Person{
Name: "jack",
Age: 19, //此时初始化的时候就将这个struct的指针取出来
}
//在进行struct的初始化的时候,就加上&取地址符号
fmt.Println(a)
A(a)
B(a)
fmt.Println(a) //结构也是一种值类型,对它进行传递的时候,也是进行了值得拷贝
}
func A(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
per.Age = 13
fmt.Println("A", per)
}
func B(per *Person) { //通过一个指针进行传递,此时就不是值得拷贝了
per.Age = 15
fmt.Println("B", per)
}
PS G:\mygo\src\mytest> go run .\temp.go
&{jack 19}
A &{jack 13}
B &{jack 15}
&{jack 15}
匿名结构
package main
import (
"fmt"
)
func main() {
a := &struct { //匿名结构,需要先对结构本身进行一个定义
Name string
Age int
}{
Name: "jack",
Age: 20,
}
fmt.Println(a)
}
匿名结构的嵌套
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
Contact struct {
Phone, City string //匿名结构嵌套在Person中
}
}
func main() {
a := Person{Name: "Jack", Age: 20}
a.Contact.Phone = "123321" //通过这种方法对嵌套在Person中的匿名结构进行字面值的初始化
a.Contact.City = "BeiJing"
fmt.Println(a)
}
PS G:\mygo\src\mytest> go run .\temp2.go
{Jack 20 {123321 BeiJing}}
匿名字段
package main
import (
"fmt"
)
type Person struct {
string //匿名字段 在进行字面值初始化的时候 必须严格按照字段声明的顺序
int
}
func main() {
a := Person{"Jack", 20} //此时将string 和 int类型对调的时候就会报错
fmt.Println(a)
}
结构相同类型的比较
package main
import (
"fmt"
)
type Person struct {
Name string
Age int
}
func main() {
a := Person{Name: "Jack", Age: 20}
b := Person{Name: "Jack", Age: 20}
fmt.Println(a == b)
}
PS G:\mygo\src\mytest> go run .\temp3.go
true
嵌入结构
package main
import (
"fmt"
)
type human struct {
Sex int
}
type teacher struct {
human
Name string
Age int
}
type student struct {
human //这里的human也是一种类型,此时它相当于一种匿名字段,嵌入结构作为匿名字段的话
//它本质上是将结构名称作为我们的字段名称
Name string
Age int
}
func main() {
a := teacher{Name: "Jack", Age: 20, human: human{Sex: 0}} //因此我们需要在这里进行这种初始化
b := student{Name: "Tom", Age: 19, human: human{Sex: 1}}
a.Name = "Fack"
a.Age = 13
a.human.Sex = 100 //保留这种调用的方法,是因为会涉及到名称的冲突
//a.Sex = 101 这种写法也是可以的
fmt.Println(a, b)
}
PS G:\mygo\src\mytest> go run .\temp3.go
{{100} Fack 13} {{1} Tom 19}
tag的详解
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Username string `json:"username"`
Sex string `json:"sex"`
Age int
AvatarUrl string
}
func main() {
user := &User{
Username: "user01",
Sex: "男",
Age: 18,
AvatarUrl: "http://xxx.xxx.com/xxx.png",
}
data, _ := json.Marshal(user)
fmt.Printf("json str:%s\n", string(data))
}
Golang struct结构的更多相关文章
- golang struct结构体初始化的几种方式
type User struct { Id int `json:"id" orm:"auto"` // 用户名 Username string `json:&q ...
- Golang 入门 : 结构体(struct)
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型.试图表示一个现实世界中的实体. 结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和 ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
- golang struct
ex1 /* https://golangbot.com/structs/ struct 结构 结构就是一组字段. */ package main import "fmt" // ...
- Golang Struct 声明和使用
Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...
- go struct结构体
struct结构体 用来自定义复杂数据结构 struct里面可以包含多个字段(属性),字段可以是任意类型 struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以 ...
- [Golang] struct Tag说明
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...
- golang(07)结构体介绍
golang支持面向对象的设计,一般支持面向对象的语言都会有class的设计,但是golang没有class关键字,只有struct结构体.通过结构体达到类的效果,这叫做大成若缺,其用不弊. stru ...
- 3.11 Go Struct结构体
3.11 Go Struct结构体 Golang支持OOP面向对象编程. Go的结构体struct如同python的class. Go基于struct实现OOP特性,只有组合composition这个 ...
随机推荐
- BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案
BZOJ_3613_[Heoi2014]南园满地堆轻絮_二分答案 Description 小 Z 是 ZRP(Zombies’ Republic of Poetry,僵尸诗歌共和国)的一名诗歌爱好者, ...
- BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...
- Java线程同步锁
把synchronized当作函数修饰符时,示例代码如下: Public synchronized void method(){ //-. } 这也就是同步方法,那这时synchronized锁定的是 ...
- 安卓开发笔记(三十一):shape标签下子类根结点的具体使用
在我的上一篇博文当中阐述了我们如何使用shape标签进行自定义控件,这里对shape控件的属性进行阐述,不知道如何使用这些属性的可以参见我的上一篇博文(自定义Button):https://www.c ...
- TiDB show processlist命令源码分析
背景 因为丰巢自去年年底开始在推送平台上尝试了TiDB,最近又要将承接丰巢所有交易的支付平台切到TiDB上.我本人一直没有抽出时间对TiDB的源码进行学习,最近准备开始一系列的学习和分享.由于我本人没 ...
- k8s实践 - 如何优雅地给kong网关配置证书和插件。
前言 从去年上半年微服务项目上线以来,一直使用kong作为微服务API网关,整个项目完全部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准 ...
- sau交流学习社区第三方登陆github--oauth来实现用户登录
sau交流学习社区第三方登陆github--oauth来实现用户登录 最近在丰富nodejsBlog开发的“交流学习社区”(https://www.mwcxs.top)的其他功能以及修复一些bug. ...
- python中的shutil模块
目录 python中的shutil模块 目录和文件操作 归档操作 python中的shutil模块 shutil模块对文件和文件集合提供了许多高级操作,特别是提供了支持文件复制和删除的函数. 目录和文 ...
- 『取巧』VS2015试用期过后 继续试用
背景: 个人电脑 安装的 VS2015 Community 社区版. 一直用得挺好,都忘了要登录. 直到近来,30天试用期过 —— VS弹窗:要登录用户名.密码 才能继续使用. 但是,输入了无数次 邮 ...
- hashCode()方法以及集合中Set的一些总结
一.前言 本篇文章没有什么主题,就是一些零散点的总结.周末没事看了几道蚂蚁金服的面试题,其中有好几道都是特别简单的,基础性的题目,就是我们平时用到的,但是发现要是完全说出来还是有一些不清楚的地方,所以 ...