函數綁定方法
尚硅谷Golang課

函數綁定方法

方法:結構體的行為,自訂義的結構都可以有方法,方法是作用在指定類型上(綁定的)

方法就是跟一種類型綁定的函數,因為綁定數據類型了就可以偷雞,具體表現在省指針

定義方法時候寫的是func(a ABC) //後面怎樣調用都是值拷貝

定義方法時候寫的是func(a *ABC)//後面怎樣調用都是真實地址

要調用方法,只能透過那種類型的的數據變量 例如a1.ABC

package main

import (
	"fmt"
)

type Person struct {
	Name string
}

//給Person類型綁定一個方法
func (p Person) test() {
	p.Name = "jack"
	fmt.Println("test()=", p.Name)
}

//給Person類型添加一個speak方法,輸出xxx是好人
func (p Person) speak() {
	fmt.Println(p.Name, "是一個好人")
}

//添加一個計算方法算+1...+100
func (p Person) count() {
	res := 0
	for i := 1; i <= 100; i++ {
		res += i
	}
	fmt.Println(p.Name, "計算的結果是", res)
}

//添加一個計算方法算+1...+n
func (p Person) count2(n int) {
	res := 0
	for i := 1; i <= n; i++ {
		res += i
	}
	fmt.Println(p.Name, "計算的結果是", res)
}

//添加一個方法計算2個值的和並返回
func (p Person) getSum(n1, n2 int) int {
	return n1 + n2
}

//為了提高效率,通常把方法跟結構的指針綁定
type Circle struct {
	radius float64
}

func (c *Circle) area() float64 {
	c.radius = 10.0                   //因為傳來的是指針,如果在函數裡改他就等於改真實地址了
	return 3.14 * c.radius * c.radius //語法糖 本來應該是要寫(*c)來計算的
}

//給某方法實現方法String()
type Student struct {
	Name string
	Age  int
}

func (stu *Student) String() string {
	str := fmt.Sprintf("Name=%v Age=%v", stu.Name, stu.Age)
	return str
}

//練習題
type MeUtils struct {
	//123
}

func (mu MeUtils) Print(m int, n int) {
	for i := 1; i <= m; i++ {
		for j := 1; j <= n; j++ {
			fmt.Print("*")
		}
		fmt.Println()
	}

}

func main() {
	var p Person
	p.Name = "tom"
	p.test() //調用方法
	fmt.Println("main=", p.Name)
	//test()//報錯的
	//總的來說就是把test方法跟Person類型綁定,而這個test只能用Person類型調用
	//傳的是形參 (函數裡的是一個副本)
	//---------------------------------------------以下開始應用練習
	p.speak()
	p.count()
	p.count2(1000)
	res := p.getSum(10, 20)
	fmt.Println(res)

	//創建變量嘗試調用area
	var c Circle
	c.radius = 5.0
	res2 := c.area() //語法糖 本來應該是要寫(&c).area()的
	fmt.Println(res2)

	//調用Student
	stu1 := Student{
		Name: "tom",
		Age:  18,
	}
	//如果實現了*Student類型的String方法就會自動調用
	fmt.Println(&stu1)

	//練習題
	var mu MeUtils
	mu.Print(5, 10)

}

上次修改於 2021-08-01

此篇文章的評論功能已經停用。