47 lines · 965 B · Go
RawDownload
// Copyright 2015 The Go Authors.  All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file. // +build !amd64 package strings // TODO: implements short string optimization on non amd64 platforms// and get rid of strings_amd64.go // Index returns the index of the first instance of sep in s, or -1 if sep is not present in s.func Index(s, sep string) int {	n := len(sep)	switch {	case n == 0:		return 0	case n == 1:		return IndexByte(s, sep[0])	case n == len(s):		if sep == s {			return 0		}		return -1	case n > len(s):		return -1	}	// Rabin-Karp search	hashsep, pow := hashStr(sep)	var h uint32	for i := 0; i < n; i++ {		h = h*primeRK + uint32(s[i])	}	if h == hashsep && s[:n] == sep {		return 0	}	for i := n; i < len(s); {		h *= primeRK		h += uint32(s[i])		h -= pow * uint32(s[i-n])		i++		if h == hashsep && s[i-n:i] == sep {			return i - n		}	}	return -1}