Golang之面向对象和指针

武大郎,来十个烧饼。。。

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

 

posted @ 2018-01-09 11:16  py鱼  阅读(718)  评论(0编辑  收藏  举报
点我回主页