码迷,mamicode.com
首页 > 其他好文 > 详细

Go结构体方法

时间:2020-01-24 09:33:38      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:指针   height   字段   原来   get   运算   c 结构体   main   指定   

1. 方法介绍

技术图片

 2. 方法的定义和调用

技术图片

技术图片

 技术图片

 技术图片

 技术图片

技术图片

package main

import (
	"fmt"
)

type Person struct {
	Name string
}

//1. 给Person结构体添加speak 方法,输出  xxx是一个好人
func (p Person) speak() {
	fmt.Println(p.Name, "是一个goodman~")
}

//2. 给Person结构体添加jisuan 方法,可以计算从 1+..+1000的结果,
//说明方法体内可以函数一样,进行各种运算
func (p Person) jisuan() {
	res := 0
	for i := 1; i <= 1000; i++ {
		res += i
	}
	fmt.Println(p.Name, "计算的结果是=", res)
}

//3. 给Person结构体jisuan2 方法,该方法可以接收一个参数n,计算从 1+..+n 的结果
func (p Person) jisuan2(n int) {
	res := 0
	for i := 1; i <= n; i++ {
		res += i
	}
	fmt.Println(p.Name, "计算的结果是=", res)
}

//4. 给Person结构体添加getSum方法,可以计算两个数的和,并返回结果
func (p Person) getSum(n1 int, n2 int) int {
	return n1 + n2
}

//给Person类型绑定一方法
func (person Person) test() {
	person.Name = "jack"
	fmt.Println("test() name=", person.Name) // 输出jack
}


func main() {
	//调用方法
	var p Person
	p.speak()
	p.jisuan()
	p.jisuan2(20)
	n1 := 10
	n2 := 20
	res := p.getSum(n1, n2)
	fmt.Println("res=", res)
}

3. 方法的调用和传参机制原理

技术图片

 技术图片

 技术图片 

 说明:

技术图片

 4. 注意事项

技术图片

package main

import (
	"fmt"
)

type Circle struct {
	radius float64
}

//为了提高效率,通常我们方法和结构体的指针类型绑定
func (c *Circle) area2() float64 {
	//因为 c是指针,因此我们标准的访问其字段的方式是 (*c).radius
	//return 3.14 * (*c).radius * (*c).radius
	// (*c).radius 等价  c.radius
	fmt.Printf("c 是  *Circle 指向的地址=%p", c)
	c.radius = 10
	return 3.14 * c.radius * c.radius
}

func main() {
	//创建一个Circle 变量
	var c2 Circle
	fmt.Printf("main c 结构体变量地址 =%p\n", &c2)
	c2.radius = 7.0
	//res2 := (&c).area2()
	//编译器底层做了优化  (&c).area2() 等价 c.area()
	//因为编译器会自动的给加上 &c
	res2 := c.area2()
	fmt.Println("面积=", res2)
	fmt.Println("c.radius = ", c.radius) //10

}
package main

import (
	"fmt"
)
/*
Golang中的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,
都可以有方法,而不仅仅是struct, 比如int , float32等都可以有方法
*/

type integer int //integer是int的别名

func (i integer) print() {
	fmt.Println("i=", i) //10
}

//编写一个方法,可以改变i的值
func (i *integer) change() { //i是指针变量,是地址拷贝(引用),修改了i会改变原来的值
	*i = *i + 1
}

//=========================================

type Student struct {
	Name string
	Age int
}

//给*Student实现方法String()
func (stu *Student) String() string {
	str := fmt.Sprintf("Name=[%v] Age=[%v]", stu.Name, stu.Age)
	return str
}

func main() {
	var i integer = 10
	i.print()
	i.change()
	fmt.Println("i=", i) //10, 是地址拷贝,被修改了

	//定义一个Student变量
	stu := Student{
		Name : "tom",
		Age : 20,
	}
	//如果你实现了 *Student 类型的 String方法,就会自动调用
	fmt.Println(&stu) //Name=[tom] Age=[20]
}

 

Go结构体方法

标签:指针   height   字段   原来   get   运算   c 结构体   main   指定   

原文地址:https://www.cnblogs.com/yzg-14/p/12231817.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!