本文目錄一覽:
- 1、如何將golangbyte轉換為字元串
- 2、golang 將字元串轉換成函數
- 3、golang 如何在ini文件指定位置 寫入字元串
- 4、基礎知識 – Golang 中的格式化輸入輸出
- 5、golang cgo 怎麼傳字元串
- 6、Golang 字元串比較
如何將golangbyte轉換為字元串
golang語言本身就是c的工具集,開發c的程序用到的大部分結構體,內存管理,攜程等,golang基本都有,他只是在這個基礎上又加了一些概念這裡說一個很小的問題,就是位元組數組轉string的問題,網上大部分都是這樣轉的(包括google上):string(p[:]),這個轉完了是有問題的,我們再來看一下string這個結構體:
struct String
{
byte* str;
intgo len;
};
這個結構體讓我想起了nginx的string,他是這樣定義的:
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
golang裡邊 string的概念其實不是以前遇到\0結尾的概念了,他其實就是一塊連續的內存,首地址+長度,上面那樣賦值,如果p裡邊有\0,他不會做處理這個時候,如果再對這個string做其他處理就可能出問題了,比如strconv.Atoi轉成int就有錯誤,解決辦法就是需要自己寫一個正規的轉換函數:
func byteString(p []byte) string {
for i := 0; i len(p); i++ {
if p[i] == 0 {
return string(p[0:i])
}
}
return string(p)
}
這樣就不會出問題了
golang 將字元串轉換成函數
通過String.valueOf(char)函數把字元轉化成字元串舉例char a=’A’;//定義一個字元aString str = String.valueOf(a);//把字元a轉換成字元串str
golang 如何在ini文件指定位置 寫入字元串
1、C語言標準庫提供了一系列文件操作函數。文件操作函數一般以f+單詞的形式來命名(f是file的簡寫),其聲明位於stdio.h頭文件當中。例如:fopen、fclose函數用於文件打開與關閉;fscanf、fgets函數用於文件讀取;fprintf、fputs函數用於文件寫入;ftell、fseek函數用於文件操作位置的獲取與設置。一般的C語言教程都有文件操作一章,可以找本教材進一步學習。2、常式:
#includestdio.hint a;char b,c[100];int main(){ FILE * fp1 = fopen(“input.ini”, “r”);//打開輸入文件 FILE * fp2 = fopen(“output.ini”, “w”);//打開輸出文件 if (fp1==NULL || fp2==NULL) {//若打開文件失敗則退出 puts(“不能打開文件!”); rturn 0; } fscanf(fp1,”%d”,a);//從輸入文件讀取一個整數 b=fgetc(fp1);//從輸入文件讀取一個字元 fgets(c,100,fp1);//從輸入文件讀取一行字元串 printf(“%ld”,ftell(fp1));//輸出fp1指針當前位置相對於文件首的偏移位元組數 fputs(c,fp2);//向輸出文件寫入一行字元串 fputc(b,fp2);//向輸出文件寫入一個字元 fprintf(fp2,”%d”,a);//向輸出文件寫入一個整數 fclose(fp1);//關閉輸入文件 fclose(fp2);//關閉輸出文件,相當於保存 return 0;}
基礎知識 – Golang 中的格式化輸入輸出
【格式化輸出】
// 格式化輸出:將 arg 列表中的 arg 轉換為字元串輸出
// 使用動詞 v 格式化 arg 列表,非字元串元素之間添加空格
Print(arg列表)
// 使用動詞 v 格式化 arg 列表,所有元素之間添加空格,結尾添加換行符
Println(arg列表)
// 使用格式字元串格式化 arg 列表
Printf(格式字元串, arg列表)
// Print 類函數會返回已處理的 arg 數量和遇到的錯誤信息。
【格式字元串】
格式字元串由普通字元和佔位符組成,例如:
“abc%+ #8.3[3]vdef”
其中 abc 和 def 是普通字元,其它部分是佔位符,佔位符以 % 開頭(註:%% 將被轉義為一個普通的 % 符號,這個不算開頭),以動詞結尾,格式如下:
%[旗標][寬度][.精度][arg索引]動詞
方括弧中的內容可以省略。
【旗標】
旗標有以下幾種:
空格:對於數值類型的正數,保留一個空白的符號位(其它用法在動詞部分說明)。
0 :用 0 進行寬度填充而不用空格,對於數值類型,符號將被移到所有 0 的前面。
其中 “0” 和 “-” 不能同時使用,優先使用 “-” 而忽略 “0”。
【寬度和精度】
「寬度」和「精度」都可以寫成以下三種形式:
數值 | * | arg索引*
其中「數值」表示使用指定的數值作為寬度值或精度值,「 」表示使用當前正在處理的 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉到下一個。「arg索引 」表示使用指定 arg 的值作為寬度值或精度值,如果這樣的話,要格式化的 arg 將自動跳轉到指定 arg 的下一個。
寬度值:用於設置最小寬度。
精度值:對於浮點型,用於控制小數位數,對於字元串或位元組數組,用於控制字元數量(不是位元組數量)。
對於浮點型而言,動詞 g/G 的精度值比較特殊,在適當的情況下,g/G 會設置總有效數字,而不是小數位數。
【arg 索引】
「arg索引」由中括弧和 arg 序號組成(就像上面示例中的 [3]),用於指定當前要處理的 arg 的序號,序號從 1 開始:
‘[‘ + arg序號 + ‘]’
【動詞】
「動詞」不能省略,不同的數據類型支持的動詞不一樣。
[通用動詞]
v:默認格式,不同類型的默認格式如下:
布爾型:t
整 型:d
浮點型:g
複數型:g
字元串:s
通 道:p
指 針:p
無符號整型:x
T:輸出 arg 的類型而不是值(使用 Go 語法格式)。
[布爾型]
t:輸出 true 或 false 字元串。
[整型]
b/o/d:輸出 2/8/10 進位格式
x/X :輸出 16 進位格式(小寫/大寫)
c :輸出數值所表示的 Unicode 字元
q :輸出數值所表示的 Unicode 字元(帶單引號)。對於無法顯示的字元,將輸出其轉義字元。
U :輸出 Unicode 碼點(例如 U+1234,等同於字元串 “U+%04X” 的顯示結果)
對於 o/x/X:
如果使用 “#” 旗標,則會添加前導 0 或 0x。
對於 U:
如果使用 “#” 旗標,則會在 Unicode 碼點後面添加相應的 ‘字元’(前提是該字元必須可顯示)
[浮點型和複數型]
b :科學計數法(以 2 為底)
e/E:科學計數法(以 10 為底,小寫 e/大寫 E)
f/F:普通小數格式(兩者無區別)
g/G:大指數(指數 = 6)使用 %e/%E,其它情況使用 %f/%F
[字元串或位元組切片]
s :普通字元串
q :雙引號引起來的 Go 語法字元串
x/X:十六進位編碼(小寫/大寫,以位元組為元素進行編碼,而不是字元)
對於 q:
如果使用了 “+” 旗標,則將所有非 ASCII 字元都進行轉義處理。
如果使用了 “#” 旗標,則輸出反引號引起來的字元串(前提是
字元串中不包含任何製表符以外的控制字元,否則忽略 # 旗標)
對於 x/X:
如果使用了 ” ” 旗標,則在每個元素之間添加空格。
如果使用了 “#” 旗標,則在十六進位格式之前添加 0x 前綴。
[指針類型]
p :帶 0x 前綴的十六進位地址值。
[符合類型]
複合類型將使用不同的格式輸出,格式如下:
結 構 體:{欄位1 欄位2 …}
數組或切片:[元素0 元素1 …]
映 射:map[鍵1:值1 鍵2:值2 …]
指向符合元素的指針:{}, [], map[]
複合類型本身沒有動詞,動詞將應用到複合類型的元素上。
結構體可以使用 “+v” 同時輸出欄位名。
【注意】
1、如果 arg 是一個反射值,則該 arg 將被它所持有的具體值所取代。
2、如果 arg 實現了 Formatter 介面,將調用它的 Format 方法完成格式化。
3、如果 v 動詞使用了 # 旗標(%#v),並且 arg 實現了 GoStringer 介面,將調用它的 GoString 方法完成格式化。
如果格式化操作指定了字元串相關的動詞(比如 %s、%q、%v、%x、%X),接下來的兩條規則將適用:
4。如果 arg 實現了 error 介面,將調用它的 Error 方法完成格式化。
5。如果 arg 實現了 string 介面,將調用它的 String 方法完成格式化。
在實現格式化相關介面的時候,要避免無限遞歸的情況,比如:
type X string
func (x X) String() string {
return Sprintf(“%s”, x)
}
在格式化之前,要先轉換數據類型,這樣就可以避免無限遞歸:
func (x X) String() string {
return Sprintf(“%s”, string(x))
}
無限遞歸也可能發生在自引用數據類型上面,比如一個切片的元素引用了切片自身。這種情況比較罕見,比如:
a := make([]interface{}, 1)
a[0] = a
fmt.Println(a)
【格式化輸入】
// 格式化輸入:從輸入端讀取字元串(以空白分隔的值的序列),
// 並解析為具體的值存入相應的 arg 中,arg 必須是變數地址。
// 字元串中的連續空白視為單個空白,換行符根據不同情況處理。
// \r\n 被當做 \n 處理。
// 以動詞 v 解析字元串,換行視為空白
Scan(arg列表)
// 以動詞 v 解析字元串,換行結束解析
Scanln(arg列表)
// 根據格式字元串中指定的格式解析字元串
// 格式字元串中的換行符必須和輸入端的換行符相匹配。
Scanf(格式字元串, arg列表)
// Scan 類函數會返回已處理的 arg 數量和遇到的錯誤信息。
【格式字元串】
格式字元串類似於 Printf 中的格式字元串,但下面的動詞和旗標例外:
p :無效
T :無效
e/E/f/F/g/G:功能相同,都是掃描浮點數或複數
s/v :對字元串而言,掃描一個被空白分隔的子串
對於整型 arg 而言,v 動詞可以掃描帶有前導 0 或 0x 的八進位或十六進位數值。
寬度被用來指定最大掃描寬度(不會跨越空格),精度不被支持。
如果 arg 實現了 Scanner 介面,將調用它的 Scan 方法掃描相應數據。只有基礎類型和實現了 Scanner 介面的類型可以使用 Scan 類方法進行掃描。
【注意】
連續調用 FScan 可能會丟失數據,因為 FScan 中使用了 UnreadRune 對讀取的數據進行撤銷,而參數 io.Reader 只有 Read 方法,不支持撤銷。比如:
golang cgo 怎麼傳字元串
第一步:all.bash
% cd $GOROOT/src
% ./all.bash
第一步有些突兀,因為 all.bash 僅僅調用了其它兩個 shell 腳本;make.bash 和 run.bash。如果你在使用 Windows 或 Plan 9,過程是一樣的,只是腳本擴展名變成了.bat 或.rc。對於本文中的其它腳本,請根據你的系統適當改動。
第二步:make.bash
. ./make.bash –no-banner
main.bash 來源於 all.bash,因此調用退出將正確終止便宜進程。main.bash 有三個主要工作,第一個是驗證編譯 Go 的環境是否完整。完整性檢查在過去幾年中建立,它通常嘗試避免使用已知的破損工具或必然失敗的環境進行編譯。
第三步. cmd/dist
gcc -O2 -Wall -Werror -ggdb -o cmd/dist/dist -Icmd/dist cmd/dist/*.c
一旦可用性檢查完畢,make.bash 將編譯產生 cmd/dist,cmd/dist取代了之前存在於Go 1 之前的Makefile 編譯系統。cmd/dist用來管理少量的pkg/runtime的代碼生成。cmd/dist 是C語言編寫的程序,能夠充分利用系統C編譯器和頭文件來處理大部分主機系統平台的檢測。cmd/dist通常用來檢測主機的操作系統和體系結構,即環境變數$GOHOSTOS和$GOHOSTARCH .如果是交叉編譯的話,變數 $GOOS和$GOARCH可能會由於你的設置而不同。事實上,Go 通常用作跨平台編譯器,只不過多數情況下,主機和目標系統一致而已。接下來,make.bash 調用cmd/dist 的引導參數的支持庫、 lib9、 libbio 和 libmach,使用編譯器套件,然後用自己的編譯器進行編譯。這些工具也是用 C 語言寫的中,但是由系統 C 編譯器編譯產生。
echo “# Building compilers and Go bootstrap tool for host, $GOHOSTOS/$GOHOSTARCH.”
buildall=”-a”
if [ “$1” = “–no-clean” ]; then
buildall=””
fi
./cmd/dist/dist bootstrap $buildall -v # builds go_bootstrap
使用的編譯器套件 cmd/dist 編譯產生一個版本的gotool,go_bootstrap。但go_bootstrap並不是完整得gotool,比方說 pkg/net 就是孤立的,避免了依賴於 cgo。要編譯的文件的列表以及它們的依賴項,是由cmd/dist編譯的 ,所以十分謹慎地避免引入新的生成依賴項 到 cmd/go。
第四步:go_bootstrap
現在, go_bootstrap 編譯完成了,make.bash 的最後一部就是使用 go_bootstrap 完成 Go 標準庫的編譯,包括整套 gotool 的替換版。
echo “# Building packages and commands for $GOOS/$GOARCH.”
“$GOTOOLDIR”/go_bootstrap install -gcflags “$GO_GCFLAGS” \
-ldflags “$GO_LDFLAGS” -v std
第五步:run.bash
現在,make.bash 完成了,運行回到了 all.bash,它將引用 run.bash。run.bash 的工作是編譯和測試標準庫,運行時以及語言測試套件。
Golang 字元串比較
字元串比較, 可以直接使用 == 進行比較, 也可用用 strings.Compare 比較
go 中字元串比較有三種方式:
上述代碼執行結果如下:
有時候要忽略大小寫比較, 可以使用 strings.EqualFold 字元串比較是否相等
通過源碼可看到 if ‘A’ = sr sr = ‘Z’ tr == sr+’a’-‘A’ 可以看到不區分大小寫的實現。
看個完整測試代碼:
執行結構
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/238805.html