本篇博客涉及到go 的基礎數據類型、 go 語言中的運算符、轉義字符、格式化輸出、字符串操作
go 語言中的運算符
在 go 語言中,基本數據類型主要包括以下幾類:整數類型、浮點數類型、復數類型、布爾類型、字符串類型、字節類型(byte)、符文類型(rune)。
1.整數類型
- int: 有符號整數,其大小在不同平臺上可能有所不同(通常是32位或64位)。
- int8、int16、int32、int64:有符號整數類型、分別占用8位、16位、32位和64位。
- uint: 無符號整數、其大小在不同平臺上可能有所不同(通常是32或64位)。
- uint8、uint16、uint32、uint64:無符號整數類型、分別占用8位、16位、32位和64位。
- uintptr:無符號整數類型、用于存放指針。
package mainimport "fmt"func main() {var a int = 34var b int8 = 98var c uint 16 = 65535var d uintptr = 0x12345678fmt.Println("int", a)fmt.Println("int8", b)fmt.Println("uint16", c)fmt.Println("uintptr", d)
}
【注】有符號類型和無符號類型的區別
- 有符號整數:
有符號整數可以表示正數、負數和零、最高位(最左邊一位)用作符號位:0 表示正數, 1 表示負數。 - 無符號整數
無符號整數只能表示非負數(正數和零)。所有位都用于表示值,沒有符號位。
2.浮點數類型
- float32:32位浮點數類型。
- float64:64位浮點數類型。
package mainimport "fmt"func main() {var e float32 = 3.14var f float64 = 2.5346546fmt.Println("float32: ", e)fmt.Println("float64: ", f)
}
3.復數類型
- complex64: 由兩個float32組成的復數類型
- complex128: 由兩個float64組成的復數類型
package mainimport "fmt"func main() {var g complex64 = i + 2ivar g complex64 = 3.5 + 2.5ifmt.Println("complex64:", g)fmt.Println("complex128:", h)
}
4.布爾類型
- bool: 布爾類型只能取 'true’或 ‘false’.
package mainimport "fmt"func main() {var i bool = truevar j bool = falsefmt.Println("bool true:", i)fmt.Println("bool false:", j)
}
5.字符串類型
- string: 字符串類型,表示一串UTF-8編碼的字符。
package mainimport "fmt"func main() {var i bool = truevar j bool = falsefmt.Println("bool true:", i)fmt.Println("bool false:", j)
}
6.字節類型
- byte: ‘uint8’ 的別名,通常表示一個字節的數據
package mainimport "fmt"func main() {var l byte = 'A'fmt.Println("byte:", l)
}
7.符文類型
- rune: ‘int32’ 的別名,通常用于表示一個Unicode碼點。
package mainimport "fmt"func main() {var m rune = '你'fmt.Println("rune:", m)
}
go 語言中的運算符
在 go 語言中,運算符用于執行各種操作,如算術運算、比較、邏輯運算和位運算。
1.算數運算符
- +:加法
- -:減法
- *:乘法
- /:除法
- %:取余
package mainimport "fmt"func main() {a := 10b := 3fmt.Println("加法:", a + b) // 13fmt.Println("減法:", a - b) // 7fmt.Println("乘法:", a * b) // 30fmt.Println("除法:", a / b) // 3fmt.Println("取余:", a % b) // 1
}
2.關系運算符
- ==:等于
- !=:不等于
- <:小于
-
:大于
- <=:小于等于
-
=:大于等于
package mainimport "fmt"func main() {a := 10b := 20fmt.Println("等于:", a == b) // falsefmt.Println("不等于:", a != b) // truefmt.Println("小于:", a < b) // truefmt.Println("大于:", a > b) // falsefmt.Println("小于等于:", a <= b) // truefmt.Println("大于等于:", a >= b) // false
}
3.邏輯運算符
- &&:邏輯與(AND)
- ||:邏輯或(OR)
- !:邏輯非(NOT)
package mainimport "fmt"func main() {a := trueb := falsefmt.Println("邏輯與:", a && b) // falsefmt.Println("邏輯或:", a || b) // truefmt.Println("邏輯非:", !a) // false
}
4.位運算符
- &:按位與(AND)
- |:按位或(OR)
- ^:按位異或(XOR)
- &^:按位清零(AND NOT)
- <<:左移
- >>: 右移
package mainimport "fmt"func main() {a := 10 // 1010b := 3 // 0011fmt.Println("按位與:", a & b) // 0010 -> 2fmt.Println("按位或:", a | b) // 1011 -> 11fmt.Println("按位異或:", a ^ b) // 1001 -> 9fmt.Println("按位清零:", a &^ b) // 0100 -> 8c := 1 // 0001fmt.Println("左移:", c << 2) // 0100 -> 4fmt.Println("右移:", a >> 2) // 0010 -> 2
}
5.賦值運算符
- =:賦值
- +=:加后賦值
- -=:減后賦值
- *=:乘后賦值
- /=:除后賦值
- %=:取余后賦值
- &=:按位與后賦值
- |=:按位或后賦值
- ^=:按位異或后賦值
- <<=:左移后賦值
- />>=:右移后賦值
package mainimport "fmt"func main() {a := 5a += 3fmt.Println("加后賦值:", a) // 8a -= 2fmt.Println("減后賦值:", a) // 6a *= 2fmt.Println("乘后賦值:", a) // 12a /= 3fmt.Println("除后賦值:", a) // 4a %= 3fmt.Println("取余后賦值:", a) // 1
}
6.其它運算符
- ++:自增
- –:自減
package mainimport "fmt"func main() {a := 5a++fmt.Println("自增:", a) // 6a--fmt.Println("自減:", a) // 5
}
轉義字符
go 語言中,常見的轉義字符包括換行符、制表符、引號和反斜杠等。
1.常見轉義字符
- \a:響鈴(警報)
- \b:退格
- \f:換頁
- \n:換行
- \r:回車
- \t:水平制表符
- \v:垂直制表符
- \:反斜杠
- ":雙引號
- ':單引號
package mainimport "fmt"func main() {// 響鈴(警報)fmt.Println("響鈴(警報):\a")// 退格fmt.Println("退格:Hello\bWorld") // 輸出 "HellWorld"// 換頁fmt.Println("換頁:Hello\fWorld") // 換頁符常見于打印機控制// 換行fmt.Println("換行:Hello\nWorld")// 回車fmt.Println("回車:Hello\rWorld") // 輸出 "World"// 水平制表符fmt.Println("水平制表符:Hello\tWorld")// 垂直制表符fmt.Println("垂直制表符:Hello\vWorld")// 反斜杠fmt.Println("反斜杠:Hello\\World")// 雙引號fmt.Println("雙引號:Hello\"World\"")// 單引號fmt.Println("單引號:Hello\'World\'")
}
2.字符串字面值中的轉義字符
在字符串字面值中,轉義字符用于表示那些在正常情況下無法直接輸入的字符。例如:
package mainimport "fmt"func main() {var str string = "這是一個包含換行符的字符串:\n你好,世界!"fmt.Println(str)
}
3.使用反引號
在 go 語言中,可以使用反引號(···)創建原始字符串字面值,這種字符串字面值不支持轉義字符,所有的字符都按原樣處理。這對包含大量特殊字符或多行文本的字符串非常有用。例如:
package mainimport "fmt"func main() {var rawString string = `這是一個原始字符串字面值,
它可以包含多行文本,
以及各種特殊字符,例如 \n、\t 等,都會被按原樣處理。`fmt.Println(rawString)
}
格式化輸出
go 語言中提供了一些強大的內置函數,用于格式化輸出。這些函數主要包括 fmt.Print
、fmt.Println
、fmt.Printf
和fmt.Sprintf
。
1.fmt.Print
和fmt.Println
fmt.Print
: 直接輸出,不添加任何額外的字符。fmt.Println
: 輸出內容后會自動添加一個換行符。
package mainimport "fmt"func main() {fmt.Print("Hello, ")fmt.Print("Go!")// 輸出: Hello, Go!fmt.Println("Hello,")fmt.Println("Go!")// 輸出:// Hello,// Go!
}
2. fmt.Printf
fmt.Printg
函數是 go 語言中常用的格式化輸出方式。
package mainimport "fmt"func main() {name := "Alice"age := 30// 使用占位符 %s 和 %d 分別輸出字符串和整數fmt.Printf("Name: %s, Age: %d\n", name, age)// 使用占位符 %v 輸出變量的默認格式fmt.Printf("Name: %v, Age: %v\n", name, age)// 使用占位符 %+v 輸出帶字段名的變量的默認格式fmt.Printf("Name: %+v, Age: %+v\n", name, age)// 使用占位符 %T 輸出變量的類型fmt.Printf("Type of name: %T, Type of age: %T\n", name, age)// 使用占位符 %q 輸出帶雙引號的字符串fmt.Printf("Quoted name: %q\n", name)// 使用占位符 %b 輸出整數的二進制表示fmt.Printf("Binary age: %b\n", age)// 使用占位符 %x 和 %X 分別輸出整數的十六進制表示(小寫字母和大寫字母)fmt.Printf("Hexadecimal age (lowercase): %x\n", age)fmt.Printf("Hexadecimal age (uppercase): %X\n", age)// 使用占位符 %f 輸出浮點數的小數表示height := 1.75fmt.Printf("Height: %f\n", height)// 使用占位符 %.2f 指定浮點數的小數位數fmt.Printf("Height (2 decimal places): %.2f\n", height)
}
3. fmt.Sprintf
- `fmt.Sprintf``函數用于將格式化的字符串保存到變量中,而不是直接輸出到標準輸出流。
package mainimport "fmt"func main() {name := "Bob"age := 25// 使用 fmt.Sprintf 格式化字符串并保存到變量中formattedString := fmt.Sprintf("Name: %s, Age: %d", name, age)// 輸出格式化的字符串fmt.Println(formattedString)
}
字符串操作
在 go 語言中,字符串的操作主要包括字符串連接、獲取字符串長度、字符串切片、字符串查找、字符串替換等。
1.字符串連接
使用 +
運算符來連接字符串
package mainimport "fmt"func main() {str1 := "Hello"str2 := "World"result := str1 + " " + str2fmt.Println(result) // Output: Hello World
}
2.獲取字符串長度
使用len()
函數獲取字符串的長度
package mainimport "fmt"func main() {str := "Hello, World!"length := len(str)fmt.Println("Length of string:", length) // Output: 13
}
3.字符串切片
使用切片操作來獲取字符串的子串
package mainimport "fmt"func main() {str := "Hello, World!"substring := str[7:12]fmt.Println("Substring:", substring) // Output: World
}
4.字符串查找
使用strings
包提供的函數來查找字串在字符串中的位置
package mainimport ("fmt""strings"
)func main() {str := "Hello, World!"index := strings.Index(str, "World")fmt.Println("Index of 'World':", index) // Output: 7
}
5.字符串替換
使用strings
包提供的函數來替換字符串中的字串
package mainimport ("fmt""strings"
)func main() {str := "Hello, World!"newStr := strings.Replace(str, "World", "Gopher", -1)fmt.Println("New string:", newStr) // Output: Hello, Gopher!
}
6.字符串拼接
三種方式對字符串進行拼接,其中兩種為高性能模式,在涉及到性能要求時需注意。
package mainfunc main() {// 格式化輸出username := "bobby"age := 18address := "北京"mobile := "15687954621"fmt.Println("用戶名: "+username, ", 年齡: "+strconv.Itoa(age)+", 地址:"+address, ", 電話: "+mobile) // 極其難維護fmt.Printf("用戶名:%s, 年齡: %d, 地址: %s, 電話: %s\n", username, age, address, mobile) // 非常常用,但是性能沒有上面的好userMsg := fmt.Sprintf("用戶名:%s, 年齡: %d, 地址: %s, 電話: %s\r\n", username, age, address, mobile)fmt.Println(userMsg)// 通過srting的builder進行字符串拼接, 高性能var builder strings.Builderbuilder.WriteString("用戶名")builder.WriteString(username)builder.WriteString("年齡")builder.WriteString(strconv.Itoa(age))builder.WriteString("地址")builder.WriteString(address)builder.WriteString("電話")builder.WriteString(mobile)re := builder.String()fmt.Println(re)
}