Go中函数重载的替代方案?

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

使用Golang是否可以像C#中的函数重载或可选参数那样工作?或者另一种方法?

函数重载和可选参数都不直接受支持。您可以围绕它们构建自己的arguments结构。我的意思是像这样(未经测试,可能无法工作…)编辑:


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