Go学习笔记—结构体、方法

Go学习笔记—结构体、方法、接口


感谢观看,如有错误,请留言指正!谢谢


1、结构体

结构体是各个字段的类型的集合。可以封装多个基本的数据类型。

type student struct{
    
    
    id int
    name string
    score int
}

使用这个语法可以创建一个新的结构体元素。

type 类型名 struct {
    
    
    字段名 字段类型
    字段名 字段类型
    …
}
  • 类型名:标识自定义结构体的名称,在同一个包内不能重复。
  • 字段名:表示结构体字段名。结构体中的字段名必须唯一。
  • 字段类型:表示结构体字段的具体类型。

上面我们定义了一个student的自定义类型,还可以定义一个person实体。

type person struct{
    
    
	name string
    age int
}

结构体实例化:

像定义变量一样,定义一个类型为结构体的变量即可。

type person struct{
    
    
	name string
	age int
}

func main(){
    
    
	var people person   //结构体实例化
	people.age = 18
	people.name = "林文"
	fmt.Println(people)
}

//{林文 18}

使用new()进行实例化操作时,会生成一个结构体指针变量。在访问结构体成员是,也可以使用.操作,但是Go语言会对指针自动解引用。

func main(){
    
    
    var p2 = new(person)
	(*p2).name = "胡玉"
	//p2.name = "文林"
	p2.age = 19
	fmt.Println(p2)
}

//&{胡玉 19}
//&{文林 19}

代码的运行结果可以看到,(*p2.name)p2.name是等效的。而且结构体成员的值是可变的。

结构体初始化:

没有初始化的结构体,其成员变量都是对应其类型的零值。

使用键值对的形式进行初始化:

//使用键值对的形式进行初始化
p3 := person{
    
    
    name:"吴林",
    age:20
}

//对结构体指针利用键值对形式进行初始化
p4 := &person{
    
    
    name:"胡林"
    age:21
}
  • 没有初始化的结构体成员变量,其对应的值是零值。

使用值列表进行初始化:

//使用值列表进行初始化
p5 := person{
    
    
    "余林",
    22
}
  • 必须初始化结构体的所有成员变量
  • 初始化值的顺序必须与字段定义的顺序相同
  • 不能和键值对混搭使用

2、方法

方法是作用于特定类型变量的函数。这种特定类型变量叫做接收者。

//语法
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
    
    
    函数体
}
  • 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是selfthis之类的命名。例如,Person类型的接收者变量应该命名为 pConnector类型的接收者变量应该命名为c等。
  • 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
  • 方法名、参数列表、返回参数:具体格式与函数定义相同。
type rect struct{
    
    
	width,height int
}

//方法,对接收者计算面积的方法
func (r *rect) area() int{
    
    
	return r.width * r.height
} //指针类型的接收者

//方法,对接收者计算周长的方法
func (r rect) perim() int{
    
    
	return 2*r.width + 2*r.height
} //值类型的接收者

//构造函数
func newRect(width,height int) rect{
    
    
	return rect{
    
    
		width: width,
		height: height,
	}
}

func main(){
    
    
	r := rect{
    
    10,4}
	fmt.Printf("面积是:%d\n",r.area())
	fmt.Printf("周长是:%d\n",r.perim())
    
	rt := newRect(5,5)
	fmt.Printf("面积是:%d\n",rt.area())
	fmt.Printf("周长是:%d\n",rt.perim())
}

猜你喜欢

转载自blog.csdn.net/weixin_46435420/article/details/119490959