Golang 方法使用的注意事项和细节

方法的声明(定义)

furie (recevier type) methodName (参数列表) (返回值列表){
 方法体
 return返回值
}

1)参数列表:表示方法输入

2) recevier type:表示这个方法和type这个类型进行绑定,或者说该方法作用于type类型

3) receiver type:type可以是结构体,也可以其它的自定义类型 type integer int

4) receiver:就是type类型的一个变量(实例),比如:Person结构体的一个变量(实例)

5)返回值列表:表示返回的值,可以多个

6)方法主体:表示为了实现某一功能代码块

7)return语句不是必须的。

方法注意事项和细节讨论


1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式

2)如果希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理

为了提高效率,通常方法和结构体的指针类型绑定

type person struct {
	name string
}

func (p *person) Test() {
	fmt.Printf("%p\n", p)
}

func main() {
	var p person
	fmt.Printf("%p\n", &p)
	p.Test()

}

 

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

package main

import "fmt"

type integer int

func (i *integer) Test() {
	fmt.Println("i的地址为:", i, "i的值为:", *i)
	*i = 100
}

func main() {
	a := 9
	b := integer(a)
	fmt.Println("b的地址为:", &b, "b的值为:", b)
	b.Test()
	fmt.Println("修改过后的值为:",b)

}


b的地址为: 0xc0000180a8 b的值为: 9
i的地址为: 0xc0000180a8 i的值为: 9
修改过后的值为: 100 

4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。

5)如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出

如果实现了*person类型的String()方法,那么就会自动调用。 

type person struct {
	name string
	age  int
}

func (p *person) String() string {
	str := fmt.Sprintf("name=%v age=%v", p.name, p.age)
	return str
}

func main() {
	p := &person{
		name: "lucas",
		age:  29,
	}
	fmt.Println(p)
}

name=lucas age=29

 如果这里不是指针类型,而是值类型那么就不会调用

package main

import "fmt"

type person struct {
	name string
	age  int
}

func (p *person) String() string {
	str := fmt.Sprintf("name=%v age=%v", p.name, p.age)
	return str
}

func main() {
	p := person{
		name: "lucas",
		age:  29,
	}
	fmt.Println(p)

}

{lucas 29}

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/132751994