//建立方法 package main import "fmt" type book struct { Name string } type eleBook struct { Name string } func main() { //建立一个对象 aBook := book{Name:"spark computer"} aBook.show() bBook := eleBook{Name:"k8s computer"} bBook.show() } //建立一个method //此mothod方法属于book类型 //(a book) 这个字段 是说 // 此方法,属于哪类型,是跟类型绑定的 // (a book)就是一个receiver //只能指定的类型的变量,才能调用 //方法的绑定,只能是同一个包中,才起做用 func (a book) show() { fmt.Println("this is book:\t",a.Name) } // 这属于重载了 //func (a book) show(info string) { // fmt.Println("this is book") //} //建立一个method //此mothod方法属于eleBook类型 func (a eleBook) show() { fmt.Println("this is ele book") }
package main import "fmt" type flower struct { Name string } type rose struct { Name string } func main() { flower := flower{Name:"a big flower"} rose := rose{Name:"a big rose"} fmt.Println("init flower:\t", flower) flower.show() fmt.Println("after flower:\t", flower) fmt.Println("===========================") fmt.Println("init rose:\t", rose) rose.show() fmt.Println("after rose:\t", rose) } //(flower flower) 这种方式,是按值传递的,不能改变原值的 func (flower flower)show() { flower.Name = "I'm flower" fmt.Println("flower:\t", flower) } //(rose *rose) 是按引用传递的,能够改变原值的 func (rose *rose)show() { rose.Name = " this is rose" fmt.Println("rose:\t", rose) }
//别名 与 方法的绑定 // 做用,就是,有一种加强的感受,如int类型,自己没有show,add方法 //别名 与 方法的组合,确有了 package main import "fmt" type TZ int func main() { var ty TZ = 3 fmt.Println("ty:\t" , ty) //Method value 调用方式,经过类型的变量来调用 ty.show() ty.add() fmt.Println("==================Method value Method Express的不一样==============================") //对方法的两种不一样的导调用方式而已 //Method express 调用方式,经过类型直接来调用 //此种方式,须要本身输入 变量 //由于receiver接收的是地址,所以,咱们传入的是地址 (*TZ).show(&ty) (*TZ).add(&ty) } //下面的这些方法,都是经过 某一个类型的 变量 来进行调用的 //java 是经过对象来调用的 func (tz *TZ)show() { fmt.Println("---->:\t 这是int类型", *tz) //tz是地址,*tz 是取地址里的内容了 } func (tz *TZ)add() { fmt.Println("---->:\t 这是int类型的加法") }
//方法 的权限问题,是否能够访问 私有字段呢? //权限是以package 为级别的 //方法的访问权限是很高的,能够访问同一个package下的全部属性,包括公共的,私有的 package main import "fmt" type bike struct { //小写是私有属性,私有属性,只能在同一个package内,进行访问的 name string //大写是公共属性 Color string } func main() { bike := bike{name:"捷安特", Color:"黑色"} fmt.Println("old bike:\t", bike) //经过类型的变量,来调用方法 bike.show() fmt.Println("new bike:\t", bike) } func (bike *bike)show() { bike.Color = "红色" bike.name = "永久" //看见了吧,方法是能够访问同一package下的私有属性的 fmt.Println("bike:\t", bike) }
//练习题: //依据的理论知识:为结构增长方法的知识 //尝试声明一个底层类型为int的类型 //并实现调用某个方法就递增100 //如 a:=0, 调用a.Increase()只会,a从0变成100 package main import "fmt" //为int 声明一个别名 type intFor int func main() { var a intFor = 0 fmt.Println(a.Increase()) } //传的地址 //注意,返回值的类型是intFor func (arg *intFor)Increase() intFor { //添加上*,就表示取地址里的内容了 *arg = 100 return *arg }
例如,type intFor int,
不光是int类型,也能够是其余类型。
开始扩展思惟,其实,就是为某个类型,增长方法;
Java里的一个类里包括属性,以及方法;
在Go语言中,各类属性是封装在一个类型里,方法是经过receiver来绑定;
只是不一样的表现形式而已 java