在utf8字符串判斷是否包含指定字符串,并返回下標(biāo)。
"北京天安門(mén)最美麗" , "天安門(mén)"
結(jié)果:2
成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),先為霍爾果斯等服務(wù)建站,霍爾果斯等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為霍爾果斯企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
解答:
import (
"fmt"
"strings"
)
func main(){
fmt.Println(Utf8Index("北京天安門(mén)最美麗", "天安門(mén)"))
fmt.Println(strings.Index("北京天安門(mén)最美麗", "男"))
fmt.Println(strings.Index("", "男"))
fmt.Println(Utf8Index("12ws北京天安門(mén)最美麗", "天安門(mén)"))
}
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
}
實(shí)現(xiàn)一個(gè)單例
解答:
package main
import "sync"
// 實(shí)現(xiàn)一個(gè)單例
type singleton struct{}
var ins *singleton
var mu sync.Mutex
//懶漢加鎖:雖然解決并發(fā)的問(wèn)題,但每次加鎖是要付出代價(jià)的
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實(shí)現(xiàn)
var once sync.Once
func GetIns2() *singleton {
once.Do(func() {
ins = &singleton{}
})
return ins
}
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 1000)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
}()
go func() {
for {
a, ok := <-ch
if !ok {
fmt.Println("close")
return
}
fmt.Println("a: ", a)
}
}()
close(ch)
fmt.Println("ok")
time.Sleep(time.Second * 100)
}
往已經(jīng)關(guān)閉的channel寫(xiě)入數(shù)據(jù)會(huì)panic的。
結(jié)果:
panic: send on closed channel
import "fmt"
type ConfigOne struct {
Daemon string
}
func (c *ConfigOne) String() string {
return fmt.Sprintf("print: %v", p)
}
func main() {
c := &ConfigOne{}
c.String()
}
如果類(lèi)型實(shí)現(xiàn)String(),%v和%v格式將使用String()的值。因此,對(duì)該類(lèi)型的String()函數(shù)內(nèi)的類(lèi)型使用%v會(huì)導(dǎo)致無(wú)限遞歸。
編譯報(bào)錯(cuò):
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
反轉(zhuǎn)整數(shù)
反轉(zhuǎn)一個(gè)整數(shù),例如:
例子1: x = 123, return 321
例子2: x = -123, return -321
輸入的整數(shù)要求是一個(gè) 32bit 有符號(hào)數(shù),如果反轉(zhuǎn)后溢出,則輸出 0
func reverse(x int) (num int) {
for x != 0 {
num = num*10 + x%10
x = x / 10
}
// 使用 math 包中定義好的最大最小值
if num > math.MaxInt32 || num < math.MinInt32 {
return 0
}
return
}
合并重疊區(qū)間
給定一組 區(qū)間,合并所有重疊的 區(qū)間。
例如:
給定:[1,3],[2,6],[8,10],[15,18]
返回:[1,6],[8,10],[15,18]
type Interval struct {
Start int
End int
}
func merge(intervals []Interval) []Interval {
if len(intervals) <= 1 {
return intervals
}
sort.Slice(intervals, func(i, j int) bool {
return intervals[i].Start < intervals[j].Start
})
res := make([]Interval, 0)
swap := Interval{}
for k, v := range intervals {
if k == 0 {
swap = v
continue
}
if v.Start <= swap.End {
swap.End = v.End
} else {
res = append(res, swap)
swap = v
}
}
res = append(res, swap)
return res
}
package main
import (
"fmt"
)
func main() {
fmt.Println(len("你好bj!"))
}
輸出9
package main
import "fmt"
type Test struct {
Name string
}
var list map[string]Test
func main() {
list = make(map[string]Test)
name := Test{"xiaoming"}
list["name"] = name
list["name"].Name = "Hello"
fmt.Println(list["name"])
}
編程報(bào)錯(cuò)cannot assign to struct field list["name"].Name in map
。
因?yàn)閘ist["name"]不是一個(gè)普通的指針值,map的value本身是不可尋址的,因?yàn)閙ap中的值會(huì)在內(nèi)存中移動(dòng),并且舊的指針地址在map改變時(shí)會(huì)變得無(wú)效。
定義的是var list map[string]Test,注意哦Test不是指針,而且map我們都知道是可以自動(dòng)擴(kuò)容的,那么原來(lái)的存儲(chǔ)name的Test可能在地址A,但是如果map擴(kuò)容了地址A就不是原來(lái)的Test了,所以go就不允許我們寫(xiě)數(shù)據(jù)。你改為var list map[string]*Test試試看。
type S struct {
}
func f(x interface{}) {
}
func g(x *interface{}) {
}
func main() {
s := S{}
p := &s
f(s) //A
g(s) //B
f(p) //C
g(p) //D
}
看到這道題需要第一時(shí)間想到的是Golang是強(qiáng)類(lèi)型語(yǔ)言,interface是所有g(shù)olang類(lèi)型的父類(lèi),類(lèi)似Java的Object。
函數(shù)中func f(x interface{})
的interface{}
可以支持傳入golang的任何類(lèi)型,包括指針,但是函數(shù)func g(x *interface{})
只能接受*interface{}
.
package main
import (
"sync"
//"time"
)
const N = 10
var wg = &sync.WaitGroup{}
func main() {
for i := 0; i < N; i++ {
go func(i int) {
wg.Add(1)
println(i)
defer wg.Done()
}(i)
}
wg.Wait()
}
這是使用WaitGroup經(jīng)常犯下的錯(cuò)誤!請(qǐng)各位同學(xué)多次運(yùn)行就會(huì)發(fā)現(xiàn)輸出都會(huì)不同甚至又出現(xiàn)報(bào)錯(cuò)的問(wèn)題。
這是因?yàn)?code>go執(zhí)行太快了,導(dǎo)致wg.Add(1)
還沒(méi)有執(zhí)行main函數(shù)就執(zhí)行完畢了。
改為如下試試
for i := 0; i < N; i++ {
wg.Add(1)
go func(i int) {
println(i)
defer wg.Done()
}(i)
}
wg.Wait()
https://zhuanlan.zhihu.com/p/35058068?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
https://stackoverflow.com/questions/42600920/runtime-goroutine-stack-exceeds-1000000000-byte-limit-fatal-error-stack-overf
https://studygolang.com/topics/3853
分享文章:Golang面試題解析(四)
標(biāo)題網(wǎng)址:http://aaarwkj.com/article14/pccpde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、外貿(mào)建站、微信小程序、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)