golang字符串修改,golang 轉義字符

本文目錄一覽:

go處理中文字符串

先來看一個簡單的例子

輸出的結果為:

從上面例子中可以看出,string是以byte數組形式存儲的,而一個utf8格式的中文佔3個byte.要得到正確的中文字符的長度和分割,可以使用 rune 數組來拆分. rune類型是int32的別名,一個rune可以表示一個中文字符,go也提供了rune數組自動拆分string中文字符的方法 rt := []rune(str) .

我們再把上面例子修改一下:

得到的輸出結果為:

這樣就能比較好的處理中文了,而且不會出現亂碼的情況.

golang logger輸出格式怎麼修改

1.Logger結構

首先來看下類型Logger的定義:

type Logger struct {

mu sync.Mutex // ensures atomic writes; protects the following fields

prefix string // prefix to write at beginning of each line

flag int // properties

out io.Writer // destination for output

buf []byte // for accumulating text to write

}

主要有5個成員,其中3個我們比較熟悉,分別是表示Log前綴的 “prefix”,表示Log頭標籤的 “flag” ,以及Log的輸出目的地out。 buf是一個字節數組,主要用來存放即將刷入out的內容,相當於一個臨時緩存,在對輸出內容進行序列化時作為存儲目的地。 mu是一個mutex主要用來作線程安全的實習,當有多個goroutine同時往一個目的刷內容的時候,通過mutex保證每次寫入是一條完整的信息。

2.std及整體結構

在前一篇文章中我們提到了log模塊提供了一套包級別的簡單接口,使用該接口可以直接將日誌內容打印到標準錯誤。那麼該過程是怎麼實現的呢?其實就是通過一個內置的Logger類型的變量 “std” 來實現的。該變量使用:

var std = New(os.Stderr, “”, LstdFlags)

進行初始化,默認輸出到系統的標準輸出 “os.Stderr” ,前綴為空,使用日期加時間作為Log抬頭。

當我們調用 log.Print的時候是怎麼執行的呢?我們看其代碼:

func Print(v …interface{}) {

std.Output(2, fmt.Sprint(v…))

}

這裡實際就是調用了Logger對象的 Output方法,將日誌內容按照fmt包中約定的格式轉義後傳給Output。Output定義如下 :

func (l *Logger) Output(calldepth int, s string) error

其中s為日誌沒有加前綴和Log抬頭的具體內容,xxxxx 。該函數執行具體的將日誌刷入到對應的位置。

3.核心函數的實現

Logger.Output是執行具體的將日誌刷入到對應位置的方法。

該方法首先根據需要獲得當前時間和調用該方法的文件及行號信息。然後調用formatHeader方法將Log的前綴和Log抬頭先格式化好 放入Logger.buf中,然後再將Log的內容存入到Logger.buf中,最後調用Logger.out.Write方法將完整的日誌寫入到輸出目的地中。

由於寫入文件以及拼接buf的過程是線程非安全的,因此使用mutex保證每次寫入的原子性。

l.mu.Lock()

defer l.mu.Unlock()

將buf的拼接和文件的寫入放入這個後面,使得在多個goroutine使用同一個Logger對象是,不會弄亂buf,也不會雜糅的寫入。

該方法的第一個參數最終會傳遞給runtime.Caller的skip,指的是跳過的棧的深度。這裡我記住給2就可以了。這樣就會得到我們調用log 是所處的位置。

在golang的注釋中說鎖住 runtime.Caller的過程比較重,這點我還是不很了解,只是從代碼中看到其在這裡把鎖打開了。

if l.flag(Lshortfile|Llongfile) != 0 {

// release lock while getting caller info – it‘s expensive.

l.mu.Unlock()

var ok bool

_, file, line, ok = runtime.Caller(calldepth)

if !ok {

file = “???”

line = 0

}

l.mu.Lock()

}

在formatHeader裡面首先將前綴直接複製到Logger.buf中,然後根據flag選擇Log抬頭的內容,這裡用到了一個log模塊實現的 itoa的方法,作用類似c的itoa,將一個整數轉換成一個字符串。只是其轉換後將結果直接追加到了buf的尾部。

縱觀整個實現,最值得學習的就是線程安全的部分。在什麼位置合適做怎樣的同步操作。

4.對外接口的實現

在了解了核心格式化和輸出結構後,在看其封裝就非常簡單了,幾乎都是首先用Output進行日誌的記錄,然後在必要的時候 做os.exit或者panic的操作,這裡看下Fatal的實現。

func (l *Logger) Fatal(v …interface{}) {

l.Output(2, fmt.Sprint(v…))

os.Exit(1)

}

// Fatalf is equivalent to l.Printf() followed by a call to os.Exit(1).

func (l *Logger) Fatalf(format string, v …interface{}) {

l.Output(2, fmt.Sprintf(format, v…))

os.Exit(1)

}

// Fatalln is equivalent to l.Println() followed by a call to os.Exit(1).

func (l *Logger) Fatalln(v …interface{}) {

l.Output(2, fmt.Sprintln(v…))

os.Exit(1)

}

這裡也驗證了我們之前做的Panic的結果,先做輸出日誌操作。再進行panic。

go語言怎麼修改字符串中的某一個字符?

go語言的字符串是UTF-8編碼的、不可改變的字節序列。

要修改字符串,只能以原串為基礎,創建一個新串。下面的圖中是一個參考示例,提供了以原串為藍本,創建新串的兩種方法。

代碼

輸出

golang依次替換字符串中相同的值

不是的,分情況。

golang支持兩種類型的字符串字面量:解釋型字符串:雙引號括起來的字符串(““),轉義字符(如\n\r等)會被替換掉。

非解釋型字符串:用反引號(鍵盤左上角上的)括起來的字符串,轉義字符不會被解釋且可跨行(原樣輸出)

golang 字符串和整形之間怎麼轉換

var gostrs []string

var cstrs []*C.char

header := (*reflect.SliceHeader)(unsafe.Pointer(cstrs))

header.Data = cstrspointer

header.Len = cstrslength

for _, cstr := range cstrs {

gostrs = append(gostrs, C.GoString(cstr))

}

golang 將字符串轉換成函數

通過String.valueOf(char)函數把字符轉化成字符串舉例char a=’A’;//定義一個字符aString str = String.valueOf(a);//把字符a轉換成字符串str

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/235979.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:57
下一篇 2024-12-12 11:57

相關推薦

  • 英語年齡用連字符號(Hyphenation for English Age)

    英語年齡通常使用連字符號表示,比如 “five-year-old boy”。本文將從多個方面探討英語年齡的連字符使用問題。 一、英語年齡的表達方式 英語中表…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python中將字符串轉化為浮點數

    本文將介紹在Python中將字符串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字符串轉化為…

    編程 2025-04-29
  • Python字符轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智能等領域廣泛應用。在很多場景下需要將字符串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字符轉列…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python學習筆記:去除字符串最後一個字符的方法

    本文將從多個方面詳細闡述如何通過Python去除字符串最後一個字符,包括使用切片、pop()、刪除、替換等方法來實現。 一、字符串切片 在Python中,可以通過字符串切片的方式來…

    編程 2025-04-29
  • 使用Golang調用Python

    在現代軟件開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • Python計算中文字符個數

    本文將從多個方面對Python計算中文字符個數進行詳細的闡述,包括字符串長度計算、正則表達式統計和模塊使用方法等內容。 一、字符串長度計算 在Python中,計算字符串長度是非常容…

    編程 2025-04-29
  • Python中如何判斷字符為數字

    判斷字符是否為數字是Python編程中常見的需求,本文將從多個方面詳細闡述如何使用Python進行字符判斷。 一、isdigit()函數判斷字符是否為數字 Python中可以使用i…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29

發表回復

登錄後才能評論