Go语言面组合式向对象编程基础总结
转自:http://blog.csdn.net/yue7603835/article/details/44282823
package main
import(
"fmt"
)
type Integer int
func (a Integer) Less(b Integer)bool {
return a<b
}
func main(){
var a Integer=
r:=a.Less()
fmt.Println(r)
}
/////用法2 组合之指针
package main
import(
"fmt"
)
type Integer int
func (a *Integer) Less(b Integer)bool {
*a-=
return *a<b
} type Int int
func (a *Int) LessIne(b Int)bool{
return *a<b
}
func main(){
var a Integer=
var aa int=
a=Integer(aa)
r:=a.Less()
fmt.Println(r)
}
package main
import(
"fmt"
)
type Integer int
func (a Integer) Less(b Integer)bool {
return a<b
}
func main(){
var a Integer=
var aa int=
a=Integer(aa) //不强制转换会编译出错的
r:=a.Less()
fmt.Println(r)
}
b = a
b.Modify()
var a = []int{, , }
var b = a
b[]++
fmt.Println(a, b)
var a = []int{, , }
var b = &a
b[]++
fmt.Println(a, *b)
type slice struct {
first *T
len int
cap int
}
type Map_K_V struct {
// ...
}
type map[K]V struct {
impl *Map_K_V
}
type IntegerRef struct {
impl *int
}
type interface struct {
data *void
itab *Itab
}
type Rect struct {
x, y float64
width, height float64
}
func (r *Rect) Area() float64 {
return r.width * r.height
}
package main
import "fmt"
type Rect struct{
x,y float64
width,height float64
}
///如果写成rct Rect 那么内部的修改不会影响到 外部结构
///如果写成rct*Rect那么内部的修改会影响到外部结构的值 这就是 指针的效果
func (rct *Rect)Area() float64{
rct.width= ///也可以(*rct).width=1000一样
return rct.width*rct.height
}
func main(){
rct:=new(Rect)
//对于结构体指针,...调用方法和值类型一样直接.唯一的区别是 作为参数传递的时候 传递的是地址 值可以被修改
//所以进行组合的时候就有两种选择
// 可以写成 var rct*Rect=&Rect{}
//也可以写成 var rct Rect=Rect{}
//var rct *Rect=new(Rect)
//也可以写成 var rct Rect=Rect{1,2,3,4}
rct.width=10.0
rct.height=10.0
area:=rct.Area()
fmt.Println(area)
fmt.Println(rct.width)
}
//通过值类型继承
package main
import "fmt"
//Go中继承属于匿名组合 .......可以从对象继承 也可以从指针匿名继承...
//匿名继承会去掉包名,,,所以不能同时继承类名相同的 即使不在同一个包中
type Base struct{
Name string
Age uint8
}
///为Base结构体组合进去两个函数
func (pBase*Base) showName(){
fmt.Println("Age",pBase.Name)
}
func (pBase*Base) showAge(){
fmt.Println("Age",pBase.Age)
}
//创建Sub结构体
type Sub struct{
//组合Base修改内存模型
//匿名组合进Base 对于调用者是不知道的
//即使我们覆盖了 Base的方法 但是我们还是可以通过xxx.Base.xxx()调用基类的方法的
//如果是*Base我们需要在调用处手动添加new Base 否则运行会出错的
Base
}
func (pSub*Sub) showName(){
fmt.Println("Before Sub ShowName")
pSub.Base.showName()
fmt.Println("After Sub ShowName")
}
func main(){
obj:=new(Sub)
obj.Name="张三"
obj.Age=
obj.showName()
obj.showAge()
}
///通过指针类型继承
package main
import "fmt"
//Go中继承属于匿名组合 .......可以从对象继承 也可以从指针匿名继承...
//匿名继承会去掉包名,,,所以不能同时继承类名相同的 即使不在同一个包中
type Base struct{
Name string
Age uint8
}
///为Base结构体组合进去两个函数
func (pBase*Base) showName(){
fmt.Println("Age",pBase.Name)
}
func (pBase*Base) showAge(){
fmt.Println("Age",pBase.Age)
}
//创建Sub结构体
type Sub struct{
//组合Base修改内存模型
//匿名组合进Base 对于调用者是不知道的
//即使我们覆盖了 Base的方法 但是我们还是可以通过xxx.Base.xxx()调用基类的方法的
*Base
}
func (pSub*Sub) showName(){
fmt.Println("Before Sub ShowName")
pSub.Base.showName()
fmt.Println("After Sub ShowName")
}
func main(){
obj:=new(Sub)
//由于使用指针继承所以 我们要设置匿名组合模板的内存对象 地址
obj.Base=&Base{}
obj.Name="张三"
obj.Age=
obj.showName()
obj.showAge()
}
/////Go语言会为每一个成员函数 自动生成对应的函数 比如 func(a *A) 会自动生成 func (a A) .....
///反过来则不行 因为 func (a A)这时候传递的是形参 (&a).xx()改变的是 参数 副本 而不是 外部类
package main
import "fmt"
///非侵入式接口
////接口 和实现完全分析 减少耦合
///实现方只负责实现 接口方只负责封装自己的借口就行...实现方甚至不知道 有这个接口的存在 这就是 Go的 非侵入式接口的特点
type IFly interface{
fly()
}
type ISay interface{
say()
}
type Bird struct{ }
//由于匿名传递进来的是指针类型 所对于接口的赋值必须是 指针
func (pBird*Bird) fly(){
fmt.Println("i am a bird, i can fly()!")
}
//由于匿名传递的不是指针类型是值类型 所以接口赋值 可以不是指针而是值
func (pBird Bird) say(){
fmt.Println("i am a bird, i can say()!")
}
func main(){
birdObj:=Bird{} var iFly IFly=&birdObj
iFly.fly()
var iSay ISay=birdObj
iSay.say()
}
package main
import "fmt"
///非侵入式接口
////接口 和实现完全分析 减少耦合
///实现方只负责实现 接口方只负责封装自己的借口就行...实现方甚至不知道 有这个接口的存在 这就是 Go的 非侵入式接口的特点
type IFly interface{
fly()
}
type ISay interface{
say()
}
type IFly1 interface{
fly()
}
type ISay1 interface{
say()
}
type Bird struct{ }
//由于匿名传递进来的是指针类型 所对于接口的赋值必须是 指针
func (pBird*Bird) fly(){
fmt.Println("i am a bird, i can fly()!")
}
//由于匿名传递的不是指针类型是值类型 所以接口赋值 可以不是指针而是值
func (pBird Bird) say(){
fmt.Println("i am a bird, i can say()!")
}
func main(){
birdObj:=Bird{} var iFly IFly=&birdObj
iFly.fly()
var iSay ISay=birdObj
iSay.say()
////接口之间的赋值
var iFly1 IFly1=iFly
iFly1.fly()
}
package main
import "fmt"
///非侵入式接口
////接口 和实现完全分析 减少耦合
///实现方只负责实现 接口方只负责封装自己的借口就行...实现方甚至不知道 有这个接口的存在 这就是 Go的 非侵入式接口的特点
type IFly interface{
fly()
}
type ISay interface{
say()
}
type IFly1 interface{
fly()
}
type ISay1 interface{
say()
}
type Bird struct{ }
//由于匿名传递进来的是指针类型 所对于接口的赋值必须是 指针
func (pBird*Bird) fly(){
fmt.Println("i am a bird, i can fly()!")
}
//由于匿名传递的不是指针类型是值类型 所以接口赋值 可以不是指针而是值
func (pBird Bird) say(){
fmt.Println("i am a bird, i can say()!")
}
func (pBird Bird) String() string{
return "aaaaaaaaaa"
}
func main(){
birdObj:=Bird{} var iFly IFly=&birdObj
iFly.fly()
var iSay ISay=birdObj
iSay.say()
////接口之间的赋值
var iFly1 IFly1=iFly
iFly1.fly()
fmt.Println(birdObj)
}
type IFly interface{
fly()
}
type ISay interface{
say()
}
type IFly1 interface{
fly()
}
type ISay1 interface{
say()
}
type ISay_Fly interface{
ISay
IFly
}
var v1 interface{} = ...
switch v := v1.(type) {
case int: // 现在v的类型是int
case string: // 现在v的类型是string
...
}
type Stringer interface {
String() string
}
func Println(args ...interface{}) {
for _, arg := range args {
switch v := v1.(type) {
case int: // 现在v的类型是int
case string: // 现在v的类型是string
default:
if v, ok := arg.(Stringer); ok { // 现在v的类型是Stringer
val := v.String()
// ...
} else {
// ...
}
}
}
}
var any1 interface{}=
var any2 interface{}="b"
var any3 interface{}=struct{x ,y string}{"hello,world","aaaaa"}
fmt.Println(any1,any2,any3)
var v1 interface{} = // 将int类型赋值给interface{}
var v2 interface{} = "abc" // 将string类型赋值给interface{}
var v3 interface{} = &v2 // 将*interface{}类型赋值给interface{}
var v4 interface{} = struct{ X int }{}
var v5 interface{} = &struct{ X int }{}
func Printf(fmt string, args ...interface{})
func Println(args ...interface{})
...
var v1 interface{} = // 将int类型赋值给interface{}
var v2 interface{} = "abc" // 将string类型赋值给interface{}
var v3 interface{} = &v2 // 将*interface{}类型赋值给interface{}
var v4 interface{} = struct{ X int }{}
var v5 interface{} = &struct{ X int }{}
func Printf(fmt string, args ...interface{})
func Println(args ...interface{})
...
Go语言面组合式向对象编程基础总结的更多相关文章
- Python语言基础07-面向对象编程基础
本文收录在Python从入门到精通系列文章系列 1. 了解面对对象编程 活在当下的程序员应该都听过"面向对象编程"一词,也经常有人问能不能用一句话解释下什么是"面向对象编 ...
- C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)
什么是面向对象? 在软件的设计过程中的两种方式: 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程: 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功 ...
- C++学习8-面向对象编程基础(模板)
模板 模板是一种工具,模板可以使程序员能建立具有通用类型的函数库与类库: 模板具有两种不同的形式: 函数模板 类模板 函数模板 当一个add()函数接收两个参数,因为某种特定情况,所传入的实参数据类型 ...
- C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)
多态 多态性是指对不同类的对象发出相同的消息将返回不同的行为,消息主要是指类的成员函数的调用,不同的行为是指不同的实现: 函数重载 函数重载是多态性的一种简单形式,它是指允许在相同的作用域内,相同的函 ...
- C++学习6-面向对象编程基础(运算符重载、类的派生与继承、命名空间)
运算符重载 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.重载的运算符是遵循函数重载的选择原则,根据不同类型或不同参数来选择不同的重载运算符. 运 ...
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
知识点学习 类 const作用 C语言的const限定符的含义为"一个不能改变值的变量",C++的const限定符的含义为"一个有类型描述的常量": const ...
- Go语言基础之19--web编程基础
一.web编程基础 1.1 web工作方式 1.2 HTTP协议详解 a.http 请求包体 GET /domains/example/ HTTP/1.1 //请求行: 请求方法 请求URI HTTP ...
- 第一章 T-SQL查询和编程基础 T-SQL语言基础(1)
T-SQL查询和编程基础(1) 1.1 理论背景 SQL是为查询和管理关系型数据库管理系统(RDBMS)中的数据而专门设计的一种标准语言. RDBMS是一种基于关系模型的数据库管理系统,关系模型则是一 ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
随机推荐
- trim()不兼容ie的问题及解决方法
当输入 src.trim();时,ie浏览器不支持此属性和方法,解决方法: //ie兼容trim方法if(!String.prototype.trim) { String.prototype.trim ...
- codeforces 11 B.Jumping Jack 想法题
B. Jumping Jack Jack is working on his jumping skills recently. Currently he's located at point zero ...
- ibatis.net 实现多数据库配置
1.1 功能介绍 使用ibatis.net ORM框架时,有时候需要操作多个数据库,同时有时候也需要对连接数据库信息进行加密,本文通过将配置连接写到Web.config中, 这样就可以在Web.co ...
- Rails 5 Test Prescriptions(everday Rspectest作者推荐) 目录 1-3章
总文档连接: RSpec.info/documentation/ 如何使用TDD 和 自动化测试来建立一个Rails app. TDD让你用测试来探索代码的设计.你将学习可利用的工具,并学习用什么工具 ...
- PowerDesigner16工具学习笔记-建立BPM
根据不同用途,BPM分为分析性(Analysis).执行型(Executable)和协作型(Collaborative) BPM的类型 业务流程语言 描述 分析型 Analysis 提供流程层次 ...
- SCWS中文分词PHP扩展详细安装说明
因最近写的一段代码,需要用到中文分词,在网上找了一下,发现了scws这个不错的插件,故根据文档安装使用,下面记录下安装的全过程 系统:centos 安装scws wget http://www.xun ...
- UVA-11082 Matrix Decompressing (网络流建模)
题目大意:给出一个由1到20组成的整数矩阵的每一行和每一列的和,构造这个矩阵.输出任意一个构造方案. 题目分析:将每一行视作一个点x,将每一列视作一个点y.对于矩阵中的每一个格子,都对应一个二元关系& ...
- oracle表的统计信息完全正确,执行计划无故改变。原厂人员如是回复
就像在电话里提到的那样,Oracle内部的优化器是根据一系列的内部算法基于表上的统计信息来产生执行计划的.对于特别复杂的SQL语句,Oracle的优化器有一定几率不能得到最优的执行计划(因为机器代码实 ...
- MyBatise代码自动生成时候Oralce的number类型BigDecimal问题
使用MyBatise的代码自动生成工具时候,即便在配置文件中定义了 <javaTypeResolver> <property name="forceBigDecimals& ...
- Java 调用 PHP 实例(五)
java代码: package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException ...