1. 程式人生 > 實用技巧 >go 對中文字串的操作

go 對中文字串的操作

go中對於中文字串的操作

統計字數

go在處理字串時,經常需要知道字串的字元數,但len()只計算字串位元組數,因此我們可以自定義處理字串個數的函式

func countNum(handlerStr string) int {
	r := []rune(handlerStr)
	return len(r)
}

擷取前10位字串

先統計字串的個數,然後進行擷取操作

func InterceptString(resStr string) string {
	result := resStr
	r := []rune(resStr)
	if len(r) >= 10{
		result = string(r[:10])
	}
	return result
}

參考部落格

golang學習筆記

如有錯誤,望請指正


以下內容與此篇部落格無關,純屬個人筆記

場景是需要返回interface{}資料

var parserLock = sync.Mutex{}
func ParserAllMatchRules(url, html string, pattern []rules.Rule, strategy int) (interface{}, error) {
	parserLock.Lock()
	if strategy != 2 && len([]rune(html)) > 800000 {
		parserLock.Unlock()
		return nil, errors.New("html is too long:" + url)
	}

	var assemblyData []interface{}

	for _, rule := range pattern {
		response := graphquery.ParseFromString(html, rule.Patterns)
		if response.Data != nil{
			resParseData := response.Data.(map[string]interface{})
			allUrlList := resParseData["data"].([]interface{})
			assemblyData = append(assemblyData, allUrlList...)
		} else {
			zap.S().Infow("more rule parse failed", "data", response.Data, "response", response)
		}
	}

	if len(assemblyData) == 0{
		zap.S().Infow("response parser length is zero", "resultData")
		parserLock.Unlock()
		return nil, errors.New("data length is zero")
	}

	//去除重複連結
	assemblyData = removeDuplicateElement(assemblyData)
	zap.S().Info("列表長度為:", len(assemblyData))

	parserLock.Unlock()
	resultData := map[string]interface{}{}
	resultData["data"] = assemblyData
	return resultData, nil
}

func removeDuplicateElement(languages []interface{}) []interface{} {
	result := make([]interface{}, 0, len(languages))
	temp := map[string]struct{}{}
	for _, item := range languages {
		resUrl := item.(map[string]interface{})["url"].(string)
		if resUrl == ""{
			continue
		}
		if _, ok := temp[resUrl]; !ok {
			temp[resUrl] = struct{}{}
			result = append(result, item)
		}
	}
	return result
}