1. 算法
1.1.1. 在utf8字符串判断是否包含指定字符串,并返回下标。 “北京天安门最美丽” , “天安门” 结果:2
显示代码
import (
"fmt"
"strings"
)
func main(){
fmt.Println(Utf8Index("北京天安门最美丽", "天安门"))
fmt.Println(strings.Index("北京天安门最美丽", "男"))
fmt.Println(strings.Index("", "男"))
fmt.Println(Utf8Index("12ws北京天安门最美丽", "天安门"))
}
func Utf8Index(str, substr string) int {
asciiPos := strings.Index(str, substr)
if asciiPos == -1 || asciiPos == 0 {
return asciiPos
}
pos := 0
totalSize := 0
reader := strings.NewReader(str)
for _, size, err := reader.ReadRune(); err == nil; _, size, err = reader.ReadRune() {
totalSize += size
pos++
// 匹配到
if totalSize == asciiPos {
return pos
}
}
return pos
}
这题不会做.......
1.1.2. 实现一个单例?
显示代码
package main
import "sync"
// 实现一个单例
type singleton struct{}
var ins *singleton
var mu sync.Mutex
//懒汉加锁:虽然解决并发的问题,但每次加锁是要付出代价的
func GetIns() *singleton {
mu.Lock()
defer mu.Unlock()
if ins == nil {
ins = &singleton{}
}
return ins
}
//双重锁:避免了每次加锁,提高代码效率
func GetIns1() *singleton {
if ins == nil {
mu.Lock()
defer mu.Unlock()
if ins == nil {
ins = &singleton{}
}
}
return ins
}
//sync.Once实现
var once sync.Once
func GetIns2() *singleton {
once.Do(func() {
ins = &singleton{}
})
return ins
}
以上部分资源来自网络
参考: go 夜读