武大郎,来十个烧饼。。。
package main import "fmt" type Integer int //为内置的int类型增加了新方法less,面向对象写法 func (a Integer) Less(b Integer) bool { return a < b } func Integer_Less(a Integer, b Integer) bool { return a < b } //Go的面向对象,如果需要修改对象,必须用指针,这不是Go约束,还是自然约束 func (a *Integer) Add(b Integer) { *a += b } //Integer类型是一个int,为int起一个别名Integer, // 并且增加一系列方法Add,Add2,又编程了一个新的类型,这个类型还完全拥有int的功能 //传递值而不是指针 func (a Integer) Add2(b Integer) { a += b fmt.Println(a) fmt.Println(b) } func main() { var a Integer = 1 if a.Less(2) { fmt.Println(a, "Less 2") } if Integer_Less(a, 2) { fmt.Println(a, "Less 2") } //为Integer又加了Add方法,Add()方法需要修改对象的值,需要指针引用 //a.Add(2) //fmt.Println("a=", a) //实现成员方法传入的如果不是指针,而是值,也就是Integer,而非*Iteger,,这时a=1 a.Add2(2) fmt.Println("a=", a) //Go语言和C语言一样,类型都是基于值传递,想要修改变量的值,只能传递指针 } /* Go语言中没有隐藏的this指针 方法施加的目标(“对象”)显示传递,没有被隐藏 方法施加的目标(“对象”)不需要非得是指针,也不用非得叫this */
大郎说,烧饼放在家里了
//值语义和引用语义 //b=a //b.Modify() //如果b的修改,不影响a的值,那么此类型就是值类型 //如果会影响a的值,那么此类型就是引用类型 //Go语言大多类型都是值语义 //基本类型:byte、int、bool、float32、float64、string等 //复合类型:数组(array)、结构体(struct)和指针(point) //数组被完整的复制,就是值语义 func main() { var a=[3]int{1,2,3} var b=a //表示b=a赋值语句,是数组内容的完整复制 b[1]++ fmt.Println(a,b) } //引用方法,需要使用指针 func main() { var a = [3]int{1, 2, 3} var b = &a //这句赋值,是数组内容的引用,变量b类型是*[3]int类型 b[1]++ fmt.Print(a, *b) }
有疑问加站长微信联系(非本文作者)