Go 基础数据类型:
-
布尔型
-
数字类型
-
字符串类型
-
错误类型
布尔型 bool
布尔型的值只能为 true 或 false , 例:
var v1 bool = truev1 := (2 > 1) //这种方式会自动推导为 bool 类型
布尔可以做3种逻辑运算,&& || !
支持的比较操作符:< > == != <= >=
NOTE 布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
数字类型
整型
整型类型主要为:
-
int8有符号 8 位整型 ( -128 到 127 ) -
uint8无符号 8 位整型 ( 0 到 255 ) -
byte类似uint8但不属于同一个类型 -
int16 -
uint16 -
uint32无符号 32 位整型 -
uint64无符号 64 位整型 -
int32 -
rune类似int32用UTF-8编码。例如循环字符串获取实际字符时就需要使用rune类型 -
int64 -
uint32 或 64 位,由硬件决定最大长度 -
int32 或 64 位,由硬件决定最大长度 -
uintptr无符号整型,用于存放一个指针
Go语言支持以下的常规整数运算:+ - * / % 。 其中 % 是求余运算。
5 % 3 //结果为:2
浮点型
浮点数
-
float3232位浮点数,精确到小数点后7位 -
float6464位浮点数,精确到小数点后15位
var v1 float32 //声明后默认为 0v2 := 12.0 //如果不加小数点,v2 会被推导为整型而不是浮点型
浮点数不能直接用 == 来判断两个浮点数是否相等。下面是一种推荐的替代方案:
import "math"const MIN = 0.000001// MIN 为用户自定义的比较精度func IsEqual(f1, f2 float64) bool { return math.Dim(f1, f2) < MIN}
复数
-
complex6432 位实数和虚数 -
complex12864 位实数和虚数
下边为声明 complex64 变量的例子:
func main() { var v1 complex64 //声明后默认为(0+0i) v1 = 3.2 + 12i v2 := 3.2 + 12i v3 := complex(3.2, 12) fmt.Println(v1, v2, v3)//输出结果为:(3.2+12i) (3.2+12i) (3.2+12i)}
字符串类型
字符串在Go中是 UTF-8 的由双引号(" )或反引号(`` )包裹的字符序列(类型为string)。如果使用单引号则表示一个字符(UTF-8编码)一旦给变量赋值,字符串就不能修改了。如果想要修改可使用如下方式:
package mainimport "fmt"func main() { s := "Hello, world!" c := []byte(s) //将字符串转换为[]byte类型 c[0] = 'c' s2 := string(c) //再转换为string fmt.Printf("%s\n", s2)}
或者使用另外一种方式:
package mainimport "fmt"func main() { s := "hello, world!" fmt.Printf("%c\n", s[0]) //输出h,注意输出时的格式为c s = "c" + s[1:] // 字符串虽不能更改,但可进行切片操作 fmt.Printf("%s\n", s) //输出结果:cello, world!}
连接两个字符串
package mainimport "fmt"func main() { str := "Starting part " + "Ending part" fmt.Println(str)}
NOTE 在循环中使用加号 + 拼接字符串并不是最高效的做法,更好的办法是使用函数 strings.Join() ,使用字节缓冲( bytes.Buffer )拼接更加给力!
字符类型 rune
在Go语言中支持两个字符类型,要给是byte(实际上是uint8的别名),代表UTF-8字符串的单个字节的值;另一个是rune,代表单个Unicode字符。关于rune相关操作,可查阅Go标准库的unicode包。另外unicode/utf8包也提供了UTF-8和Unicode之间的转换。
字符串遍历
Go语言支持两种方式遍历字符串。
-
以字节数组的方式遍历
-
以Unicode字符遍历
例:
package mainimport "fmt"func main() { str := "Hello, 你好, 世界" length := len(str) //以字节数组的方式遍历 for i := 0; i < length; i++ { ch := str[i] fmt.Println(i, ch) } //以Unicode字符遍历 for i,ch := range str { fmt.Println(i,ch)//ch的类型为rune }}
NOTE 以Unicode字符方式遍历时,每个字符的类型是rune,而不是byte。
错误类型 error
error类型本身就是一个预定义好的接口,里面定义了一个method。
type error interface { Error() string}
生成一个新的error并返回,一般有以下几种处理方式:
package mainimport ( "errors" "fmt")type CustomError struct { infoa string infob string Err error //声明后默认为nil}func (cerr CustomError) Error() string { errorinfo := fmt.Sprintf("infoa : %s , infob : %s , original err info : %s ", cerr.infoa, cerr.infob, cerr.Err.Error()) return errorinfo}func main() { //方法一:采用errors包的New方法 返回一个err的类型 var err error err = errors.New("this is a new error") //由于已经实现了error接口的方法 因此可以直接调用对应的方法 fmt.Println(err.Error()) //输出结果:error new //方法二: 采用fmt.Errorf 将string信息转化为error信息 并返回 err = fmt.Errorf("%s", "the error test for fmt.Errorf") fmt.Println(err.Error()) //输出结果:fmt.Errorf //方法三: 采用自定义的方式实现一个error的 一个duck 类型 err = &CustomError{ infoa: "err info a", infob: "err info b", Err: errors.New("test custom err"), } //输出结果:infoa : err info a , infob : err info b , original err info : custom err fmt.Println(err.Error())}