Golang - struct


定义

  • 理解为"类"
  • 值类型

示例

package main

import "fmt"

// struct 定义结构体, 类似python中的类, 值类型
type student struct { // 首字母大写才外部可见
	name  string
	age   int
	score int
}

// 构造函数, 这里实际上和结构体没有关系, 只是通过函数实例化一个结构体 
func newStudent(name string, age, score int) *student {
	return &student{
		name:  name,
		age:   age,
		score: score, // 逗号必不可少
	}
}

// 结构体的方法, 需要用 (s *stu) 声明了接收的结构体, s为约定俗称的写法
func (s *stu) printScore() {
	fmt.Println(s.score)
}

func main() {
	// 实例化
	stu1 := newStu("Tim", 18, 100)

	// 取值
	fmt.Println(stu1.name, stu1.age, stu1.score)

	// 调用结构体方法
	stu1.printScore()
}


实例化的几种写法

package main

import "fmt"

type stu struct {
	name  string
	age   int
	score int

func main() {
	// 方法 1
	p1 := stu{} // 没有赋值, 结构体内所有的值都为零值
	fmt.Println(p1)

	// 方法 2
	p2 := new(stu)
	// 方法 3
	p3 := &stu{}
	fmt.Println(p2, p3) // 得到的都是指针

	// 值类型: 初始化 = 实例化+赋值
	stu2 := stu{
		name:  "a",
		score: 100, // 由于声明了 key, 所以可以不按顺序
		age:   18,
	}
	fmt.Println(stu2)

	stu3 := stu{
		"a",
		19,
		120,
	}
	fmt.Println(stu3)
}


指针接收者和值接收者

  • 当需要修改结构体内部属性的时候, 方法使用指针接收者
  • 只需要取值的之后, 方法可以使用值接收者
package main

import "fmt"

type stu struct {
	name  string
	score int
}

// 值接收者, 适用于单纯取值
func (s stu) getScore() {
	fmt.Println(s.score)
}

// 指针接收者, 适用于需要修改结构体的内部属性时使用
func (s *stu) setScore(newScore int) {
	s.score = newScore
}

func main() {
	stu1 := stu{name: "Tim", score: 100}

	// 得到成绩
	stu1.getScore()

	// 更改成绩
	stu1.setScore(99)
	fmt.Println(stu1.score)
}


结构体的其他用法

嵌套结构体

package main

import "fmt"

type address struct {
	country string
	city    string
}

type person struct {
	name string
	age  int
	addr address
}

func main() {
	p1 := person{
		name: "Tim",
		age:  22,
		addr: address{
			country: "中国",
			city:    "北京",
		},
	}

	fmt.Println(p1.addr.city) // 必须一层一层找
}


嵌套匿名结构体

package main

import "fmt"

type address struct {
	country string
	city    string
}

type person struct {
	name string
	age  int
	address
}

func main() {
	p1 := person{
		name: "Tim",
		age:  22,
		address: address{
			country: "中国",
			city:    "北京",
		},
	}

	// 可以使用完整的, 也可以使用简写
	fmt.Println(p1.address.city)
	fmt.Println(p1.city) // city 在上一层必须没有
}


结构体的继承

package main

import "fmt"

// animal 结构体
type animal struct {
	name string
}

// 结构体方法
func (a animal) sayHi() {
	fmt.Println("动物")
}

// bird 结构体
type bird struct {
	fly bool
	// 这样就表示继承了 animal 的属性和方法
	animal
}

// 结构体方法
func (b bird) sayHi() {
	fmt.Println("鸟类")
}

func main() {
	bee := bird{
		fly: true,
		animal: animal{
			name: "大黄蜂",
		},
	}

	// 若方法名相同要进到对应类中执行
	bee.sayHi()
	bee.animal.sayHi()
}


匿名结构体

package main

// 并不推荐的一种写法

import "fmt"

type cat struct {
	name string
	int // 未声明属性名, 只声明了类型, 这种没有属性名的类型不可重复出现
	bool
}

func main() {
	c1 := cat{name: "Tim", int: 3, bool: true}

	fmt.Println(c1)
}


证明: 结构体中属性的内存布局

package main

import "fmt"

// 结构体占用连续内存空间
func main() {
	type test struct {
		a int16
		b int16
		c int16
	}
	var t = test{
		a: 1,
		b: 2,
		c: 3,
	}
	fmt.Println(&(t.a)) // 0xc000096000
	fmt.Println(&(t.b)) // 0xc000096001
	fmt.Println(&(t.c)) // 0xc000096002
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值