Go 语言函数方法
Go 语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。语法格式如下:
func (variable_name variable_data_type) function_name() [return_type]{
/* 函数体*/
}
下面定义一个结构体类型和该类型的一个方法:
实例
package main
import (
"fmt"
)
/* 定义结构体 */
type Circle struct {
radius float64
}
func main() {
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
import (
"fmt"
)
/* 定义结构体 */
type Circle struct {
radius float64
}
func main() {
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
以上代码执行结果为:
圆的面积 = 314
Go 函数
marvinle
163***1973@qq.com
Go 没有面向对象,而我们知道常见的 Java。
C++ 等语言中,实现类的方法做法都是编译器隐式的给函数加一个 this 指针,而在 Go 里,这个 this 指针需要明确的申明出来,其实和其它 OO 语言并没有很大的区别。
在 C++ 中是这样的:
class Circle { public: float getArea() { return 3.14 * radius * radius; } private: float radius; } // 其中 getArea 经过编译器处理大致变为 float getArea(Circle *const c) { ... }在 Go 中则是如下:
func (c Circle) getArea() float64 { //c.radius 即为 Circle 类型对象中的属性 return 3.14 * c.radius * c.radius }marvinle
163***1973@qq.com
flying81621
fly***81621@163.com
关于值和指针,如果想在方法中改变结构体类型的属性,需要对方法传递指针,体会如下对结构体类型改变的方法 changRadis() 和普通的函数 change() 中的指针操作:
package main import ( "fmt" ) /* 定义结构体 */ type Circle struct { radius float64 } func main() { var c Circle fmt.Println(c.radius) c.radius = 10.00 fmt.Println(c.getArea()) c.changeRadius(20) fmt.Println(c.radius) change(&c, 30) fmt.Println(c.radius) } func (c Circle) getArea() float64 { return c.radius * c.radius } // 注意如果想要更改成功c的值,这里需要传指针 func (c *Circle) changeRadius(radius float64) { c.radius = radius } // 以下操作将不生效 //func (c Circle) changeRadius(radius float64) { // c.radius = radius //} // 引用类型要想改变值需要传指针 func change(c *Circle, radius float64) { c.radius = radius }输出为:
flying81621
fly***81621@163.com
最近很帅
kai***gtingting@qq.com
package main import ( "fmt" ) /* 定义结构体 理解为一个内部类,这个内部类,只定义了一个变量radius, * 然后能过getArea()的这种形式,给它实现一个方法,这样别的地方就可以调用这个方法了。 * 有点绕,但是这样可以助于理解 */ type Circle struct { radius float64 } func main() { var c1 Circle c1.radius = 10.00 fmt.Println("圆的面积 = ", c1.getArea()) var c2 Circle c2 = getArea2(c1) fmt.Println(c2.radius) c3 := getArea3() fmt.Println(c3.radius) } /****************************先这么理解************************************/ // 这种相当于是给【Circle类】定义了一个方法 func (c Circle) getArea() float64 { //c.radius 即为 Circle 类型对象中的属性 return 3.14 * c.radius * c.radius } // 这种是把【Circle类】作 为参数传递,并返回Circle类对象 func getArea2(c Circle) Circle { var temp Circle temp.radius = c.radius * 12 return temp } // 这种是返回Circle类对象 func getArea3() Circle { var temp Circle temp.radius = 0.999 return temp }最近很帅
kai***gtingting@qq.com
Slaine
s1a***@qq.com
方法的接受者可以是“命名类型” 或 “结构体类型” 下的值或指针,一共四种情况:
package main import ( "fmt" "math" ) // 定义圆形结构体 type Circle struct { Radius float64 } // 定义命名类型 type MyFloat float64 // 使用结构体值作为接收者 func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius } // 使用结构体指针作为接收者 func (c *Circle) AreaPointer() float64 { return math.Pi * c.Radius * c.Radius } // 使用命名类型值作为接收者 func (f MyFloat) Square() float64 { return f * f } // 使用命名类型指针作为接收者 func (f *MyFloat) Cube() float64 { return *f * *f * *f } func main() { var c Circle c.Radius = 10.00 // 调用圆形的Area方法 fmt.Println("Area of circle:", c.Area()) // 调用圆形的AreaPointer方法 fmt.Println("Area of circle (pointer):", c.AreaPointer()) var f MyFloat = 2.0 // 调用MyFloat的Square方法 fmt.Println("Square of MyFloat:", f.Square()) // 调用MyFloat的Cube方法 fmt.Println("Cube of MyFloat:", f.Cube()) }Slaine
s1a***@qq.com