基本數據類型和string之間的轉換 (1) 基本類型轉string 使用 fmt.Sprintf(“%參數”, 表達式) a. 通用: 參數含義 %v 值的預設格式表示 %+v 類似%v,但輸出結構體時會添加欄位名 %#v 值的Go語法表示 %T 值的類型的Go語法表示 %% 百分號 b. 布爾值 ...
基本數據類型和string之間的轉換
(1) 基本類型轉string
- 使用 fmt.Sprintf(“%參數”, 表達式)
a. 通用:
參數 | 含義 |
---|---|
%v | 值的預設格式表示 |
%+v | 類似%v,但輸出結構體時會添加欄位名 |
%#v | 值的Go語法表示 |
%T | 值的類型的Go語法表示 |
%% | 百分號 |
b. 布爾值:
參數 | 含義 |
---|---|
%t | 單詞true或false |
c. 整數:
參數 | 含義 |
---|---|
%b | 表示為二進位 |
%c | 該值對應的unicode碼值 |
%d | 表示為十進位 |
%o | 表示為八進位 |
%q | 該值對應的單引號括起來的go語法字元字面值,必要時會採用安全的轉義表示 |
%x | 表示為十六進位,使用a-f |
%X | 表示為十六進位,使用A-F |
%U | 表示為Unicode格式:U+1234,等價於"U+%04X" |
d. 浮點數與複數的兩個組分:
參數 | 含義 |
---|---|
%b | 無小數部分、二進位指數的科學計數法,如-123456p-78 |
%e | 科學計數法,如 -1234.456e+78 |
%E | 科學計數法,如 -1234.456E+78 |
%f | 有小數部分但無指數部分,如123.456 |
%F | 等價於 %f |
%g | 根據實際情況採用 %e 或 %f 格式(以獲得更簡潔、準確的輸出) |
%G | 根據實際情況採用 %E 或 %F 格式(以獲得更簡潔、準確的輸出) |
e. 字元串和[]byte:
參數 | 含義 |
---|---|
%s | 直接輸出字元串或者 []byte |
%q | 該值對應的雙引號括起來的go語法字元串字面值,必要時會採用安全的轉義表示 |
%x | 每個位元組用兩字元十六進位數表示(使用a-f) |
%X | 每個位元組用兩字元十六進位數表示(使用A-F) |
f. 指針:
參數 | 含義 |
---|---|
%p | 表示為十六進位,並加上前導的 0x |
狂吐槽,這種方式靈活多變,可以滿足所有要求,但實際上大多數情況下,轉 string 就是想看到一個值原本的樣子,為什麼不能每種類型給個預設參數呢?如果有不同需求再傳參啊,就像 .net 里的 ToString() 方法。
- 使用 strconv 包的函數
func FormatBool(b bool) string
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
func Itoa(i int) string // Itoa是FormatInt(i, 10) 的簡寫
base:指定進位(2到36)
fmt:表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指數為二進位)、'e'(-d.dddde±dd,十進位指數)、'E'(-d.ddddE±dd,十進位指數)、'g'(指數很大時用 'e' 格式,否則 'f' 格式)、'G'(指數很大時用 'E' 格式,否則 'f' 格式)。
prec:精度(排除指數部分):對 'f'、'e'、'E',它表示小數點後的數字個數;對 'g'、'G',它控制總的數字個數。如果 prec 為-1,則代表使用最少數量的、但又必需的數字來表示 f。
bitSize:表示 f 的來源類型(32:float32、64:float64),會據此進行舍入。
繼續狂吐槽,這種方式太二了,參數都是 64 位的,傳個 int32 還不行,必須先強轉成 int64,這不是浪費效率嗎。而且每種參數類型都對應一個方法,方法名還不同,因為,Golang 不支持方法重載。
(2) string 轉基本類型
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (n uint64, err error)
func ParseFloat(s string, bitSize int) (f float64, err error)
func FormatBool(b bool) string
func Atoi(s string) (i int, err error) // Atoi是ParseInt(s, 10, 0)的簡寫。
base:指定進位(2到36),如果base為0,則會從字元串前置判斷,"0x"是16進位,"0"是8進位,否則是10進位。
bitSize:指定結果必須能無溢出賦值的整數類型,0、8、16、32、64 分別代表 int、int8、int16、int32、int64;簡單的說,如果這個 string 所表示的真實值超出了 baseSize 所指定的類型的範圍,那麼就會發生溢出,雖然這個返回值是 64 位的,然並卵,看下麵的例子就明白了。
var str string = "999"
var num int64
num, _ = strconv.ParseInt(str, 10, 8)
fmt.Println(num) // 結果是 127
都無力吐槽了。
首先這些方法返回兩個值(Golang 允許函數有多個返回值),第一個是轉換結果,64 位的,如果你需要的是一個 32 位的值,那麼還需要強制轉換。
第二個是錯誤信息,如果不想看錯誤信息,可以用 _ (詳見空標識符)忽略。當發生錯誤時,返回的值是預設值 0。這就是說,你沒辦法 try catch 了。
值類型和引用類型
值類型: int、float、string、bool、數組、結構體struct
引用類型:指針、切片slice、map、管道channel、interface
註意:數組也是值類型,跟其他語言不同。
值類型通常在棧中分配,引用類型通常在堆中分配,當沒有任何一個引用指向該引用類型的地址時,GC 將其回收。
這裡說的是通常,而不是絕對,這是由於 Golang 中的逃逸機制導致的,這個逃逸機制以後再說。
空標識符
_
是一個特殊的標識符,稱為空標識符。它可以代表其他任何的標識符,但是它對應的值會被忽略,所以僅能作為占位符使用。
訪問級別
Golang 中沒有 public、private 等訪問修飾符,而是規定,常量名、變數名、函數名的首字母如果是大寫的,則可以被其他包訪問,如果是小寫的,則其他包不能訪問。
運算符
(1) 取模
a % b
的運算規則是 a - a / b * b
(2) ++ 和 --
Golang 中,只有 i++
,而沒有 ++i
。
自增和自減只能當做一個獨立的語句使用,j = i++
、if i++ > 0
等寫法都是錯的。
(3) 三元運算符
Golang 不支持三元運算符,請用 if else
。
這個我忍。
if
基本語法:
if 條件表達式 {
語句塊
} else {
語句塊
}
- 條件表達式不需要用
()
括起來,在一般情況下,加了 () 也不會報錯,但是不建議這麼做。如果條件表達式用有定義變數(見下文),那麼加了 () 會報錯。 - 語句塊必須包含在
{}
中,即便該語句塊中只包含一條語句。(自動加分號導致) else
必須寫在if
語句塊的}
後面,不能另起一行。(自動加分號導致)- 允許在條件表達式中聲明一個變數,以分號結尾,在這個變數後面再寫條件表達式,這個變數的作用域只在該條件邏輯塊內。
if age := 20; age > 18 {
fmt.Println("已成年")
} else {
fmt.Println("未成年")
}
我又要開始吐槽了,