Golang 结构体

在 Golang 中没有 class,使用 struct 实现 class 的思想

1. 结构体的定义和初始化

  • 结构体定义: type 结构体名称 struct {}
  • 结构体初始化
import "fmt"

// 定义一个学生信息的结构体
type Student struct {
	id      int
	name    string
	age     int
	sex     int
	score   float32
	address string
}

func main() {
	// 1. 初始化对象
	s1 := Student{1, "zs", 18, 0, 99.8, "bj"}
	fmt.Println(s1)

	// 2. 指定几个字段赋值(其他未指定的值则使用指定类型的默认值)
	s2 := Student{id: 2, name: "ls"}
	fmt.Println(s2)

	// 3. 先定义再初始化
	var s3 Student
	s3.id = 3
	s3.name = "ww"
	fmt.Println(s3)

	// 4. 结构体作为指针变量初始化
	var s4 *Student = &Student{4, "ll", 20, 1,68.9, "sh"}
	fmt.Println(s4)

	// s4.name也可以,go会自动转为(*s4).name
	fmt.Println((*s4).name)
	fmt.Println(s4.name)

	// 5. :=
	s5 := &Student{5, "lh", 20, 1,68.9, "sz"}
	fmt.Println(s5)
}

2. 结构体参数

结构体作为函数的参数传递(值和指针传递不一样)

package main

import "fmt"

// 定义一个学生信息的结构体
type Student struct {
	id      int
	name    string
	age     int
	sex     int
	score   float32
	address string
}

// 结构体值传递
func test001(stu Student) {
	stu.name = "hhhhhh"
	fmt.Println("值传递", stu)
}

// 结构体指针传递
func test002(stu *Student) {
	stu.name = "dddddd"
	fmt.Println("指针传递", stu)

}

func main() {
	// 1. 初始化对象
	stu := Student{1, "zs", 18, 0, 99.8, "bj"}
	fmt.Println("外部", stu)

	// 值传递(不会修改原来的结构体)
	test001(stu)
	fmt.Println("外部,值传递", stu)

	// 指针传递,会修改原来的结构体
	test002(&stu)
	fmt.Println("外部,指针传递", stu)
}

3. 结构体内存结构

一个结构体,会占用一段连续的内存空间

package main

import "fmt"

type st struct {
	a int32
	b int32
	c int32
	d int32
	e int32
}

func main() {
	var st01 st

	fmt.Printf("a->addr: %p\n", &st01.a)
	fmt.Printf("b->addr: %p\n", &st01.b)
	fmt.Printf("c->addr: %p\n", &st01.c)
	fmt.Printf("d->addr: %p\n", &st01.d)
	fmt.Printf("e->addr: %p\n", &st01.e)
}

// 输出结果
/* 同类型可以看出每个值之间的内存地址是连续的(相隔4个)
a->addr: 0xc0000a0000
b->addr: 0xc0000a0004
c->addr: 0xc0000a0008
d->addr: 0xc0000a000c
e->addr: 0xc0000a0010
 */

4. 构造函数

  • go 语言中没有构造函数,但可以自己去实现
  • 构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值
package main

import "fmt"

// 定义一个用户的结构体
type User struct {
	id   int
	name string
	age  int
}

// 模拟一个构造函数, 返回一个初始化后的指针对象
func NewUser(id int, name string, age int) *User {
	user := new(User)
	user.id = id
	user.name = name
	user.age = age
	return user
}

func main() {
	// 初始化一个user
	user001 := NewUser(1, "zs", 18)
	fmt.Println(user001)
}
posted @ 2020-03-17 13:18  ZhiChao&  阅读(388)  评论(0编辑  收藏  举报