【Go基础】03 包 标准库
生活随笔
收集整理的這篇文章主要介紹了
【Go基础】03 包 标准库
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
- 1. 包
- 1.1. 工作空間
- 1.2. 源文件
- 1.3. 包結(jié)構(gòu)
- 1.3.1. 包結(jié)構(gòu) 規(guī)則
- 1.3.2. 區(qū)分
- 1.3.3. 導(dǎo)入包
- 2. os
- 2.1. 文件操作
- 2.2. os/exec
- 3. fmt
- 3.1. 格式化輸出
- 3.2. println
- 4. log
- 4.1. 包結(jié)構(gòu)
- 4.2. 日志輸出
- 5. 字符串處理
- 5.1. 字符(串)轉(zhuǎn)換
- 5.1.1. 字符串長度
- 5.2. 字符串運(yùn)算
- 5.2.1. 常用函數(shù)
- 5.1. 字符(串)轉(zhuǎn)換
- 6. 指針
- 6.1. unsafe
- 6.2. 內(nèi)存對齊問題:
- 7. 時(shí)間處理 time
- 7.1. time
學(xué)習(xí)資料
書籍:
1. 包
1.1. 工作空間
1.2. 源文件
1.3. 包結(jié)構(gòu)
1.3.1. 包結(jié)構(gòu) 規(guī)則
命名
包中成員以名稱大小寫決定訪問權(quán)限。
代碼示例:
// counters包 提供告警計(jì)數(shù)器功能 package counters//alterCounter是一個(gè)未公開的類型 // 用于保存告警計(jì)數(shù)器 type alterCounter int //--小寫字母開頭, 包外不可見, type AlterCounter int //--大寫字母開頭, 包外可見//說明:
參考:
1.3.2. 區(qū)分
1.3.3. 導(dǎo)入包
- 包管理// go mod go mod init go_demo
參考:
2. os
- 概述:
- 操作文件主要由兩個(gè)標(biāo)準(zhǔn)庫: os 和 ioutil
- os庫 主要用于操作文件, 主要用于操作系統(tǒng)功能;
2.1. 文件操作
2.2. os/exec
- 概述:
- exec包執(zhí)行外部命令。它包裝了os.StartProcess函數(shù)以便更容易的修正輸入和輸出,使用管道連接I/O,以及作其它的一些調(diào)整。
參考:
3. fmt
3.1. 格式化輸出
- 格式:
參考:
3.2. println
參考:
4. log
參考:
4.1. 包結(jié)構(gòu)
4.2. 日志輸出
格式及標(biāo)志符
func init() {//log.SetPrefix("TRACE: ")log.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile) }func main() {// Println 寫到標(biāo)準(zhǔn)日志記錄器 --格式化輸出函數(shù): 去掉 ln + flog.Println("message")// Fatalln 在調(diào)用 Println()之后會(huì)接著調(diào)用 os.Exit(1)log.Fatalln("fatal message")// Panicln 在調(diào)用 Println()之后會(huì)接著調(diào)用 panic()log.Panicln("panic message") }//輸出: TRACE: 2021/04/19 18:55:55.188845 D:/GO/src/code.practise/test_log/test_log1.go:15: message TRACE: 2021/04/19 18:55:55.297291 D:/GO/src/code.practise/test_log/test_log1.go:18: fatal message//== 相關(guān)結(jié)構(gòu)體 const (Ldate = 1 << iota // the date in the local time zone: 2009/01/23Ltime // the time in the local time zone: 01:23:23Lmicroseconds // microsecond resolution: 01:23:23.123123. assumes Ltime.Llongfile // full file name and line number: /a/b/c/d.go:23Lshortfile // final file name element and line number: d.go:23. overrides LlongfileLUTC // if Ldate or Ltime is set, use UTC rather than the local time zoneLmsgprefix // move the "prefix" from the beginning of the line to before the messageLstdFlags = Ldate | Ltime // initial values for the standard logger )// 自定義logger Trace = log.New(ioutil.Discard,"TRACE: ",log.Ldate|log.Ltime|log.Lshortfile)Info = log.New(os.Stdout,"INFO: ",log.Ldate|log.Ltime|log.Lshortfile)Warning = log.New(os.Stdout,"WARNING: ",log.Ldate|log.Ltime|log.Lshortfile)Error = log.New(io.MultiWriter(file, os.Stderr),"ERROR: ",log.Ldate|log.Ltime|log.Lshortfile)不同日志方法的聲明
func (l *Logger) Fatal(v ...interface{}) func (l *Logger) Fatalf(format string, v ...interface{}) func (l *Logger) Fatalln(v ...interface{}) func (l *Logger) Flags() int func (l *Logger) Output(calldepth int, s string) error func (l *Logger) Panic(v ...interface{}) func (l *Logger) Panicf(format string, v ...interface{}) func (l *Logger) Panicln(v ...interface{}) func (l *Logger) Prefix() string func (l *Logger) Print(v ...interface{}) func (l *Logger) Printf(format string, v ...interface{}) func (l *Logger) Println(v ...interface{}) func (l *Logger) SetFlags(flag int) func (l *Logger) SetPrefix(prefix string)5. 字符串處理
-
常用的字符串處理包:
- strconv – 類型轉(zhuǎn)換
- strings – 字符運(yùn)算
-
比較
- 沒有其他語言中豐富的封裝函數(shù)(方法); --使用標(biāo)準(zhǔn)庫文件
-
字符串概述
- golang當(dāng)中的字符串本質(zhì)是只讀的字符型數(shù)組,不能通過下標(biāo)進(jìn)行修改;
- 和C語言當(dāng)中的char[]類似,但是golang為它封裝了一個(gè)變量類型,叫做string。
5.1. 字符(串)轉(zhuǎn)換
- 方法:
- 常用 strconv包;
5.1.1. 字符串長度
計(jì)算字符串長度:
str := "hello 世界" fmt.Println(len(str)) //12 utf8: 一個(gè)漢字, 3個(gè)字節(jié);str := "hello 世界" fmt.Println(len([]rune(str))) //8字符串轉(zhuǎn)換為 byte數(shù)組, 灰產(chǎn)出國內(nèi)存拷貝嗎?
5.2. 字符串運(yùn)算
- 方法:
- strings 標(biāo)準(zhǔn)庫;
5.2.1. 常用函數(shù)
==: 具體查看包內(nèi)實(shí)現(xiàn); // 1.字符串比較cmp := strings.Compare(str1, str2) // 2. 查找函數(shù)var theInd = strings.Index(str, "sub")var theLastIdx = strings.LastIndex(str, "last") //返回出現(xiàn)的最后一個(gè)位置;// Count和Repeat ==>次數(shù)統(tǒng)計(jì)strings.Count("abcabcabababc", "abc") //統(tǒng)計(jì)子字符串出現(xiàn)次數(shù)repeat := strings.Repeat("abc", 10) //abcabcabcabcabcabcabcabcabcabc// Replace、Split和Join 替換, 拆分, 組裝str := "abc,bbc,bbd"slice := strings.Split(str, ",")slice := []string{"aab", "aba", "baa"}str := strings.Join(slice, ",")6. 指針
- 包:
- unsafe: 可以參與指針運(yùn)算;
6.1. unsafe
使用注意:
任何類型的指針值都可以轉(zhuǎn)換為Pointer // unsafe.Pointer(&a1) Pointer可以轉(zhuǎn)換為任何類型的指針值 // (*float32)(unsafe.Pointer(numPointer)) uintptr可以轉(zhuǎn)換為 Pointer // unsafe.Pointer(uintptr(nPointer) + + unsafe.Sizeof(&a) * 3) Pointer可以轉(zhuǎn)換為 uintptr // uintptr(unsafe.Pointer(numPointer))相關(guān)函數(shù)
// 返回類型所占的字節(jié)數(shù) func Sizeof(x ArbitraryType) uintptr // 返回結(jié)構(gòu)體中某個(gè)字段的偏移量; 字段需是 struct.field 形式//返回值: 結(jié)構(gòu)體變量開始位置到該字段的開始位置 func Offsetof(x ArbitraryType) uintptr // 返回內(nèi)存對齊時(shí)的對齊值; func Alignof(x ArbitraryType) uintptrreflect.TypeOf(bool(true)).Align()) 也可以計(jì)算內(nèi)存對齊值;實(shí)際使用場景:
6.2. 內(nèi)存對齊問題:
- 對齊規(guī)則1. 結(jié)構(gòu)體的成員變量,第一個(gè)成員變量的偏移量為 0。往后的每個(gè)成員變量的對齊值必須為編譯器默認(rèn)對齊長度(#pragma pack(n))或當(dāng)前成員變量類型的長度(unsafe.Sizeof),取最小值作為當(dāng)前類型的對齊值。其偏移量必須為對齊值的整數(shù)倍 2. 結(jié)構(gòu)體本身,對齊值必須為編譯器默認(rèn)對齊長度(#pragma pack(n))或結(jié)構(gòu)體的所有成員變量類型中的最大長度,取最大數(shù)的最小整數(shù)倍作為對齊值 3. 結(jié)合以上兩點(diǎn),可得知若編譯器默認(rèn)對齊長度(#pragma pack(n))超過結(jié)構(gòu)體內(nèi)成員變量的類型最大長度時(shí),默認(rèn)對齊長度是沒有任何意義的 ==
參考:
7. 時(shí)間處理 time
import "time"7.1. time
參考:
總結(jié)
以上是生活随笔為你收集整理的【Go基础】03 包 标准库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 小球碰壁反弹and小球碰撞
- 下一篇: 网件r8000刷openwrt官方固件_