首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

go函数没有参数和返回值的风格是否是好的?用的是什么设计模式?

在软件开发中,设计模式是一种在特定场景下解决问题的可重用方案。在这个问题中,我们需要探讨在没有参数和返回值的情况下,使用哪种设计模式来实现 go 函数。

在这种情况下,可以使用工厂方法模式。工厂方法模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪个类。工厂方法让一个类的实例化延迟到其子类。

在没有参数和返回值的情况下,go 函数可以使用工厂方法模式创建对象。这种方法可以确保代码的可扩展性和可维护性。

以下是一个简单的示例:

代码语言:go
复制
package main

import "fmt"

// Product 是一个接口,定义了工厂方法所创建的对象的共有方法。
type Product interface {
	Use()
}

// ConcreteProductA 是 Product 的一个具体实现。
type ConcreteProductA struct{}

func (c *ConcreteProductA) Use() {
	fmt.Println("使用具体产品 A")
}

// ConcreteProductB 是 Product 的另一个具体实现。
type ConcreteProductB struct{}

func (c *ConcreteProductB) Use() {
	fmt.Println("使用具体产品 B")
}

// Creator 是一个接口,定义了工厂方法所创建的对象的共有方法。
type Creator interface {
	FactoryMethod() Product
}

// ConcreteCreatorA 是 Creator 的一个具体实现。
type ConcreteCreatorA struct{}

func (c *ConcreteCreatorA) FactoryMethod() Product {
	return &ConcreteProductA{}
}

// ConcreteCreatorB 是 Creator 的另一个具体实现。
type ConcreteCreatorB struct{}

func (c *ConcreteCreatorB) FactoryMethod() Product {
	return &ConcreteProductB{}
}

func main() {
	creator := &ConcreteCreatorA{}
	product := creator.FactoryMethod()
	product.Use()
}

在这个例子中,ConcreteCreatorAConcreteCreatorB 是工厂方法的具体实现,它们分别创建 ConcreteProductAConcreteProductB 对象。main 函数中,我们可以根据需要选择使用哪个工厂方法创建对象。

这种方法可以确保代码的可扩展性和可维护性。如果需要添加新的产品,只需创建新的具体产品类和相应的具体工厂类,而无需修改已有代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go语言函数参数返回值

函数结构化编程最小模块单元。它将复杂算法过程分解为若干较小任务,隐藏相关细节,使得程序结构更加清晰,易于维护。函数设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果。...因此,函数还是代码复用测试基本单元。 关键字 func 用于定义函数Go函数有些不太方便限制,但也借鉴了动态语言某些优点。 无须前置声明。...最常见用法就是匿名函数。 从阅读代码维护角度来说,使用命名类型更加方便。 ? 函数只能判断其是否为 nil,不支持其他比较操作。 ? ?...下面一个指针参数导致实参变量被分配到堆上简单示例。可对比传值参数汇编代码,从中可看出具体差别。 ? 输出: ? ? 要实现传出参数(out),通常建议使用返回值。当然,也可继续二级指针。...借鉴自动态语言返回值模式函数得以返回更多状态,尤其 error 模式。 ? ? 稍有不便没有元组(tuple)类型,也不能用数组、切片接收,但可用“_”忽略掉不想要返回值

2.5K30

Go语言设计模式》读后感

当年写博客:你所学习设计模式到底有什么?到底怎么?...所以本书我更推荐给没有学习过设计模式,但正好在使用 Golang 语言开发同学。 Go 常用设计模式 对于 Go 语言使用设计模式本身,我个人也有些认识。...每种语言都有自己特点特性,go 没有继承势必在某些设计模式实现上并非优雅;但由于 go 函数一等公民,在某些设计模式中也有自己风格。...所以我就举例说明几个我最常用,也在 go 中最常见设计模式: Option 函数设计模式:将额外参数作为 Option 从而扩展方法功能,且 Option 本身函数方式。...总结 最后总结下吧,对于已经写了那么久代码我来说,这次看完书之后,给我一种看山又是山看水又是水感觉,最好设计模式是什么: 抽象,并且记得开闭原则 减少重复代码 减少单个函数代码行数 记住这三点,

16220
  • go 学习笔记之学习函数式编程前不要忘了函数基础 原

    在编程世界中向来就没有一家独大编程风格,至少目前还是百家争鸣春秋战国,除了众所周知面向对象编程还有日渐流行函数式编程,当然这也是本系列文章重点....Go 语言和其他主流编程语言明显不同,函数支持多返回值,通常第一个返回值表示真正结果,第二个返回值表示是否错误,这也是 Go 关于异常错误设计独特之处. > 如果正常返回,则表示没有错误,那么第一个返回值正常结果而第二个返回值则是空...上述示例中讲解了函数可以作为返回值,参数函数,返回值也有参数,所以 evalWithFunctionalStyle 函数看起来比较费劲,而 Go 语言类型别名就是为了简化而生,更何况函数 Go...) 返回值函数 func() (int, error) 进行统一,而入参函数返回值函数唯一不同之处就是入参个数不同,所以顺理成章想到了 Go 函数不定长参数相关语法. type generateIntFunc...函数式编程入门函数总结 函数一等公民,其中函数参数,变量,函数返回值都可以是函数. 高阶函数普通函数组合而成,参数返回值可以是另外函数.

    56040

    go 学习笔记之go是不是面向对象语言是否支持面对对象编程?

    Go 语言也是来源于 C 语言,不知道你是否也会好奇 Go 语言是否支持面向对象这种编程风格呢? 准确说,Go 既支持面向对象编程又不是面向对象语言!...如果多个属性全部写在一行时,没有换行符我看你还怎么区分,此时逗号分隔还是分号分隔呢? ? 首先空格肯定是不能分隔多个属性,因此尝试分号或者逗号是否可以....是什么,为什么怎么样三个基本问题,如果简单学习了解的话,学会是什么怎么样就已经足够了,但是这样一来学着学着难免会陷入各自为政场面,也就是说各个编程语言之间没有任何关系,每一种语言都是独立存在...此时方法名参数返回值又报错了,根据提示说函数字段名不能相同? 真的又是一件神奇事情,难不成 Go 无法区分函数字段?这就不得而知了....当然这个名称依赖于 Go 设计者如何命名,这里靠猜测很难猜对,否则我就是设计者了啊! 除此之外,还有另外一种可能,那就是 Go没有构造函数,想要实现构造函数逻辑只能另辟蹊径.

    70440

    API设计原则 – QT官网设计实践总结

    虽然QtC++,但其中设计原则思考具有普适性(如果你对C++还不精通,可以忽略与C++强相关或是过于细节部分,仍然可以学习或梳理关于API设计最有价值内容)。...API设计原则 一致、易于掌握强大APIQt最著名优点之一。此文总结了我们在设计Qt风格API过程中所积累诀窍(know-how)。...(但是这样做,在函数内就需要判断指针是否为空情况,因为引用是不需要判断,所以,这是一种 trade-off) 另外,如果这样参数过多的话,最好使用一个结构体来把数据打包,一方面,为一组返回值取个名字...,如果返回值不是const,代码可以顺利编译通过,然而并没有什么卵,因为那个临时对像马上就被抛弃了。...应该考虑将其移除而不是去重载const/非const函数。 5. API语义和文档 当传值为-1参数函数函数是什么行为?有很多类似的问题…… 警告、致命错误还是其它?

    2.7K20

    C语言“函数”总结

    Add只是个名字 括号内参数 大括号内函数体 int返回类型 定义后可以反复调用 (简化版) 库函数函数经常用函数过去经常使用函数为了方便积累 在网站 www.cplusplus.com.../reference/ 中能查到以往函数 自定义函数 自定义函数做库函数不能做事情 自定义函数想库函数一样,有函数名,返回值类型函数参数 自定义函数相对重要一些 它用于编出自己需要函数 就是...返回类型 + 名字 +(参数A,参数B) 可以没有 一个 或者两个参数 比如取大自定义函数 如果void就可以不返回 特殊知识点 形参 与 实在参数 在下面的ab实参 X,y形参 改xy与...指针改 间接改 要改为 指针定位可以改变(在初识已经理解了指针用法) 但取地址后 就是 间接控制两个实参了 而且没有参数 又比如求和参数 这个函数不需要回地址 是因为它只要把值返回就行了 函数参数...提出一个功能代码 二分代码 这个代码很重要,需要记住 然后 这些功能尽量 1 0作为返回值也就是 真 返回值自己设计 这里也是说明 代码风格 需要养成一个很好代码风格 自定义函数能接收不止两个东西进行编制

    15710

    【译】Go 语言实践:编写可维护程序建议

    常量需要描述其存储含义,而不是怎么使用它。 单字母变量可用于循环或逻辑分支,单词变量可用于参数返回值,多词短语可用于函数包这一级声明。...在这一节中我会来谈一谈包设计,包括包命名、类型命名,以及编写方法函数一些小技巧。 一个包从它名称开始 编写一个 Go 程序包从命名开始。...没有文档说明,您很难分辨。代码评审者在没有文档时也对您参数传入顺序是否正确不得而知。...本演讲主旨您应该为常见设计 API。另一方面,您 API 不应要求调用者提供那些他们不关心参数。...这还不是世界上最糟糕事情——(更糟糕没有传入参数时这段代码逻辑将会变成“`anyPositive`是否返回`true`?”。

    2K80

    如何写出优雅 Golang 代码

    Go 语言一些顶层设计最终导致了它在划分模块上与其他编程语言有着非常明显不同,很多其他语言 Web 框架都采用 MVC 架构模式,例如 Rails Spring MVC,Go 语言对模块划分方法就与...package 拆出去,对这部分性能热点单独进行扩容; 小结 项目按照层级还是按照职责对模块进行拆分其实并没有绝对与不好,语言和框架层面的设计最终决定了我们应该采用哪种方式对项目代码进行组织。...如果想要想清楚什么样才是可测试,我们首先要知道测试是什么?作者对于测试理解就是控制变量,在我们隔离了待测试方法中一些依赖之后,当函数入参确定时,就应该得到期望返回值。 ?...,所以在这时我们就能够断言当前方法一定会返回 []Post{},这时我们方法返回值就只与传入参数有关(虽然 ListPosts 方法没有入参),我们能够减少一次关注上下文并保证测试稳定可信。...这是 Go 语言中最标准单元测试写法,所有依赖 package 无论项目内外都应该使用这种方式处理(在有接口情况下),如果没有接口 Go 语言单元测试就会非常难写,这也是为什么从项目中是否有接口就能判断工程质量原因了

    1.6K30

    如何写出优雅 Golang 代码

    Go 语言一些顶层设计最终导致了它在划分模块上与其他编程语言有着非常明显不同,很多其他语言 Web 框架都采用 MVC 架构模式,例如 Rails Spring MVC,Go 语言对模块划分方法就与...package 拆出去,对这部分性能热点单独进行扩容; 小结 项目按照层级还是按照职责对模块进行拆分其实并没有绝对与不好,语言和框架层面的设计最终决定了我们应该采用哪种方式对项目代码进行组织。...如果想要想清楚什么样才是可测试,我们首先要知道测试是什么?作者对于测试理解就是控制变量,在我们隔离了待测试方法中一些依赖之后,当函数入参确定时,就应该得到期望返回值。...,所以在这时我们就能够断言当前方法一定会返回 []Post{},这时我们方法返回值就只与传入参数有关(虽然 ListPosts 方法没有入参),我们能够减少一次关注上下文并保证测试稳定可信。...这是 Go 语言中最标准单元测试写法,所有依赖 package 无论项目内外都应该使用这种方式处理(在有接口情况下),如果没有接口 Go 语言单元测试就会非常难写,这也是为什么从项目中是否有接口就能判断工程质量原因了

    1.1K30

    晴窗闲谈 | 从Go语言设计学习设计决策

    例如,Go语言之所以采用C语言风格花括号,其考量并非简单地延续C语言风格那么简单,在前面提及愿景大前提下,设计者必须考虑如果使用Python或Haskell风格空格缩进,对于大规模程序而言,可能会造成太多问题...默认参数缺失要求更多函数或方法被定义,因为一个函数不能控制整个接口,但这使得一个API更清晰易懂。...姑且不谈这一设计驱动因素是否可取,这里显然教会了我们在软件设计时应该懂得如何去权衡。权衡能力架构师必备技能,就好像老婆老妈同时落水了,你该去救哪一个,这个命题总是让人不舒服,因而不肯回答。...Go语言对于继承处理也显得特立独行,因为在Go语言中,没有类型层级(type hierarchy)概念。它选择了组合而非继承,在于它对继承滥用表达了足够忧虑担心。...鉴于对多返回值支持,且Goerror又是抽象接口类型,这样设计就变得合乎情理了。

    85570

    伙计们,Go没有那么简单

    但就像我说,我不是在抱怨 Go,我真的不介意接受者参数观点(如果我忍受不了 C++ 怪异,我可以忍受 Go )。 3. 函数返回值 如果接收参数不够,函数甚至能够通过各种形式返回值来声明。...通常语言允许你通过 return 语句返回函数一个值。而在 Go 语言中,你可以返回多个值(我认为可以更优雅方式通过元组来解决,但是就这样吧)。除此之外,还有命名返回值。...我认为,错误处理无论什么一直一个 PITA(译注:应该是国外一种比喻)。把一种风格换成另一种风格,你只需把一套问题换成另一套。没有方法。...人们还没有意识到,如果正确地使用泛型,它可以使许多类型函数使用更加简单。例如,考虑 Go堆接口。...不要误解我意思,Go 并发性没问题。只是说这没有什么特别的。你有 channel,这肯定是,但基本上,它们只是像我在别处常用并发队列。

    79660

    3小时Scala入门

    函数类型函数参数返回值类型映射关系, 如 Int => Unit , (Array[Int],String) => Int 。...函数函数参数返回值取值映射关系, 如 x => x+1 x,y => x+y 。 使用这种方式声明函数叫做匿名函数。 此外,当函数表达式中引用了非参数变量时,这种函数叫做闭包。...闭包特性每次调用它时都会将外部开放变量封闭成局部值。 闭包返回值受外部变量取值变化影响。 ? ? 十九,高阶函数 高阶函数即可以传入函数作为其参数函数。...case类本来设计用来进行模式匹配,自带applyunapply方法,实例化时可以不用new关键字。除了做了优化用于模式匹配,其它方面普通类没有什么区别。 1,java风格 ? ? ?...4,函数式编程 函数特点操作无副作用,唯一作用生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计默认数据结构绝大部分不可变

    1.6K30

    3小时Scala入门

    函数类型函数参数返回值类型映射关系, 如 Int => Unit , (Array[Int],String) => Int 。...函数函数参数返回值取值映射关系, 如 x => x+1 x,y => x+y 。 使用这种方式声明函数叫做匿名函数。 此外,当函数表达式中引用了非参数变量时,这种函数叫做闭包。...闭包特性每次调用它时都会将外部开放变量封闭成局部值。 闭包返回值受外部变量取值变化影响。 ? ? 十九,高阶函数 高阶函数即可以传入函数作为其参数函数。...case类本来设计用来进行模式匹配,自带applyunapply方法,实例化时可以不用new关键字。除了做了优化用于模式匹配,其它方面普通类没有什么区别。 1,java风格 ? ? ?...4,函数式编程 函数特点操作无副作用,唯一作用生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计默认数据结构绝大部分不可变

    1.6K30

    3小时Scala入门

    函数类型函数参数返回值类型映射关系, 如 Int => Unit , (Array[Int],String) => Int 。...函数函数参数返回值取值映射关系, 如 x => x+1 x,y => x+y 。 使用这种方式声明函数叫做匿名函数。 此外,当函数表达式中引用了非参数变量时,这种函数叫做闭包。...闭包特性每次调用它时都会将外部开放变量封闭成局部值。 闭包返回值受外部变量取值变化影响。 ? ? 十九,高阶函数 高阶函数即可以传入函数作为其参数函数。...case类本来设计用来进行模式匹配,自带applyunapply方法,实例化时可以不用new关键字。除了做了优化用于模式匹配,其它方面普通类没有什么区别。 1,java风格 ? ? ?...4,函数式编程 函数特点操作无副作用,唯一作用生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计默认数据结构绝大部分不可变

    3.5K20

    Python 工匠:让函数返回结果技巧

    而返回多种类型函数一定是违反“单一职责”原则函数应该总是提供稳定返回值,把调用方处理成本降到最低。...比如像上面不推荐返回值方式,正是缺乏异常 Go 语言中最核心错误处理机制。另外,即使异常机制本身,不同编程语言之间也存在着差别。...很多编程语言里都有与 None 类似的设计,比如 JavaScript 里 null、Go nil 等。因为 None 所拥有的独特 虚无 气质,它经常被作为函数返回值使用。...关键在于:函数签名(名称与参数)与 None 返回值之间是否存在一种“意料之中”暗示。...由函数签名“含义”所决定使用“空对象模式”可以简化调用方错误处理逻辑多使用生成器函数,尽量循环替代递归看完文章你,有没有什么想吐槽

    4.5K31

    2024-03-02:go语言,一个句子由一些单词与它们之间单个空格组成, 且句子开头结尾没有多余空格, 比方说,“H

    2024-03-02:go语言,一个句子由一些单词与它们之间单个空格组成, 且句子开头结尾没有多余空格, 比方说,"Hello World" ,"HELLO" ,"hello world hello..., 那么我们称这两个句子 相似的。...给你两个句子 sentence1 sentence2, 如果 sentence1 sentence2 相似的,请你返回 true ,否则返回 false。...2.初始化变量i、j,分别表示句子开头相似部分单词数量句子结尾相似部分单词数量。 3.循环比较w1w2中单词,直到遇到第一个不同单词或其中一个句子单词已经全部比较完毕。...6.循环结束后,得到j值,表示句子结尾相似部分单词数量。 7.返回i+j是否等于w1w2中较小单词数量,如果相等,则说明两个句子相似的,返回true;否则返回false。

    12920

    深度阅读之《100 Go Mistakes and How to Avoid Them》

    函数名反映它做了什么,而不是怎么做。虽然命名一直编程界难题,但不断尝试命名也是必要。日常 util, common, base 这些包名其实并不好。...另一种可选方法调用 strings.Clone 方法: 关于具名返回值。 什么时候需要给返回值命名呢?没有一个必须遵循原则。...函数代码比较长时,还是带上比较好,增加可读性,不然看代码的人一直要记住返回值是什么。 在同一个函数里,统一返回值风格,不要一会儿返回带名字参数,一会儿又直接 return。...defer 一个 func 时,参数马上就会求值 然后这个函数调用就会被压栈,等函数 return 时再来执行,参数之前已经算好了,如果参数不是指针,那程序行为可能就不是预期那样了。...这种情况还可以闭包解决,闭包内里参数就是在真正执行时候才去求值。下面这个闭包同时还包含一个参数: panic error 一般 error 都是作为返回值最后一个。

    1K10

    go 语言中并发特性

    1秒 } PS: 线程不同,goroutine没有唯一id,所以我们没办法专门q针对某个协程进行操作。...goroutine goroutine Go 语言并行设计核心。goroutine 一种比线程更轻量实现,十几个 goroutine 可能在底层就是几个线程。...实际上 Go 在 runtime、系统调用等多方面对 goroutine 调度进行了封装处理。 使用 goroutine 只需要简单在需要执行函数前添加 go 关键字即可。...不过需要注意,如果该函数具有返回值,那么返回值会被丢弃。所以什么时候 go 还需要酌情考虑。 接着我们通过一个案例来体验一下 Go 并发到底怎么样。...另外并发 bug 定位和解决老大难问题了,平时就要注意良好代码风格编程习惯。 PS: 后续勘误请点击阅读原文,进入开源电子书

    32210

    一名Java开发Go语言学习笔记:语言基本特性

    对于编程范式支持 在Java中,类一等公民。支持继承、组合,对函数式编程有一定支持。 在Go中,函数一等公民(多返回值),对于函数式编程支持较为完备。对面向对象完全通过组合来实现。...Java传参中,传一个函数,其实是通过一个匿名对象来传,而Go真正一个函数。但在编写时,Go需要把原型写一遍(设计有关,尽量简洁),而Java有语法糖可以写很简单。...(原函数第一个参数函数,并返回接受余下参数返回结果函数技术。...本质上来说就是把第一参数给处理掉,后面的参数处理以函数形式返回。Go不仅支持函数入参,也支持函数作为返回参数。 这点Java也可以做到,只不过还是用了对象那套方式套上去。...并发 JavaPOSIX原语义线程。而Go自己实现了一套用户态线程,或者说叫协程。 POSIX原语义线程总体来说易用性没这么,需要牢记一些知识点才可以避免踩坑。

    15510

    几个提升Go语言开发效率小技巧

    可变长参数 Go语言允许一个函数把任意数量值作为参数Go语言内置了...操作符,在函数最后一个形参才能使用...操作符,使用它必须注意如下事项: 可变长参数必须在函数列表最后一个; 把可变长参数当切片来解析...语言在设计师有代码洁癖,在设计上尽可能避免代码滥用,所以Go语言导包必须要使用,如果导包了但是没有使用的话就会产生编译错误,但有些场景我们会遇到只想导包,但是不使用情况,比如上文提到init函数,...,一般都是在屎上上堆屎,遇到可以方法就直接复用了,但是这个方法返回值我们并不一定都使用,还要绞尽脑汁给他想一个命名,有没有办法可以不处理不要返回值呢?...类型断言 我们通常都会使用interface,一种带方法interface,一种interface,Go1.18之前没有泛型,所以我们可以interface{}来作为一种伪泛型使用...,第二个参数就是对应元素值,map 第一个参数就是key,第二个参数就是对应值; for key, value := range T{} 判断mapkey是否存在 Go语言提供语法 value,

    90030
    领券