请问利用...刻意隐藏参数来实现默认值的写法是否应该纠正?

比如Substr() 如果不隐藏参数,第3个参数根本没法写, 写-+0都做不到,难道要乱写个10000000000000?
StrStr() 仅仅是为了方便使用;

go既然不支持参数默认值, 我这种刻意隐藏参数的写法,是否不应该?

package main

import (
    "bytes"
    "compress/gzip"
    "strings"
)

//Substr  截取字符串的一部分: 与PHP基本一样;
func Substr(str string, start int, length ...int) string {
    rs := []rune(str) //[]rune
    rl := len(rs)     //字符串长度
    end := 0
    // 负数索引计算
    if start < 0 {
        start = rl - 1 + start
    }
    if length != nil {
        // 负数: 到尾部-n字符停止;
        if length[0] < 0 {
            end = rl + length[0]
        } else {
            end = start + length[0]
        }
    } else {
        end = rl
    }
    /* 和网上案例不同, 不支持向前截取 */
    if start > end {
        return ""
    }
    // 修正开始部分
    if start < 0 {
        start = 0
    }
    if start > rl {
        start = rl
    }
    // 修正结束部分
    if end < 0 {
        end = 0
    }
    if end > rl {
        end = rl
    }
    return string(rs[start:end])
}
//StrStr   和PHP一样, 无匹配返回""
func StrStr(str string, sub string, before ...bool) string {
    rs := []rune(str)
    i := strings.Index(str, sub)
    if i == -1 {
        return ""
    }

    if before != nil {
        if before[0] {
            return string(rs[0:i])
        }
    }
    return string(rs[i:])
}

共 2 个回复


raymondlei

你的代码嘞?地址嘞?

# 0

jimmykuu

我觉得可以参考下标准库里的 strings.Replace(s, old, new string, n int) 的写法,毕竟不是 PHP,这个 subStr 如果不实现 PHP 的 substr 完全一样的功能,那么 length 可以设置一个负值或0,这种情况下,就取到末尾。

# 1