【go语言学习笔记】结构体

1.结构体的定义

go语言中,结构体的声明非常类似c语言,具体定义方法如下:

初始化方法有三种:

  • 顺序初始化,每个变量都必须初始化
  • 部分成员初始化,未初始化的变量被赋值成0
  • 结构体指针变量初始化
package main

import "fmt"

// 定义一个结构体类型
type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	//1.顺序初始化,每个变量都必须初始化
	var s1 Student = Student{1, "mike", 'm', 18, "北京"}
	fmt.Println("s1 = ", s1)

	//2.部分成员初始化,未初始化的变量被赋值为0
	s2 := Student{name: "xiaoming", addr: "上海"}
	fmt.Println("s2 = ", s2)

	//3.结构体指针变量初始化
	var p1 *Student = &Student{name: "lihua", addr: "广州"}
	fmt.Println("*p1 = ", *p1)
	//使用自动推导类型
	fmt.Printf("p1 type is %T\n", p1)
}

2.结构体的比较和赋值

这里的比较和赋值类似数组的比较和赋值,只有同类型才能比较和赋值,比较只能使用==来比较相等或不相等。

package main

import "fmt"

type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	s1 := Student{1, "mike", 'm', 18, "bj"}
	s2 := Student{1, "mike", 'm', 18, "bj"}
	s3 := Student{2, "mike", 'm', 18, "bj"}
	fmt.Println("s1 == s2", s1 == s2)
	fmt.Println("s1 == s3", s1 == s3)

	// 同类型结构体变量可以相互赋值
	var tmp Student
	tmp = s3
	fmt.Println(tmp)
}

3.结构体成员的使用

这里对结构体成员的使用类似c语言,使用.运算符操作。

package main

import "fmt"

type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	var s Student

	//操作成员需要使用(.)运算符
	s.id = 1
	s.name = "mike"
	s.age = 18
	s.addr = "北京"
	fmt.Println("s = ", s)
}

4.结构体指针的操作

这里对结构体指针的操作并不是用->,而是继续使用.操作符,也就是说,假设p1为结构体指针,那么,p1.name(*p1).name这两种方式完全等价。

我们还可以使用new函数来定义一个结构体,new函数返回的是一个结构体指针。

package main

import "fmt"

type Student struct {
	id   int
	name string
	sex  byte
	age  int
	addr string
}

func main() {
	//1.指针有合法指向后,才能操作成员
	//先定义一个普通结构变量
	var s Student
	var p1 *Student
	p1 = &s

	//go语言中没有->运算符,下面两种写法等价
	p1.id = 18
	(*p1).name = "mike"
	p1.addr = "北京"
	fmt.Println("p1 = ", p1)

	// 通过new申请一个结构体
	p2 := new(Student)
	p2.id = 1
	p2.name = "mike"
	p2.age = 18
	p2.sex = 'm'
	p2.addr = "北京"
	fmt.Println("p2 = ", p2)
}

发布了128 篇原创文章 · 获赞 20 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u011544909/article/details/95167154