all: prefer strings.IndexByte over strings.Index

strings.IndexByte was introduced in go1.2 and it can be used
effectively wherever the second argument to strings.Index is
exactly one byte long.

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

Change-Id: I1ab5edb7c4ee9058084cfa57cbcc267c2597e793
Reviewed-on: https://go-review.googlesource.com/65930
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-21 19:01:27 +02:00 committed by Ian Lance Taylor
parent 5e92c41128
commit f22ba1f247
55 changed files with 81 additions and 81 deletions

View File

@ -189,7 +189,7 @@ func main() {
features = append(features, f)
continue
}
comma := strings.Index(f, ",")
comma := strings.IndexByte(f, ',')
for cname := range cmap {
f2 := fmt.Sprintf("%s (%s)%s", f[:comma], cname, f[comma:])
features = append(features, f2)

View File

@ -204,7 +204,7 @@ func (p *Package) loadDefines(f *File) {
line = strings.TrimSpace(line[8:])
var key, val string
spaceIndex := strings.Index(line, " ")
spaceIndex := strings.IndexByte(line, ' ')
tabIndex := strings.Index(line, "\t")
if spaceIndex == -1 && tabIndex == -1 {
@ -364,11 +364,11 @@ func (p *Package) guessKinds(f *File) []*Name {
continue
}
c1 := strings.Index(line, ":")
c1 := strings.IndexByte(line, ':')
if c1 < 0 {
continue
}
c2 := strings.Index(line[c1+1:], ":")
c2 := strings.IndexByte(line[c1+1:], ':')
if c2 < 0 {
continue
}
@ -2538,7 +2538,7 @@ func fieldPrefix(fld []*ast.Field) string {
if strings.HasPrefix(n.Name, "orig_") || strings.HasPrefix(n.Name, "_") {
continue
}
i := strings.Index(n.Name, "_")
i := strings.IndexByte(n.Name, '_')
if i < 0 {
continue
}

View File

@ -41,7 +41,7 @@ func (p *Package) godefs(f *File, srcfile string) string {
continue
}
s := strings.TrimSpace(c.Text[i+len("+godefs map"):])
i = strings.Index(s, " ")
i = strings.IndexByte(s, ' ')
if i < 0 {
fmt.Fprintf(os.Stderr, "invalid +godefs map comment: %s\n", c.Text)
continue

View File

@ -540,7 +540,7 @@ func init() {
for key, val := range knownFormats {
// key must be "typename format", and format starts with a '%'
// (formats containing '*' alone are not collected in this table)
i := strings.Index(key, "%")
i := strings.IndexByte(key, '%')
if i < 0 || !oneFormat(key[i:]) {
log.Fatalf("incorrect knownFormats key: %q", key)
}

View File

@ -364,7 +364,7 @@ func Main(archInit func(*Arch)) {
// _ in phase name also matches space
phase := name[4:]
flag := "debug" // default flag is debug
if i := strings.Index(phase, "/"); i >= 0 {
if i := strings.IndexByte(phase, '/'); i >= 0 {
flag = phase[i+1:]
phase = phase[:i]
}
@ -689,7 +689,7 @@ func addImportMap(s string) {
if strings.Count(s, "=") != 1 {
log.Fatal("-importmap argument must be of the form source=actual")
}
i := strings.Index(s, "=")
i := strings.IndexByte(s, '=')
source, actual := s[:i], s[i+1:]
if source == "" || actual == "" {
log.Fatal("-importmap argument must be of the form source=actual; source and actual must be non-empty")
@ -712,13 +712,13 @@ func readImportCfg(file string) {
}
var verb, args string
if i := strings.Index(line, " "); i < 0 {
if i := strings.IndexByte(line, ' '); i < 0 {
verb = line
} else {
verb, args = line[:i], strings.TrimSpace(line[i+1:])
}
var before, after string
if i := strings.Index(args, "="); i >= 0 {
if i := strings.IndexByte(args, '='); i >= 0 {
before, after = args[:i], args[i+1:]
}
switch verb {

View File

@ -1224,7 +1224,7 @@ func (p *noder) pragma(pos src.Pos, text string) syntax.Pragma {
fallthrough // because of //go:cgo_unsafe_args
default:
verb := text
if i := strings.Index(text, " "); i >= 0 {
if i := strings.IndexByte(text, ' '); i >= 0 {
verb = verb[:i]
}
prag := pragmaValue(verb)

View File

@ -1045,7 +1045,7 @@ func (lv *Liveness) showlive(v *ssa.Value, live bvec) {
s += fmt.Sprintf("entry to %s:", lv.fn.funcname())
} else if sym, ok := v.Aux.(*obj.LSym); ok {
fn := sym.Name
if pos := strings.Index(fn, "."); pos >= 0 {
if pos := strings.IndexByte(fn, '.'); pos >= 0 {
fn = fn[pos+1:]
}
s += fmt.Sprintf("call to %s:", fn)

View File

@ -475,8 +475,8 @@ func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, t
}
// compound sexpr
var argname string
colon := strings.Index(arg, ":")
openparen := strings.Index(arg, "(")
colon := strings.IndexByte(arg, ':')
openparen := strings.IndexByte(arg, '(')
if colon >= 0 && openparen >= 0 && colon < openparen {
// rule-specified name
argname = arg[:colon]
@ -817,7 +817,7 @@ func commute1(m string, cnt map[string]int, arch arch) []string {
}
// Split up input.
var prefix string
colon := strings.Index(m, ":")
colon := strings.IndexByte(m, ':')
if colon >= 0 && isVariable(m[:colon]) {
prefix = m[:colon+1]
m = m[colon+1:]
@ -912,7 +912,7 @@ func varCount1(m string, cnt map[string]int) {
return
}
// Split up input.
colon := strings.Index(m, ":")
colon := strings.IndexByte(m, ':')
if colon >= 0 && isVariable(m[:colon]) {
cnt[m[:colon]]++
m = m[colon+1:]

View File

@ -313,7 +313,7 @@ func testPos(t *testing.T, list []test, prefix, suffix string, extract func(*Fil
}
func stripAt(s string) (string, int) {
if i := strings.Index(s, "@"); i >= 0 {
if i := strings.IndexByte(s, '@'); i >= 0 {
return s[:i] + s[i+1:], i
}
return s, -1

View File

@ -137,7 +137,7 @@ func main() {
// so OS X 10.6 is uname version 10 and OS X 10.8 is uname version 12.
if gohostos == "darwin" {
rel := run("", CheckExit, "uname", "-r")
if i := strings.Index(rel, "."); i >= 0 {
if i := strings.IndexByte(rel, '.'); i >= 0 {
rel = rel[:i]
}
osx, _ := strconv.Atoi(rel)

View File

@ -215,7 +215,7 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo
// slash+1: if there's no slash, the value is -1 and start is 0; otherwise
// start is the byte after the slash.
for start := slash + 1; start < len(arg); start = period + 1 {
period = strings.Index(arg[start:], ".")
period = strings.IndexByte(arg[start:], '.')
symbol := ""
if period < 0 {
period = len(arg)

View File

@ -791,7 +791,7 @@ func renameFix(tab []rename) func(*ast.File) bool {
}
func parseName(s string) (ptr bool, pkg, nam string) {
i := strings.Index(s, ".")
i := strings.IndexByte(s, '.')
if i < 0 {
panic("parseName: invalid name " + s)
}

View File

@ -471,7 +471,7 @@ func typecheck1(cfg *TypeConfig, f interface{}, typeof map[interface{}]string, a
if strings.HasPrefix(t, "[") || strings.HasPrefix(t, "map[") {
// Lazy: assume there are no nested [] in the array
// length or map key type.
if i := strings.Index(t, "]"); i >= 0 {
if i := strings.IndexByte(t, ']'); i >= 0 {
typeof[n] = t[i+1:]
}
}
@ -512,11 +512,11 @@ func typecheck1(cfg *TypeConfig, f interface{}, typeof map[interface{}]string, a
key, value = "int", "rune"
} else if strings.HasPrefix(t, "[") {
key = "int"
if i := strings.Index(t, "]"); i >= 0 {
if i := strings.IndexByte(t, ']'); i >= 0 {
value = t[i+1:]
}
} else if strings.HasPrefix(t, "map[") {
if i := strings.Index(t, "]"); i >= 0 {
if i := strings.IndexByte(t, ']'); i >= 0 {
key, value = t[4:i], t[i+1:]
}
}

View File

@ -223,7 +223,7 @@ func (tg *testgoData) parallel() {
}
for _, e := range tg.env {
if strings.HasPrefix(e, "GOROOT=") || strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") {
val := e[strings.Index(e, "=")+1:]
val := e[strings.IndexByte(e, '=')+1:]
if strings.HasPrefix(val, "testdata") || strings.HasPrefix(val, "./testdata") {
tg.t.Fatalf("internal testsuite error: call to parallel with testdata in environment (%s)", e)
}

View File

@ -54,7 +54,7 @@ var Commands []*Command
// Name returns the command's name: the first word in the usage line.
func (c *Command) Name() string {
name := c.UsageLine
i := strings.Index(name, " ")
i := strings.IndexByte(name, ' ')
if i >= 0 {
name = name[:i]
}

View File

@ -87,7 +87,7 @@ func Parse(cmd string, defns []*Defn, args []string, i int) (f *Defn, value stri
name := arg[1:]
// If there's already a prefix such as "test.", drop it for now.
name = strings.TrimPrefix(name, cmd+".")
equals := strings.Index(name, "=")
equals := strings.IndexByte(name, '=')
if equals >= 0 {
value = name[equals+1:]
name = name[:equals]

View File

@ -496,7 +496,7 @@ func downloadPackage(p *load.Package) error {
return err
}
vers := runtime.Version()
if i := strings.Index(vers, " "); i >= 0 {
if i := strings.IndexByte(vers, ' '); i >= 0 {
vers = vers[:i]
}
if err := vcs.tagSync(root, selectTag(vers, tags)); err != nil {

View File

@ -699,7 +699,7 @@ func repoRootFromVCSPaths(importPath, scheme string, security web.SecurityMode,
//
// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".
func repoRootForImportDynamic(importPath string, security web.SecurityMode) (*repoRoot, error) {
slash := strings.Index(importPath, "/")
slash := strings.IndexByte(importPath, '/')
if slash < 0 {
slash = len(importPath)
}

View File

@ -139,7 +139,7 @@ func testStringPairs(t *testing.T, name string, tests []stringPairTest, f func(s
func testPatterns(t *testing.T, name, tests string, fn func(string, string) bool) {
var patterns []string
for _, line := range strings.Split(tests, "\n") {
if i := strings.Index(line, "#"); i >= 0 {
if i := strings.IndexByte(line, '#'); i >= 0 {
line = line[:i]
}
f := strings.Fields(line)

View File

@ -231,7 +231,7 @@ func (p *Package) copyBuild(pp *build.Package) {
// their own code to $GOROOT instead of using $GOPATH, but we assume that
// code will start with a domain name (dot in the first element).
func isStandardImportPath(path string) bool {
i := strings.Index(path, "/")
i := strings.IndexByte(path, '/')
if i < 0 {
i = len(path)
}

View File

@ -1074,7 +1074,7 @@ func strnputPad(s string, n int, pad []byte) {
var strdata []*Symbol
func addstrdata1(ctxt *Link, arg string) {
eq := strings.Index(arg, "=")
eq := strings.IndexByte(arg, '=')
dot := strings.LastIndex(arg[:eq+1], ".")
if eq < 0 || dot < 0 {
Exitf("-X flag requires argument of the form importpath.name=value")

View File

@ -326,7 +326,7 @@ func (d *deadcodepass) flood() {
}
for i, m := range methodsigs {
name := string(m)
name = name[:strings.Index(name, "(")]
name = name[:strings.IndexByte(name, '(')]
if !strings.HasSuffix(methods[i].ifn().Name, name) {
panic(fmt.Sprintf("%q relocation for %q does not match method %q", s.Name, methods[i].ifn().Name, name))
}

View File

@ -184,7 +184,7 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
local = expandpkg(local, pkg)
q = ""
if i := strings.Index(remote, "#"); i >= 0 {
if i := strings.IndexByte(remote, '#'); i >= 0 {
remote, q = remote[:i], remote[i+1:]
}
s = ctxt.Syms.Lookup(local, 0)

View File

@ -60,13 +60,13 @@ func (ctxt *Link) readImportCfg(file string) {
}
var verb, args string
if i := strings.Index(line, " "); i < 0 {
if i := strings.IndexByte(line, ' '); i < 0 {
verb = line
} else {
verb, args = line[:i], strings.TrimSpace(line[i+1:])
}
var before, after string
if i := strings.Index(args, "="); i >= 0 {
if i := strings.IndexByte(args, '='); i >= 0 {
before, after = args[:i], args[i+1:]
}
switch verb {

View File

@ -678,7 +678,7 @@ func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr stri
// Determine whether the match we're holding
// is the first or second argument.
if strings.Index(line, expr) > strings.Index(line, ",") {
if strings.Index(line, expr) > strings.IndexByte(line, ',') {
kind = dst
} else {
kind = src

View File

@ -303,7 +303,7 @@ func (s *formatState) parseIndex() bool {
start := s.nbytes
s.scanNum()
if s.nbytes == len(s.format) || s.nbytes == start || s.format[s.nbytes] != ']' {
end := strings.Index(s.format, "]")
end := strings.IndexByte(s.format, ']')
if end < 0 {
end = len(s.format)
}

View File

@ -63,7 +63,7 @@ func checkCanonicalFieldTag(f *File, field *ast.Field, seen *map[[2]string]token
// by containing a field named XMLName; see issue 18256.
continue
}
if i := strings.Index(val, ","); i >= 0 {
if i := strings.IndexByte(val, ','); i >= 0 {
if key == "xml" {
// Use a separate namespace for XML attributes.
for _, opt := range strings.Split(val[i:], ",") {

View File

@ -118,7 +118,7 @@ func DecryptPEMBlock(b *pem.Block, password []byte) ([]byte, error) {
return nil, errors.New("x509: no DEK-Info header in block")
}
idx := strings.Index(dek, ",")
idx := strings.IndexByte(dek, ',')
if idx == -1 {
return nil, errors.New("x509: malformed DEK-Info header")
}

View File

@ -161,7 +161,7 @@ func fetchCertIDs() ([]certID, error) {
}
if strings.HasPrefix(ln, sn) {
// extract hex value from parentheses.
id.serialNumber = ln[strings.Index(ln, "(")+1 : len(ln)-1]
id.serialNumber = ln[strings.IndexByte(ln, '(')+1 : len(ln)-1]
continue
}
if strings.TrimSpace(ln) == "X509v3 Subject Key Identifier:" {

View File

@ -45,7 +45,7 @@ func (s *Sym) PackageName() string {
pathend = 0
}
if i := strings.Index(s.Name[pathend:], "."); i != -1 {
if i := strings.IndexByte(s.Name[pathend:], '.'); i != -1 {
return s.Name[:pathend+i]
}
return ""
@ -58,7 +58,7 @@ func (s *Sym) ReceiverName() string {
if pathend < 0 {
pathend = 0
}
l := strings.Index(s.Name[pathend:], ".")
l := strings.IndexByte(s.Name[pathend:], '.')
r := strings.LastIndex(s.Name[pathend:], ".")
if l == -1 || r == -1 || l == r {
return ""

View File

@ -15,7 +15,7 @@ type tagOptions string
// parseTag splits a struct field's json tag into its name and
// comma-separated options.
func parseTag(tag string) (string, tagOptions) {
if idx := strings.Index(tag, ","); idx != -1 {
if idx := strings.IndexByte(tag, ','); idx != -1 {
return tag[:idx], tagOptions(tag[idx+1:])
}
return tag, tagOptions("")
@ -31,7 +31,7 @@ func (o tagOptions) Contains(optionName string) bool {
s := string(o)
for s != "" {
var next string
i := strings.Index(s, ",")
i := strings.IndexByte(s, ',')
if i >= 0 {
s, next = s[:i], s[i+1:]
}

View File

@ -115,7 +115,7 @@ func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, erro
// Split the tag from the xml namespace if necessary.
tag := f.Tag.Get("xml")
if i := strings.Index(tag, " "); i >= 0 {
if i := strings.IndexByte(tag, ' '); i >= 0 {
finfo.xmlns, tag = tag[:i], tag[i+1:]
}

View File

@ -1161,7 +1161,7 @@ func (d *Decoder) nsname() (name Name, ok bool) {
if !ok {
return
}
i := strings.Index(s, ":")
i := strings.IndexByte(s, ':')
if i < 0 {
name.Local = s
} else {

View File

@ -1247,7 +1247,7 @@ func (ctxt *Context) saveCgo(filename string, di *Package, cg *ast.CommentGroup)
// Split at colon.
line = strings.TrimSpace(line[4:])
i := strings.Index(line, ":")
i := strings.IndexByte(line, ':')
if i < 0 {
return fmt.Errorf("%s: invalid #cgo line: %s", filename, orig)
}
@ -1462,7 +1462,7 @@ func (ctxt *Context) match(name string, allTags map[string]bool) bool {
}
return false
}
if i := strings.Index(name, ","); i >= 0 {
if i := strings.IndexByte(name, ','); i >= 0 {
// comma-separated list
ok1 := ctxt.match(name[:i], allTags)
ok2 := ctxt.match(name[i+1:], allTags)
@ -1526,7 +1526,7 @@ func (ctxt *Context) match(name string, allTags map[string]bool) bool {
//
// An exception: if GOOS=android, then files with GOOS=linux are also matched.
func (ctxt *Context) goodOSArchFile(name string, allTags map[string]bool) bool {
if dot := strings.Index(name, "."); dot != -1 {
if dot := strings.IndexByte(name, '.'); dot != -1 {
name = name[:dot]
}
@ -1537,7 +1537,7 @@ func (ctxt *Context) goodOSArchFile(name string, allTags map[string]bool) bool {
// systems, such as android, to arrive without breaking existing code with
// innocuous source code in "android.go". The easiest fix: cut everything
// in the name before the initial _.
i := strings.Index(name, "_")
i := strings.IndexByte(name, '_')
if i < 0 {
return true
}

View File

@ -537,7 +537,7 @@ func stripCommonPrefix(lines []string) {
* Check for vertical "line of stars" and correct prefix accordingly.
*/
lineOfStars := false
if i := strings.Index(prefix, "*"); i >= 0 {
if i := strings.IndexByte(prefix, '*'); i >= 0 {
// Line of stars present.
if i > 0 && prefix[i-1] == ' ' {
i-- // remove trailing blank from prefix so stars remain aligned

View File

@ -374,7 +374,7 @@ func isJSType(mimeType string) bool {
// https://www.ietf.org/rfc/rfc4627.txt
mimeType = strings.ToLower(mimeType)
// discard parameters
if i := strings.Index(mimeType, ";"); i >= 0 {
if i := strings.IndexByte(mimeType, ';'); i >= 0 {
mimeType = mimeType[:i]
}
mimeType = strings.TrimSpace(mimeType)

View File

@ -49,7 +49,7 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
// len(s) > 0
// parse fraction a/b, if any
if sep := strings.Index(s, "/"); sep >= 0 {
if sep := strings.IndexByte(s, '/'); sep >= 0 {
if _, ok := z.a.SetString(s[:sep], 0); !ok {
return nil, false
}

View File

@ -257,7 +257,7 @@ func (d *WordDecoder) DecodeHeader(header string) (string, error) {
}
cur := start + len("=?")
i := strings.Index(header[cur:], "?")
i := strings.IndexByte(header[cur:], '?')
if i == -1 {
break
}

View File

@ -20,7 +20,7 @@ import (
// FormatMediaType returns the empty string.
func FormatMediaType(t string, param map[string]string) string {
var b bytes.Buffer
if slash := strings.Index(t, "/"); slash == -1 {
if slash := strings.IndexByte(t, '/'); slash == -1 {
if !isToken(t) {
return ""
}
@ -110,7 +110,7 @@ var ErrInvalidMediaParameter = errors.New("mime: invalid media parameter")
// The returned map, params, maps from the lowercase
// attribute to the attribute value with its case preserved.
func ParseMediaType(v string) (mediatype string, params map[string]string, err error) {
i := strings.Index(v, ";")
i := strings.IndexByte(v, ';')
if i == -1 {
i = len(v)
}
@ -146,7 +146,7 @@ func ParseMediaType(v string) (mediatype string, params map[string]string, err e
}
pmap := params
if idx := strings.Index(key, "*"); idx != -1 {
if idx := strings.IndexByte(key, '*'); idx != -1 {
baseName := key[:idx]
if continuation == nil {
continuation = make(map[string]map[string]string)

View File

@ -40,7 +40,7 @@ func Request() (*http.Request, error) {
func envMap(env []string) map[string]string {
m := make(map[string]string)
for _, kv := range env {
if idx := strings.Index(kv, "="); idx != -1 {
if idx := strings.IndexByte(kv, '='); idx != -1 {
m[kv[:idx]] = kv[idx+1:]
}
}

View File

@ -50,7 +50,7 @@ func readSetCookies(h Header) []*Cookie {
continue
}
parts[0] = strings.TrimSpace(parts[0])
j := strings.Index(parts[0], "=")
j := strings.IndexByte(parts[0], '=')
if j < 0 {
continue
}
@ -74,7 +74,7 @@ func readSetCookies(h Header) []*Cookie {
}
attr, val := parts[i], ""
if j := strings.Index(attr, "="); j >= 0 {
if j := strings.IndexByte(attr, '='); j >= 0 {
attr, val = attr[:j], attr[j+1:]
}
lowerAttr := strings.ToLower(attr)
@ -214,7 +214,7 @@ func readCookies(h Header, filter string) []*Cookie {
continue
}
name, val := parts[i], ""
if j := strings.Index(name, "="); j >= 0 {
if j := strings.IndexByte(name, '='); j >= 0 {
name, val = name[:j], name[j+1:]
}
if !isCookieNameValid(name) {

View File

@ -748,7 +748,7 @@ func parseRange(s string, size int64) ([]httpRange, error) {
if ra == "" {
continue
}
i := strings.Index(ra, "-")
i := strings.IndexByte(ra, '-')
if i < 0 {
return nil, errors.New("invalid range")
}

View File

@ -712,7 +712,7 @@ func ParseHTTPVersion(vers string) (major, minor int, ok bool) {
if !strings.HasPrefix(vers, "HTTP/") {
return 0, 0, false
}
dot := strings.Index(vers, ".")
dot := strings.IndexByte(vers, '.')
if dot < 0 {
return 0, 0, false
}
@ -880,8 +880,8 @@ func (r *Request) SetBasicAuth(username, password string) {
// parseRequestLine parses "GET /foo HTTP/1.1" into its three parts.
func parseRequestLine(line string) (method, requestURI, proto string, ok bool) {
s1 := strings.Index(line, " ")
s2 := strings.Index(line[s1+1:], " ")
s1 := strings.IndexByte(line, ' ')
s2 := strings.IndexByte(line[s1+1:], ' ')
if s1 < 0 || s2 < 0 {
return
}

View File

@ -2002,7 +2002,7 @@ func Redirect(w ResponseWriter, r *Request, url string, code int) {
}
var query string
if i := strings.Index(url, "?"); i != -1 {
if i := strings.IndexByte(url, '?'); i != -1 {
url, query = url[:i], url[i:]
}

View File

@ -475,7 +475,7 @@ func TestLookupDotsWithLocalSource(t *testing.T) {
}
loop:
for i, name := range names {
if strings.Index(name, ".") == len(name)-1 { // "localhost" not "localhost."
if strings.IndexByte(name, '.') == len(name)-1 { // "localhost" not "localhost."
for j := range names {
if j == i {
continue

View File

@ -505,8 +505,8 @@ func parse(rawurl string, viaRequest bool) (*URL, error) {
// RFC 3986, §3.3:
// In addition, a URI reference (Section 4.1) may be a relative-path reference,
// in which case the first path segment cannot contain a colon (":") character.
colon := strings.Index(rest, ":")
slash := strings.Index(rest, "/")
colon := strings.IndexByte(rest, ':')
slash := strings.IndexByte(rest, '/')
if colon >= 0 && (slash < 0 || colon < slash) {
// First path segment has colon. Not allowed in relative URL.
return nil, errors.New("first path segment in URL cannot contain colon")
@ -830,7 +830,7 @@ func parseQuery(m Values, query string) (err error) {
continue
}
value := ""
if i := strings.Index(key, "="); i >= 0 {
if i := strings.IndexByte(key, '='); i >= 0 {
key, value = key[:i], key[i+1:]
}
key, err1 := QueryUnescape(key)

View File

@ -104,7 +104,7 @@ func TestClearenv(t *testing.T) {
for _, pair := range origEnv {
// Environment variables on Windows can begin with =
// http://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
i := strings.Index(pair[1:], "=") + 1
i := strings.IndexByte(pair[1:], '=') + 1
if err := Setenv(pair[:i], pair[i+1:]); err != nil {
t.Errorf("Setenv(%q, %q) failed during reset: %v", pair[:i], pair[i+1:], err)
}

View File

@ -687,7 +687,7 @@ func dedupEnvCase(caseInsensitive bool, env []string) []string {
out := make([]string, 0, len(env))
saw := map[string]int{} // key => index into out
for _, kv := range env {
eq := strings.Index(kv, "=")
eq := strings.IndexByte(kv, '=')
if eq < 0 {
out = append(out, kv)
continue

View File

@ -1523,7 +1523,7 @@ func TestHostname(t *testing.T) {
}
want := runBinHostname(t)
if hostname != want {
i := strings.Index(hostname, ".")
i := strings.IndexByte(hostname, '.')
if i < 0 || hostname[0:i] != want {
t.Errorf("Hostname() = %q, want %q", hostname, want)
}

View File

@ -124,7 +124,7 @@ func buildUser(pwd *C.struct_passwd) *User {
// say: "It is expected to be a comma separated list of
// personal data where the first item is the full name of the
// user."
if i := strings.Index(u.Name, ","); i >= 0 {
if i := strings.IndexByte(u.Name, ','); i >= 0 {
u.Name = u.Name[:i]
}
return u

View File

@ -131,7 +131,7 @@ func matchUserIndexValue(value string, idx int) lineFunc {
// say: "It is expected to be a comma separated list of
// personal data where the first item is the full name of the
// user."
if i := strings.Index(u.Name, ","); i >= 0 {
if i := strings.IndexByte(u.Name, ','); i >= 0 {
u.Name = u.Name[:i]
}
return u, nil

View File

@ -294,7 +294,7 @@ func parseResult(t *testing.T, file string, lineno int, res string) []int {
out[n] = -1
out[n+1] = -1
} else {
k := strings.Index(pair, "-")
k := strings.IndexByte(pair, '-')
if k < 0 {
t.Fatalf("%s:%d: invalid pair %s", file, lineno, pair)
}
@ -457,7 +457,7 @@ Reading:
continue Reading
}
case ':':
i := strings.Index(flag[1:], ":")
i := strings.IndexByte(flag[1:], ':')
if i < 0 {
t.Logf("skip: %s", line)
continue Reading

View File

@ -829,7 +829,7 @@ func (re *Regexp) ExpandString(dst []byte, template string, src string, match []
func (re *Regexp) expand(dst []byte, template string, bsrc []byte, src string, match []int) []byte {
for len(template) > 0 {
i := strings.Index(template, "$")
i := strings.IndexByte(template, '$')
if i < 0 {
break
}

View File

@ -213,7 +213,7 @@ func profileOk(t *testing.T, need []string, prof bytes.Buffer, duration time.Dur
fprintStack(&buf, stk)
samples += count
for i, name := range need {
if semi := strings.Index(name, ";"); semi > -1 {
if semi := strings.IndexByte(name, ';'); semi > -1 {
kv := strings.SplitN(name[semi+1:], "=", 2)
if len(kv) != 2 || !contains(labels[kv[0]], kv[1]) {
continue

View File

@ -680,7 +680,7 @@ func verifyRange(name string, inCategory Op, table *unicode.RangeTable) {
}
func parseScript(line string, scripts map[string][]Script) {
comment := strings.Index(line, "#")
comment := strings.IndexByte(line, '#')
if comment >= 0 {
line = line[0:comment]
}