1
0
mirror of https://github.com/golang/go synced 2024-11-17 18:04:48 -07:00

all: prefer strings.LastIndexByte over strings.LastIndex

strings.LastIndexByte was introduced in go1.5 and it can be used
effectively wherever the second argument to strings.LastIndex is
exactly one byte long.

This avoids generating unnecessary string symbols and saves
a few calls to strings.LastIndex.

Change-Id: I7b5679d616197b055cffe6882a8675d24a98b574
Reviewed-on: https://go-review.googlesource.com/66372
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Marvin Stenger 2017-09-25 15:47:44 +02:00 committed by Ian Lance Taylor
parent e61c5e2f20
commit d2826d3e06
25 changed files with 39 additions and 39 deletions

View File

@ -376,7 +376,7 @@ func splitUSTARPath(name string) (prefix, suffix string, ok bool) {
length--
}
i := strings.LastIndex(name[:length], "/")
i := strings.LastIndexByte(name[:length], '/')
nlen := len(name) - i - 1 // nlen is length of suffix
plen := i // plen is length of prefix
if i <= 0 || nlen > nameSize || nlen == 0 || plen > prefixSize {

View File

@ -205,7 +205,7 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
}
// If it has a slash, it must be a package path but there is a symbol.
// It's the last package path we care about.
slash := strings.LastIndex(arg, "/")
slash := strings.LastIndexByte(arg, '/')
// There may be periods in the package path before or after the slash
// and between a symbol and method.
// Split the string at various periods to see what we find.

View File

@ -719,7 +719,7 @@ func usesImport(f *ast.File, path string) (used bool) {
case "<nil>":
// If the package name is not explicitly specified,
// make an educated guess. This is not guaranteed to be correct.
lastSlash := strings.LastIndex(path, "/")
lastSlash := strings.LastIndexByte(path, '/')
if lastSlash == -1 {
name = path
} else {

View File

@ -38,7 +38,7 @@ func initPrintFlags() {
// Backwards compatibility: skip optional first argument
// index after the colon.
if colon := strings.LastIndex(name, ":"); colon > 0 {
if colon := strings.LastIndexByte(name, ':'); colon > 0 {
name = name[:colon]
}

View File

@ -848,7 +848,7 @@ func hostnameInSNI(name string) string {
if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' {
host = host[1 : len(host)-1]
}
if i := strings.LastIndex(host, "%"); i > 0 {
if i := strings.LastIndexByte(host, '%'); i > 0 {
host = host[:i]
}
if net.ParseIP(host) != nil {

View File

@ -122,7 +122,7 @@ func DialWithDialer(dialer *net.Dialer, network, addr string, config *Config) (*
return nil, err
}
colonPos := strings.LastIndex(addr, ":")
colonPos := strings.LastIndexByte(addr, ':')
if colonPos == -1 {
colonPos = len(addr)
}

View File

@ -40,7 +40,7 @@ func (s *Sym) Static() bool { return s.Type >= 'a' }
// PackageName returns the package part of the symbol name,
// or the empty string if there is none.
func (s *Sym) PackageName() string {
pathend := strings.LastIndex(s.Name, "/")
pathend := strings.LastIndexByte(s.Name, '/')
if pathend < 0 {
pathend = 0
}
@ -54,12 +54,12 @@ func (s *Sym) PackageName() string {
// ReceiverName returns the receiver type name of this symbol,
// or the empty string if there is none.
func (s *Sym) ReceiverName() string {
pathend := strings.LastIndex(s.Name, "/")
pathend := strings.LastIndexByte(s.Name, '/')
if pathend < 0 {
pathend = 0
}
l := strings.IndexByte(s.Name[pathend:], '.')
r := strings.LastIndex(s.Name[pathend:], ".")
r := strings.LastIndexByte(s.Name[pathend:], '.')
if l == -1 || r == -1 || l == r {
return ""
}
@ -68,7 +68,7 @@ func (s *Sym) ReceiverName() string {
// BaseName returns the symbol name without the package or receiver name.
func (s *Sym) BaseName() string {
if i := strings.LastIndex(s.Name, "."); i != -1 {
if i := strings.LastIndexByte(s.Name, '.'); i != -1 {
return s.Name[i+1:]
}
return s.Name

View File

@ -333,7 +333,7 @@ func (p *printer) createAttrPrefix(url string) string {
// Pick a name. We try to use the final element of the path
// but fall back to _.
prefix := strings.TrimRight(url, "/")
if i := strings.LastIndex(prefix, "/"); i >= 0 {
if i := strings.LastIndexByte(prefix, '/'); i >= 0 {
prefix = prefix[i+1:]
}
if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") {

View File

@ -465,7 +465,7 @@ func (e *MultiplePackageError) Error() string {
}
func nameExt(name string) string {
i := strings.LastIndex(name, ".")
i := strings.LastIndexByte(name, '.')
if i < 0 {
return ""
}
@ -610,7 +610,7 @@ func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Packa
}
tried.vendor = append(tried.vendor, dir)
}
i := strings.LastIndex(sub, "/")
i := strings.LastIndexByte(sub, '/')
if i < 0 {
break
}
@ -1064,7 +1064,7 @@ func (ctxt *Context) matchFile(dir, name string, allTags map[string]bool, binary
return
}
i := strings.LastIndex(name, ".")
i := strings.LastIndexByte(name, '.')
if i < 0 {
i = len(name)
}

View File

@ -93,7 +93,7 @@ func decorate(s string, addFileLine bool) string {
_, file, line, ok := runtime.Caller(3) // decorate + log + public function.
if ok {
// Truncate file name at last file name separator.
if index := strings.LastIndex(file, "/"); index >= 0 {
if index := strings.LastIndexByte(file, '/'); index >= 0 {
file = file[index+1:]
} else if index = strings.LastIndex(file, "\\"); index >= 0 {
file = file[index+1:]

View File

@ -624,7 +624,7 @@ func (p *printer) writeComment(comment *ast.Comment) {
if strings.HasPrefix(text, linePrefix) && (!pos.IsValid() || pos.Column == 1) {
// possibly a line directive
ldir := strings.TrimSpace(text[len(linePrefix):])
if i := strings.LastIndex(ldir, ":"); i >= 0 {
if i := strings.LastIndexByte(ldir, ':'); i >= 0 {
if line, err := strconv.Atoi(ldir[i+1:]); err == nil && line > 0 {
// The line directive we are about to print changed
// the Filename and Line number used for subsequent

View File

@ -172,7 +172,7 @@ func (check *Checker) importPackage(pos token.Pos, path, dir string) *Package {
if i := len(name); i > 0 && name[i-1] == '/' {
name = name[:i-1]
}
if i := strings.LastIndex(name, "/"); i >= 0 {
if i := strings.LastIndexByte(name, '/'); i >= 0 {
name = name[i+1:]
}
imp = NewPackage(path, name)
@ -516,7 +516,7 @@ func (check *Checker) unusedImports() {
// pkgName returns the package name (last element) of an import path.
func pkgName(path string) string {
if i := strings.LastIndex(path, "/"); i >= 0 {
if i := strings.LastIndexByte(path, '/'); i >= 0 {
path = path[i+1:]
}
return path

View File

@ -812,7 +812,7 @@ func symbolize(events []*Event, bin string) error {
f := &Frame{PC: pc}
f.Fn = fn[:len(fn)-1]
f.File = file[:len(file)-1]
if colon := strings.LastIndex(f.File, ":"); colon != -1 {
if colon := strings.LastIndexByte(f.File, ':'); colon != -1 {
ln, err := strconv.Atoi(f.File[colon+1:])
if err == nil {
f.File = f.File[:colon]

View File

@ -330,7 +330,7 @@ func jarKey(host string, psl PublicSuffixList) string {
var i int
if psl == nil {
i = strings.LastIndex(host, ".")
i = strings.LastIndexByte(host, '.')
if i <= 0 {
return host
}
@ -349,7 +349,7 @@ func jarKey(host string, psl PublicSuffixList) string {
// here on, so it is okay if psl.PublicSuffix("www.buggy.psl")
// returns "com" as the jar key is generated from host.
}
prevDot := strings.LastIndex(host[:i-1], ".")
prevDot := strings.LastIndexByte(host[:i-1], '.')
return host[prevDot+1:]
}
@ -365,7 +365,7 @@ func defaultPath(path string) string {
return "/" // Path is empty or malformed.
}
i := strings.LastIndex(path, "/") // Path starts with "/", so i != -1.
i := strings.LastIndexByte(path, '/') // Path starts with "/", so i != -1.
if i == 0 {
return "/" // Path has the form "/abc".
}

View File

@ -37,7 +37,7 @@ func (testPSL) PublicSuffix(d string) string {
if d == "www2.buggy.psl" {
return "com"
}
return d[strings.LastIndex(d, ".")+1:]
return d[strings.LastIndexByte(d, '.')+1:]
}
// newTestJar creates an empty Jar with testPSL as the public suffix list.

View File

@ -35,7 +35,7 @@ func (k *contextKey) String() string { return "net/http context value " + k.name
// Given a string of the form "host", "host:port", or "[ipv6::address]:port",
// return true if the string includes a port.
func hasPort(s string) bool { return strings.LastIndex(s, ":") > strings.LastIndex(s, "]") }
func hasPort(s string) bool { return strings.LastIndexByte(s, ':') > strings.LastIndexByte(s, ']') }
// removeEmptyPort strips the empty port in ":port" to ""
// as mandated by RFC 3986 Section 6.2.3.

View File

@ -688,11 +688,11 @@ func removeZone(host string) string {
if !strings.HasPrefix(host, "[") {
return host
}
i := strings.LastIndex(host, "]")
i := strings.LastIndexByte(host, ']')
if i < 0 {
return host
}
j := strings.LastIndex(host[:i], "%")
j := strings.LastIndexByte(host[:i], '%')
if j < 0 {
return host
}

View File

@ -1236,7 +1236,7 @@ func useProxy(addr string) bool {
addr = strings.ToLower(strings.TrimSpace(addr))
if hasPort(addr) {
addr = addr[:strings.LastIndex(addr, ":")]
addr = addr[:strings.LastIndexByte(addr, ':')]
}
for _, p := range strings.Split(noProxy, ",") {
@ -1245,7 +1245,7 @@ func useProxy(addr string) bool {
continue
}
if hasPort(p) {
p = p[:strings.LastIndex(p, ":")]
p = p[:strings.LastIndexByte(p, ':')]
}
if addr == p {
return false
@ -1317,7 +1317,7 @@ func (cm *connectMethod) addr() string {
func (cm *connectMethod) tlsHost() string {
h := cm.targetAddr
if hasPort(h) {
h = h[:strings.LastIndex(h, ":")]
h = h[:strings.LastIndexByte(h, ':')]
}
return h
}

View File

@ -178,7 +178,7 @@ func (p *AddressParser) ParseList(list string) ([]*Address, error) {
// the name will be rendered according to RFC 2047.
func (a *Address) String() string {
// Format address local@domain
at := strings.LastIndex(a.Address, "@")
at := strings.LastIndexByte(a.Address, '@')
var local, domain string
if at < 0 {
// This is a malformed address ("@" is required in addr-spec);

View File

@ -592,7 +592,7 @@ func (server *Server) readRequestHeader(codec ServerCodec) (svc *service, mtype
// we can still recover and move on to the next request.
keepReading = true
dot := strings.LastIndex(req.ServiceMethod, ".")
dot := strings.LastIndexByte(req.ServiceMethod, '.')
if dot < 0 {
err = errors.New("rpc: service/method request ill-formed: " + req.ServiceMethod)
return

View File

@ -532,7 +532,7 @@ func parse(rawurl string, viaRequest bool) (*URL, error) {
}
func parseAuthority(authority string) (user *Userinfo, host string, err error) {
i := strings.LastIndex(authority, "@")
i := strings.LastIndexByte(authority, '@')
if i < 0 {
host, err = parseHost(authority)
} else {
@ -569,7 +569,7 @@ func parseHost(host string) (string, error) {
if strings.HasPrefix(host, "[") {
// Parse an IP-Literal in RFC 3986 and RFC 6874.
// E.g., "[fe80::1]", "[fe80::1%25en0]", "[fe80::1]:80".
i := strings.LastIndex(host, "]")
i := strings.LastIndexByte(host, ']')
if i < 0 {
return "", errors.New("missing ']' in host")
}
@ -885,7 +885,7 @@ func resolvePath(base, ref string) string {
if ref == "" {
full = base
} else if ref[0] != '/' {
i := strings.LastIndex(base, "/")
i := strings.LastIndexByte(base, '/')
full = base[:i+1] + ref
} else {
full = ref

View File

@ -26,7 +26,7 @@ func chkStat(file string) error {
}
func hasExt(file string) bool {
i := strings.LastIndex(file, ".")
i := strings.LastIndexByte(file, '.')
if i < 0 {
return false
}

View File

@ -145,7 +145,7 @@ func Clean(path string) string {
// file set to path.
// The returned values have the property that path = dir+file.
func Split(path string) (dir, file string) {
i := strings.LastIndex(path, "/")
i := strings.LastIndexByte(path, '/')
return path[:i+1], path[i+1:]
}
@ -187,7 +187,7 @@ func Base(path string) string {
path = path[0 : len(path)-1]
}
// Find the last element
if i := strings.LastIndex(path, "/"); i >= 0 {
if i := strings.LastIndexByte(path, '/'); i >= 0 {
path = path[i+1:]
}
// If empty now, it had only slashes.

View File

@ -360,7 +360,7 @@ func (c *common) decorate(s string) string {
_, file, line, ok := runtime.Caller(skip)
if ok {
// Truncate file name at last file name separator.
if index := strings.LastIndex(file, "/"); index >= 0 {
if index := strings.LastIndexByte(file, '/'); index >= 0 {
file = file[index+1:]
} else if index = strings.LastIndex(file, "\\"); index >= 0 {
file = file[index+1:]

View File

@ -253,7 +253,7 @@ func TestMonotonicString(t *testing.T) {
t1 := Now()
SetMono(&t1, tt.mono)
s := t1.String()
got := s[strings.LastIndex(s, " ")+1:]
got := s[strings.LastIndexByte(s, ' ')+1:]
if got != tt.want {
t.Errorf("with mono=%d: got %q; want %q", tt.mono, got, tt.want)
}