GO语言基础语法之结构体(第十六天)

Go 语言结构体

与C语言类似,Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。

定义和C有些许差异,c中涉及 typedef (自定义类型) struct,有类型名和标签名概念。

GO语言中结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。

  1. 结构体的格式如下:

type struct_va struct {
data1
data2

datan
}

  1. go语言结构体初始化
package main

import "fmt"

type school struct {
	students string
	teacher  string
	leader   string
	id       int
}

func main() {

	// 创建一个新的结构体
	fmt.Println(school{"LiHua", "LSL", "enheng", 1})

	// 也可以使用 key => value 格式
	fmt.Println(school{students: "XiaoMing", teacher: "LSL", leader: "enhang", id: 2})

	// 忽略的字段为 0 或 空
	fmt.Println(school{students: "Xioahong", teacher: "LSL"})
}

API server listening at: 127.0.0.1:43363
{LiHua LSL enheng 1}
{XiaoMing LSL enhang 2}
{Xioahong LSL  0}
Process exiting with code: 0
  1. 3.struct定义的三种形式

type Student struct {
Name string
age int
}
对于上面这个结构体,我们定义的三种方式有:

var stu student
var stu *Student = new(Student)
var stu *Student = &Student

序列化

struct中的tag,我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,json序列化和反序列化

package main

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name string
	Age  int
}

func main() {
	var stu Student
	stu.Name = "Liming"
	stu.Age = 23

	data, err := json.Marshal(stu)
	if err != nil {
		fmt.Printf("json marshal fail fail error:%v", err)
		return
	}
	fmt.Printf("json data:%s\n", data)
}

API server listening at: 127.0.0.1:41758
json data:{"Name":"Liming","Age":23}
Process exiting with code: 0

结构体的比较

可以使用==或!=运算符进行比较,比较两个机构体的每个成员

匿名字段

结构体中字段可以没有名字,匿名字段的用于功能类似C++ java 的功能(继承)

package main

import (
	"fmt"
)

type People struct {
	Name string
	Age  int
}

type Student struct {
	People
	Score int
}

func main() {
	var s Student
	/*
	   s.People.Name = "tome"
	   s.People.Age = 23
	*/
	//上面注释的用法可以简写为下面的方法
	s.Name = "tom"
	s.Age = 23

	s.Score = 100
	fmt.Printf("%+v\n", s)
}

API server listening at: 127.0.0.1:25154
{People:{Name:tom Age:23} Score:100}
Process exiting with code: 0

结构体指针

你可以定义指向结构体的指针类似于其他指针变量,格式如下:
var struct_pointer *Books
以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:
struct_pointer = &Book1
使用结构体指针访问结构体成员,使用 “.” 操作符:
struct_pointer.title

package main

import (
	"fmt"
)

type Point struct {
	X float64
	Y float64
}

func (p *Point) ScaleBy(factor float64) {
	p.X *= factor
	p.Y *= factor
}

func main() {
	//两种方法
	//方法1
	r := &Point{1, 2}
	r.ScaleBy(2)
	fmt.Println(*r)

	//方法2
	p := Point{1, 2}
	pptr := &p
	pptr.ScaleBy(2)
	fmt.Println(p)

	//方法3
	p2 := Point{1, 2}
	(&p2).ScaleBy(2)
	fmt.Println(p2)

	//相对来说方法2和方法3有点笨拙
	//方法4,go语言这里会自己判断p是一个Point类型的变量,
	//并且其方法需要一个Point指针作为指针接收器,直接可以用下面简单的方法
	p3 := Point{1, 2}
	p3.ScaleBy(2)
	fmt.Println(p3)

}

API server listening at: 127.0.0.1:48540
{2 4}
{2 4}
{2 4}
{2 4}
Process exiting with code: 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值