【Go基础】03 包 标准库
生活随笔
收集整理的這篇文章主要介紹了
【Go基础】03 包 标准库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 1. 包
- 1.1. 工作空間
- 1.2. 源文件
- 1.3. 包結構
- 1.3.1. 包結構 規則
- 1.3.2. 區分
- 1.3.3. 導入包
- 2. os
- 2.1. 文件操作
- 2.2. os/exec
- 3. fmt
- 3.1. 格式化輸出
- 3.2. println
- 4. log
- 4.1. 包結構
- 4.2. 日志輸出
- 5. 字符串處理
- 5.1. 字符(串)轉換
- 5.1.1. 字符串長度
- 5.2. 字符串運算
- 5.2.1. 常用函數
- 5.1. 字符(串)轉換
- 6. 指針
- 6.1. unsafe
- 6.2. 內存對齊問題:
- 7. 時間處理 time
- 7.1. time
學習資料
書籍:
1. 包
1.1. 工作空間
1.2. 源文件
1.3. 包結構
1.3.1. 包結構 規則
命名
包中成員以名稱大小寫決定訪問權限。
代碼示例:
// counters包 提供告警計數器功能 package counters//alterCounter是一個未公開的類型 // 用于保存告警計數器 type alterCounter int //--小寫字母開頭, 包外不可見, type AlterCounter int //--大寫字母開頭, 包外可見//說明:
參考:
1.3.2. 區分
1.3.3. 導入包
- 包管理// go mod go mod init go_demo
參考:
2. os
- 概述:
- 操作文件主要由兩個標準庫: os 和 ioutil
- os庫 主要用于操作文件, 主要用于操作系統功能;
2.1. 文件操作
2.2. os/exec
- 概述:
- exec包執行外部命令。它包裝了os.StartProcess函數以便更容易的修正輸入和輸出,使用管道連接I/O,以及作其它的一些調整。
參考:
3. fmt
3.1. 格式化輸出
- 格式:
參考:
3.2. println
參考:
4. log
參考:
4.1. 包結構
4.2. 日志輸出
格式及標志符
func init() {//log.SetPrefix("TRACE: ")log.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile) }func main() {// Println 寫到標準日志記錄器 --格式化輸出函數: 去掉 ln + flog.Println("message")// Fatalln 在調用 Println()之后會接著調用 os.Exit(1)log.Fatalln("fatal message")// Panicln 在調用 Println()之后會接著調用 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//== 相關結構體 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 – 類型轉換
- strings – 字符運算
-
比較
- 沒有其他語言中豐富的封裝函數(方法); --使用標準庫文件
-
字符串概述
- golang當中的字符串本質是只讀的字符型數組,不能通過下標進行修改;
- 和C語言當中的char[]類似,但是golang為它封裝了一個變量類型,叫做string。
5.1. 字符(串)轉換
- 方法:
- 常用 strconv包;
5.1.1. 字符串長度
計算字符串長度:
str := "hello 世界" fmt.Println(len(str)) //12 utf8: 一個漢字, 3個字節;str := "hello 世界" fmt.Println(len([]rune(str))) //8字符串轉換為 byte數組, 灰產出國內存拷貝嗎?
5.2. 字符串運算
- 方法:
- strings 標準庫;
5.2.1. 常用函數
==: 具體查看包內實現; // 1.字符串比較cmp := strings.Compare(str1, str2) // 2. 查找函數var theInd = strings.Index(str, "sub")var theLastIdx = strings.LastIndex(str, "last") //返回出現的最后一個位置;// Count和Repeat ==>次數統計strings.Count("abcabcabababc", "abc") //統計子字符串出現次數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: 可以參與指針運算;
6.1. unsafe
使用注意:
任何類型的指針值都可以轉換為Pointer // unsafe.Pointer(&a1) Pointer可以轉換為任何類型的指針值 // (*float32)(unsafe.Pointer(numPointer)) uintptr可以轉換為 Pointer // unsafe.Pointer(uintptr(nPointer) + + unsafe.Sizeof(&a) * 3) Pointer可以轉換為 uintptr // uintptr(unsafe.Pointer(numPointer))相關函數
// 返回類型所占的字節數 func Sizeof(x ArbitraryType) uintptr // 返回結構體中某個字段的偏移量; 字段需是 struct.field 形式//返回值: 結構體變量開始位置到該字段的開始位置 func Offsetof(x ArbitraryType) uintptr // 返回內存對齊時的對齊值; func Alignof(x ArbitraryType) uintptrreflect.TypeOf(bool(true)).Align()) 也可以計算內存對齊值;實際使用場景:
6.2. 內存對齊問題:
- 對齊規則1. 結構體的成員變量,第一個成員變量的偏移量為 0。往后的每個成員變量的對齊值必須為編譯器默認對齊長度(#pragma pack(n))或當前成員變量類型的長度(unsafe.Sizeof),取最小值作為當前類型的對齊值。其偏移量必須為對齊值的整數倍 2. 結構體本身,對齊值必須為編譯器默認對齊長度(#pragma pack(n))或結構體的所有成員變量類型中的最大長度,取最大數的最小整數倍作為對齊值 3. 結合以上兩點,可得知若編譯器默認對齊長度(#pragma pack(n))超過結構體內成員變量的類型最大長度時,默認對齊長度是沒有任何意義的 ==
參考:
7. 時間處理 time
import "time"7.1. time
參考:
總結
以上是生活随笔為你收集整理的【Go基础】03 包 标准库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 小球碰壁反弹and小球碰撞
- 下一篇: 网件r8000刷openwrt官方固件_