Go语言中文网 为您找到相关结果 78

golang面向对象思想和实现

golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。 类声明 type Poem struct { Title string Author string intro string } 这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做法来实现属性的访问权限:属性的开头字母是大写的则在其它包中可以被访问,否则只能在本包中访问。类的声明和方法亦是如此。 类方法声明 func (poem *Poem) publish() { fmt.Println("poem publish") } 或者 func (poem Poem) publish() { fmt.Println("poem pu...阅读全文

博文 2015-10-11 10:58:50 陈杰斌

golang通过反射克隆数据

啥也不说,直接上代码 package utils import ( "encoding/json" "reflect" ) //浅克隆,可以克隆任意数据类型,对指针类型子元素无法克隆 //获取类型:如果类型是指针类型,需要使用Elem()获取对象实际类型 //获取实际值:如果值是指针类型,需要使用Elem()获取实际数据 //说白了,Elem()就是获取反射数据的实际类型和实际值 func Clone(src interface{}) interface{} { typ := reflect.TypeOf(src) if typ.Kind() == reflect.Ptr { //如果是指针类型 typ = typ.Elem() //获取源实际类型(否则为指针类型) dst := refle...阅读全文

博文 2020-02-09 15:32:41 悟道人

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,又编程了一个...阅读全文

Go语言学习(十四)面向对象编程-可见性

Go语言对关键字的增加非常吝啬,其中没有private、protected、public这样的关键 字。要使某个符号对其他包(package)可见(即可以访问)需要将该符号定义为以大写字母 开头,如: type Rect struct { X, Y float64 Width, Height float64 } 这样,Rect类型的成员变量就全部被导出了,可以被所有其他引用了Rect所在包的代码访问到。 成员方法的可访问性遵循同样的规则,例如: func (r *Rect) area() float64 { return r.Width * r.Height } 这样,Rect的area()方法只能在该类型所在的包内使用。 需要注意的一点是,Go语言中符号的可访问性是包级别的而不是类型级别的...阅读全文

go-struct、方法

package main import "fmt" func main() { //创建对象,通过.方式进行初始化 a := person{} a.name = "wyf" a.age = 30 fmt.Println(a) //创建对象,通过类似构造的方式进行初始化 b := person{ name: "wyff", age: 300, } fmt.Println(b) //值传递 A(b) fmt.Println(b) //person引用传递 fmt.Println("-------引用地址传递--------") B(&b) fmt.Println(b) fmt.Println("-------初始化一个引用地址类型--------") r := &person{ name: "x...阅读全文

博文 2016-08-30 20:00:08 u013210620

go-struct、方法

package main import "fmt" func main() { //创建对象,通过.方式进行初始化 a := person{} a.name = "wyf" a.age = 30 fmt.Println(a) //创建对象,通过类似构造的方式进行初始化 b := person{ name: "wyff", age: 300, } fmt.Println(b) //值传递 A(b) fmt.Println(b) //person引用传递 fmt.Println("-------引用地址传递--------") B(&b) fmt.Println(b) fmt.Println("-------初始化一个引用地址类型--------") r := &person{ name: "x...阅读全文

博文 2016-08-21 19:00:08 u013210620

大话设计模式 -- Golang实现

DesignPattern Use GO language to achieve 23 design patterns 该项目是拜读《大话设计模式》后,学习Golang语言实现的,有很多不足之处,有待完善 有些模式是根据UML图编写的基本框架,有些是基于特定的环境下编写的实例 创建型模式 Abstract Factory抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类 Builder建造者模式:将一个复杂对象的构建与它表示分离,使得同样的构建过程可以创建不同的表示 Factory Method工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类 Prototype 原型模式:用原型实例指定创建对象的种类,并...阅读全文

博文 2019-03-27 21:35:24 Golang语言社区

GO面向对象:method

method的语法如下: func (r ReceiverType) methodName(parameters) (results) go中的method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在方法名之前增加了一个receiver,也就是method所依附的主体(可以面向对象中的对象理解) 例如下面的例子: type Box struct { width, heigh, depth float64 } func (b Box) Volume() float64 { return b.width * b.heigh * b.depth } func main(){ b:=Box{4,4,4} volume:=b.Volume() } Volume这个method是...阅读全文

博文 2016-01-29 18:00:01 fzk2008

架构学习之路(三)-- IOC

参考: https://studygolang.com/articles/13783?fr=sidebar https://studygolang.com/articles/7716 先写着,我现在吃不透原理 一、IOC Ioc的思想就是解耦,只依赖容器而不依赖具体的类,当你的类有修改时,最多需要改动一下容器相关代码,业务代码并不受影响。 golang的依赖注入原理 步骤如下:(golang不支持动态创建对象,所以需要先手动创建对象然后注入,java可以直接动态创建对象) 1.通过反射读取对象的依赖(golang是通过tag实现) 2.在容器中查找有无该对象实例 3.如果有该对象实例或者创建对象的工厂方法,则注入对象或使用工厂创建对象并注入 4.如果无该对象实例,则报错 代码实现 packa...阅读全文

博文 2018-08-24 22:34:56 魔改谢馒头

Go学习笔记-面向对象struct之继承

前一篇说了基于struct的method实现,现在我们来看下struct中的method继承。 //定义一个person类型 type Person struct { Name string Age int Sex string } //获取person的年龄 func (Person *Person)getAge() int { return Person.Age } //获取person的性别 func (Person *Person)getSex() string { return Person.Sex } //定义一个Worker类型 type Worker struct { Person Job string Age int } //获取Worker的年龄 func (Worker...阅读全文

博文 2020-01-01 16:32:38 旧梦发癫

在 Go 中使用 finalizers 比不使用更好

Go 拥有 finalizers,它们支持程序调用一些代码并作为一个对象来进行垃圾回收。然而,很多人不太喜欢 finalizers,并且通常的建议是完全避免它们 ([比如](https://twitter.com/davecheney/status/790343722865090560))。最近,David Crawshaw 在[《Finalizers 惨案》](https://crawshaw.io/blog/tragedy-of-finalizers) 一文中指出 finalizers 的众多弊端并展示一个依赖他们会导致失败的案例。我差不多同意其上述所有观点,但与此同时,我自己已经在[一个 Go 包访问 Solaris/Illumos kstats](https://github.com...阅读全文

博文 2018-11-19 10:06:47 polaris

GO面向对象

一个程序就是一个世界,有很对不同的对象 说明 1 GO也支持面向对象编程,但是和传统的面向对象有区别,并不是纯粹的面向对象语言。所以我们说GO支持面向对象特性是比较准确的 GO没有类,Go语言的结构体(struct)和其他语言的类(Class)有同等地位,你也可以理解Golang是基于Struct来实现OOP概念的 go语言面向对象非常简洁,去掉了传统OOP语言的继承,方法重载,构造函数和析构函数等等 结构体 与 结构体变...阅读全文

博文 2019-03-14 18:34:48 suenism

Go语言编程(十)之面向对象编程

之前文章介绍了Go语言顺序编程的相关特性,很多人说Go语言是更好的C语言,接下来的篇章,我们将介绍Go语言对于面向对象思想的支持。 Go语言并没有沿袭传统面向对象编程中的诸多概念,比如继承、虚函数、构造函数和析构函数、隐藏的this指针等。Go语言对面向对象编程的支持是语言类型系统中的天然组成部分。整个类型系统通过接口串联...阅读全文

博文 2016-10-17 15:00:05 JoeySheng

Go语言编程(十一)之类型系统

类型系统 type system 类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容: 基础类型,如byte、int、bool、float等 复合类型,如数组、结构体、指针等 可以指向任意对象的类型(Any类型) 值语义和引用语义 面向对象,即所有具备面向对象特征(比如成员方法)的类型 接口 类型系统描述的是这些内容在一个语言中如何被关联。 为类型添加方法 在Go语言中,你可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法,例如 type Integer int func (a Integer) Less(b Integer) bool { return a < b } 在这个例子中,我们定义了一个新类型Integer,它和int没有本质不同,只是它为内置...阅读全文

博文 2016-10-17 15:00:05 JoeySheng

GO语言学习笔记(二)

为类型添加方法package main import ( "fmt" ) type Integer int func (a Integer) Less(b Integer) bool { return a < b } func main() { var a Integer = 1 if a.Less(2) { fmt.Println("Less true.") } } 结果输出:Less true.只有在你需要修改对象的时候,才必须用指针 因为数组切片的内部是指向数组的指针,所以可以改变数组的内容 package main import ( "fmt" ) func modifyslice(array []int) { slice1 := array[1:2] fmt.Println(sli...阅读全文

博文 2015-06-17 23:01:38 YaphetS_xiaoyang

golang 使用组合的方式实现继承

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码事例 package main import ( "fmt" ) type People struct{} type People2 struct{} func (p *People) ShowA() { fmt.Println("showA") p.ShowB() } func (p *People) ShowB() { fmt.Println("showB") } func (p *People) ShowC()...阅读全文

博文 2018-12-13 13:34:45 火头陀

golang语言构造函数

1、构造函数定义 构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 而golang没有相关的构造函数定义,只能通过new来创建构造函数。 2、构造函数声明 声明一个struct结构: 声明一个全局函数,返回*struct ok,到此已经构造函数定义完...阅读全文

博文 2016-09-12 12:00:32 迪克猪

策略模式-Golang实现

目的:根据不同策略来执行对象的相应操作 和工厂模式很像,不同点在于: 工厂模式是传入参数后创建对象,根据传入的参数写逻辑来判断应该创建什么类型的对象,模式的使用者调用对象统一的方法操作。 策略模式是模式的使用者必须先创建好对象,将该对象作为参数传进去,然后通过该对象调用相应的方法。 设计场景如下: 吃饭的时候,我们有三种主食可以选,米饭、面包和苗条。 golang实现代码: package strategypattern import "fmt" /*实体类接口*/ type Staplefood interface { Eat() } type RiceStaplefood struct { } type NoodleStaplefood struct { } /*策略类*/ type E...阅读全文

博文 2018-12-27 15:34:49 Marstin

golang对象

对象和组合 package main import ( "fmt" ) type father struct { name string sex int } type sun struct { father age int } func main() { m:=father{name:"father",sex:11} s:=sun{father:father{name:"son",sex:12},age:14} fmt.Println(s) fmt.Println("name",s.name) fmt.Println("name",m.name) fmt.Println("sex",s.sex) fmt.Println("sex",m.sex) fmt.Println("age",s.age...阅读全文

博文 2017-11-15 12:00:01 peterinblog

Golang learning 面向对象 多态

通过interface 实现多态 type Cat struct { Animal teeth string "牙" leg int } type Dog struct { Animal teeth string "牙" leg int } type NewAction interface { run() } func (c Cat) run(){ fmt.Print("\ncat----run") } func (c Dog) run(){ fmt.Print("\nDog----run") } func main() { cat := Cat{} dog := Dog{} animalRun(cat) animalRun(dog) } 打印 cat----run Dog----ru...阅读全文

博文 2019-05-24 03:34:43 wangyongyue

Golang 高效编写(整理)

这是一篇如何编写高效 Golang 语言程序的文章。这是从一些开发者的经验总结中整理出来的。根据这篇文章,你可以编写出一篇更高效的 Golang 程序。 尽量使用直接的类型interface{} 提供了 golang 中的 interface 类似于 java 的 interface、PHP 的 interface 或 C++ 的纯虚基类。通过这种方式可以提供更快捷的编码。但是这种方式也带来了一些问题,最大的问题还是性能问题。 12345678// method 1a.AA()// method 2v.(InterfaceA).AA()// method 3switch v.(type) {case InterfaceA: v.(InterfaceA).AA()} 这三组方法性能逐个下降,最...阅读全文

博文 2020-02-21 10:43:47 ipfans's Blog

【golang】性能优化

内存管理 在栈中创建对象比在堆中创建对象性能高,少用new来创建对象,多用object{}创建,如果需要创建大量相同临时对象,使用sync.pool减少gc压力。 原因:因为heap上的变量需要gc,而stack上的自动释放,如果在函数里面创建许多生命周期很短的heap变量,会不断触发gc...阅读全文

博文 2020-04-16 03:32:42 dongzaidong

Golang的面向对象

在golang中,面向对象一直是一个纠纷,怎么说好呢。就是官网说没有面向对象这个概念,可是又给出了类似面向对象的概念。 和其他语言不同Golang只有接口和结构体分别为 interface 和 struct 我们以javascript es6为例子做对比 class ClassName { public name; // 成员属性 } 我们一个类有哪些属性,一般的语言和以上的写法是差不多的。可是到了golang的话,就有点变味了。 type ClassName struct { name string; } 我们有时候还需要在类中添加行为(方法)。我们在其他语言通常是 class ClassName { public name; // 成员属性 public setName(name){} ...阅读全文

博文 2020-01-16 11:32:41 傻梦兽

GO语言使用之面向对象编程(1)——Golang语言面向对象编程说明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TDCQZD/article/details/81638320 Golang语言面向对象编程说明 1、 Golang也支持面向对象编程(OOP[object oriented programming]),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性。 2、 Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。 3、 Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指...阅读全文

博文 2019-03-20 00:32:04 TDCQZD

golang rpc usage

# golang rpc usage ## 引言 这个文章不对RPC的底层实现做深入剖析,也不讲解RPC是什么~~ ## sample RPC三步走,方法模型、服务端搭建、客户端设计 ### model 我们以设计一个做加法运算的方法为例子 ``` type Math int //Math类 type Args struct { Ops1 int Ops2 int } func (m *Math) Add(args Args, reply *int) error { log.Print("server call Add") *reply = args.Ops1 + args.Ops1 return nil } ``` ### server ``` func main() { //创建对象 m...阅读全文

博文 2020-04-22 18:21:32 antonlin