php中文网

Go playground上手尝试Golang函数重载

php中文网

go语言中,函数重载可以通过以下三种方法实现:使用类型别名创建具有不同参数类型的函数。定义接口并创建具有相同名称且不同参数类型的函数。使用接受任意类型参数的通用函数。

Go Playground 上动手实践 Golang 函数重载

在 Go 语言中,函数重载是指创建具有相同名称但不同参数的多个函数。虽然 Go 不支持传统意义上的函数重载,但可以通过其他方法来实现类似的效果。

方法一:类型别名

立即学习“go语言免费学习笔记(深入)”;

可以使用类型别名来定义不同参数类型的函数,从而模拟函数重载:

package main

import "fmt"

type IntFunc func(int) int
type StringFunc func(string) string

func Add(n int) int {
    return n + 1
}

func Add(s string) string {
    return s + " World"
}

func main() {
    fmt.Println(Add(1))  // 输出: 2
    fmt.Println(Add("Hello"))  // 输出: Hello World
}

方法二:接口

接口是一种定义一组方法签名的类型。可以使用接口来创建一组具有相同名称且不同参数类型的函数:

package main

import "fmt"

type Adder interface {
    Add(x int) int
    Add(s string) string
}

type IntAdder struct {}

func (i IntAdder) Add(x int) int {
    return x + 1
}

type StringAdder struct {}

func (s StringAdder) Add(s string) string {
    return s + " World"
}

func main() {
    var adder Adder
    adder = IntAdder{}
    fmt.Println(adder.Add(1))  // 输出: 2

    adder = StringAdder{}
    fmt.Println(adder.Add("Hello"))  // 输出: Hello World
}

方法三:通用函数

通用函数是接受任何类型参数的函数。可以使用空接口(interface{})来创建通用函数:

package main

import "fmt"

func Add(x interface{}) interface{} {
    switch x := x.(type) {
    case int:
        return x + 1
    case string:
        return x + " World"
    default:
        return nil
    }
}

func main() {
    fmt.Println(Add(1))  // 输出: 2
    fmt.Println(Add("Hello"))  // 输出: Hello World
}

实战案例:字符串处理

以下是一个使用函数重载来处理字符串的实战案例:

package main

import "fmt"

func Trim(s string, sep ...string) string {
    if len(sep) == 0 {
        sep = []string{" "}
    }
    for _, v := range sep {
        s = TrimLeft(s, v)
        s = TrimRight(s, v)
    }
    return s
}

func TrimLeft(s string, sep string) string {
    i := 0
    for ; i < len(s); i++ {
        if !strings.Contains(sep, s[i:i+1]) {
            break
        }
    }
    return s[i:]
}

func TrimRight(s string, sep string) string {
    i := len(s) - 1
    for ; i >= 0; i-- {
        if !strings.Contains(sep, s[i:i+1]) {
            break
        }
    }
    return s[:i+1]
}

func main() {
    s := "  Hello World  "
    fmt.Println(Trim(s))  // 输出: Hello World
    fmt.Println(Trim(s, "o"))  // 输出: Hell Wrld
}

以上就是Go playground上手尝试Golang函数重载的详细内容,更多请关注php中文网其它相关文章!