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)
}