Go中函数重载的替代方案?
使用Golang是否可以像C#中的函数重载或可选参数那样工作?或者另一种方法?函数重载和可选参数都不直接受支持。您可以围绕它们构建自己的arguments结构。我的意思是像这样(未经测试,可能无法工作…)编辑:Go中函数重载的替代方案?,go,overloading,Go,Overloading,使用Golang是否可以像C#中的函数重载或可选参数那样工作?或者另一种方法?函数重载和可选参数都不直接受支持。您可以围绕它们构建自己的arguments结构。我的意思是像这样(未经测试,可能无法工作…)编辑: Go中可选参数的惯用答案是包装函数: func do(a, b, c int) { // ... } func doSimply(a, b) { do(a, b, 42) } 函数重载被故意忽略,因为它使代码难以读取。有一些使用可变参数的提示,例如: sm1 := S
Go中可选参数的惯用答案是包装函数:
func do(a, b, c int) {
// ...
}
func doSimply(a, b) {
do(a, b, 42)
}
函数重载被故意忽略,因为它使代码难以读取。有一些使用可变参数的提示,例如:
sm1 := Sum(1, 2, 3, 4) // = 1 + 2 + 3 + 4 = 10
sm2 := Sum(1, 2) // = 1 + 2 = 3
sm3 := Sum(7, 1, -2, 0, 18) // = 7 + 1 + -2 + 0 + 18 = 24
sm4 := Sum() // = 0
func Sum(numbers ...int) int {
n := 0
for _,number := range numbers {
n += number
}
return n
}
或…接口{}
适用于任何类型:
Ul("apple", 7.2, "BANANA", 5, "cHeRy")
func Ul(things ...interface{}) {
fmt.Println("<ul>")
for _,it := range things {
fmt.Printf(" <li>%v</li>\n", it)
}
fmt.Println("</ul>")
}
Ul(“苹果”,7.2,“香蕉”,5,“奇瑞”)
函数(事物…接口{}){
格式打印项次(“”)
对于u,它:=范围内的事物{
fmt.Printf(“- %v
\n”,it)
}
格式打印项次(“
”)
}
我有时使用具有不同参数的新方法来构造对象的一种方法是使用“风味”伪类型。你可以在运动场上试试
你能给出一个具体的例子(同样用c#)说明你想做什么吗?
public void Compresser(string dstFilePath,string srcFilePath,string fileName)
public void Compresser(string srcFilePath,string fileName)
可能重复:那将是func Compress(srcFilePath string,fileName string)
和func CompressInto(dstFilePath字符串、srcFilePath字符串、文件名字符串)
在Go中。Go中现在允许使用可选参数。看看@MohitBhura,你的链接值得一读,但它并没有说现在允许使用可选参数。事实上,它提出了一种不同的方法来解决它们的缺失,基于空接口和可变参数,因为它使代码难以阅读。那完全是主观的。“我不这么认为,不总是这样。”老乌山我相信围棋设计师们同意你的观点,有时更难,有时更容易。然而,从经验上看,他们认为使用不当的案例数量远远超过使用良好的案例数量。所以总的来说,删除它们会使代码更容易阅读。记住,设计师们有几十年的行业定义经验。去操场的例子+1。@JonathanHartley你用更主观的东西超越了它。“字面上的行业定义”几乎是一个悖论。我们只需要定义一些新的东西,如果我们谈论的是一个现有的行业,为什么要定义它?Go似乎做了很多这样的假设,这对任何人都没有帮助。差劲的程序员会写差劲的代码,或者选择差劲的框架让他们这么做。当语言试图优化性能时,为糟糕的程序员优化是一个错误的选择。@Rads是的,这是公平的。请记住,我是在回复一条后来被删除的评论,我猜测这条评论太离谱了。这毫无意义,与func-FlavorANewSomething()没有区别
Ul("apple", 7.2, "BANANA", 5, "cHeRy")
func Ul(things ...interface{}) {
fmt.Println("<ul>")
for _,it := range things {
fmt.Printf(" <li>%v</li>\n", it)
}
fmt.Println("</ul>")
}
package main
import "fmt"
type flavorA struct{}
type flavorB struct{}
var FlavorA = flavorA{}
var FlavorB = flavorB{}
type Something struct {
i int
f float64
}
func (flavor flavorA) NewSomething(i int) *Something {
return &Something{i:i, f:0.0}
}
func (flavor flavorB) NewSomething(f float64) *Something {
return &Something{i:0, f:f}
}
func main() {
fmt.Println(FlavorA.NewSomething(1), FlavorB.NewSomething(2))
}