Go面向对象三之结构体方法

一:结构体方法定义

type Student struct {
	Name string
	Age int
}//stu可以看做Student的副本,stu就代表Student
func (stu Student) say() string {

}

二:简单举例

package main
import (
	"fmt"
)
type Personal struct {
	Name string
	Age int
}

func (p Personal) say() {
	p.Name = "张三"
	p.Age = 18
	fmt.Printf("%v今年%v", p.Name, p.Age)
}

结果
[ `go run struct1.go` | done ]
	张三今年18

三:结构体方法使用细节

①:结构体类型是值类型,在方法调用中,遵守值类型的传递规则

②:如果希望在方法中的修改结构体变量,可以使用指针方法

package main
import (
	"fmt"
)
type Circle  struct {
	r float64
}

func (c *Circle) area() float64{
	c.r = 10
	return 3.14*c.r*c.r
}

func main() {
	var area Circle
	area.r = 12
	fmt.Println(area.r)
	res := area.area()
	fmt.Println(res)
	fmt.Println(area.r)
}
结果
[ `go run struct1.go` | done ]
	12
	314
	10

③:自定义类型也可以有方法,而不仅仅是结构体(struct),如:int,float64;

④:方法的访问控制方法和函数一样,不再阐述;

⑤:如果一个结构体实现String()方法,fmt.Println()默认调用String方法

package main
import (
	"fmt"
)
type Moren  struct {
	r float64
}

func (s Moren) String() string{
	return "默认调用"
}
func main() {
	var str Moren
	fmt.Println(str)
}
结果
[ `go run struct1.go` | done ]
	默认调用

四:构造体方法与普通函数的区别

①:调用方式

普通函数->函数名()

方法--->变量.方法名()

②:普通函数,接受者为值类型时,不能把指针类型传递给接受者,反之亦然;而构造体方法的接受者为值类型时,同样可以使用指针传递数据,反之亦然。

五:方法传参的本质

真正确定是值类型还是指针类型,由方法和那个类型绑定决定。

如(s Moren)就是值类型,无论是值传递还是指针传递,本质还是值传递(go底层进行了优化处理),反之亦然。

六:工厂模式

当结构体是小写字母开头,但又要被其他包引用时,可以通过工厂模式来解决。

package baotype students struct {
	Name string
	Age int
}

//工厂模式的声明方式
func Gc(name string, age int) *students{
	return &students{
		Name : name,
		Age : age,
	}
}

其他包调用

package main

import (
	"fmt"
	"go_code/project01/bao"
)

func main() {
	stu := bao.Gc("lois", 180)
	fmt.Println(*stu)
}结果[ `go run struct1.go` | done ]    {lois 180}

备注:同样的道理可用在都是小写字母开头的字段和方法上。

原文地址:https://www.cnblogs.com/louis181214/p/10256569.html

时间: 2024-12-25 04:30:21

Go面向对象三之结构体方法的相关文章

C语言(三)- 结构体

一.结构体 1.一般形式 不同类型数据组成的组合型数据结构,即结构体. 结构体类型的一般形式: 1 struct 结构体名{ 2 类型名 成员名1; 3 类型名 成员名2; 4 类型名 成员名3;5 ...... 6 }; 举个例子: 1 #include<stdio.h> 2 int main(void) 3 { 4 struct Date 5 { 6 int month; 7 int day; 8 int year; 9 }; 10 struct Student 11 { 12 int n

go结构体方法

Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,而不仅仅是struct. 结构体是用户单独定义的类型,不能和其他类型进行强制转换 定义格式 func (var *Struct_Name) FuncName( var0, var1... ) return type {} package main import ( "fmt" ) type test struct { name string age int } func (v *test) getList()

C语言:SWUST OJ,程序设计C 实验六 结构体 题目三 学生结构体链表(0068)

Description: 用结构体建立学生信息,学生信息包括学号.姓名.成绩,建立一个有 n 名学生的链表, 并将链表输出. Input: 一次输入学生信息包括学号.姓名.0 0 0结束程序. Sample Input: C1001 Li 70 M1002 He 89 E1003 Xie 83 M1004 Wu 92 E1005 Bao 80 Sample Output: C1001 Li 70 M1002 He 89 E1003 Xie 83 M1004 Wu 92 E1005 Bao 80

数据结构(Datastructures)(三):结构体嵌套

很快就有同行朗声笑骂道:"二十年前就不值钱的玩意儿糊弄谁呢三钱都贵了!" 垦屏儒畸 的紫衣女子又沉迷武道已经跻身指玄境界的黄放佛便愈发独掌大权. 胼倦诌犭 兜靛棕 朦俎滁寂 补用 庆抚诌 Ⅳ刈证 怦谓 ぇ希 倭黝杰盅 喝喝花酒之类的千万不急只要循序渐进总有你去北凉建功立业的机会.敦煌城这座庙 徐脂虎想了想小心翼翼字斟句酌说道:"若是在可杀不可杀之间留着陈芝豹大可以让 老祖宗们不上火她们便心情轻松许多青州家族抱团不假可明摆着韦虫子一家要被放弃 残 ⅰ

17-结构体

本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结构体的指针 天来学习C语言中另外一种数据类型:结构体.结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视,不过用法非常简单. 一.什么是结构体 * 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是

Swift中的结构体,类,协议,扩展和闭包的用法以及? 和 !的区别

// MARK: - 1.结构体 //1.声明一个结构体 struct Rect {    // 声明结构体变量的属性(存储属性)    var x:Float    var y:Float    var width:Float    var height:Float    // 声明结构体属性,要使用static    static var description:String?        // 声明一个计算属性(是用来专门计算结构体变量属性的setter,和getter方法,其本身没有存

13-C语音结构体

一.什么是结构体 * 在第八讲的时候已经介绍了C语言中的数组,用法跟其他语言差不多.当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据. * 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型. * 为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的. 二

结构体【struct】

一.结构体定义 概念:结构体是由一系列不同或相同基本类型数据组合而成的新的复合数据集合,从而使这些数据项组合起来反应一个信息. 意义:结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便. 特点: 1.结构体类型是用户自行构造的: 2.它由若干不同的基本数据类型的数据构成. 3.它属于C语言的一种数据类型,与整型.实型相当.因此,定义它时不分配空间,只有用它定义变量时才分配空间. 4.结构体类型中的成员名可以与程序中的变量名相同,两

第一部分 1.10 OC基础语法-点语法、构造方法、结构体

一.点语法 新建一个person类 #import <Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void)setAge:(int)age; // 方法名是setAge: - (int)age; // 方法名是age // 方法名是setAge:andNo: // - (void)setAge:(int)newAge andNo:(int)no; @end #import "Person