一、基本数据类型

1.数值类型

有符号整数
  • int //根据系统,32系统就是int32,64位系统就int64
  • int8 // [-128,127]
  • int16 //[-32768,32767]
  • int32 //[-2147483648,2147483647]
  • int64 //[-9223372036854775808,9223372036854775807]

无符号整数
  • uint //与rune互为别名,
  • uint8 //[0,255]
  • uint16 //[0,65535]
  • uint32 //[0,4294967295]
  • uint64 //[0,18446744073709551615]

存放指针的类型

-uintptr //一个可以恰好容纳指针值的无符号整数类型(32系统为uint32,64位系统为uint64)

浮点类型
  • fload32
  • fload64

复数类型
  • complex64
  • complex128

2.布尔类型

  • bool

3.字符及字符串

  • rune //字符类型,uint32别名,go默认用utf8编码,最长utf8编码的字符为4字节,所以采用无符号位的unit32表示字符, (rune == uint32 == [4]byte == 32Bit)
  • string //字符串类型,默认utf8编码通常与字节切片互转[]byte

4.字节

  • byte //这种类型在go编程中很常见,其官方包很多数值传输都使用字节切片[]byte

如没声明类型,go会自动识别:

  1. //整型
  2. var v1 = 123
  3. //浮点型
  4. var v2 = 3.14
  5. //字符
  6. var v3 = '我'
  7. //字符串
  8. var v4 = "我是fun"
  9. //布尔值
  10. var v5 = false
  11. //格式化打印
  12. fmt.Printf("v1变量的类型为%T,值为%v\n", v1, v1)
  13. fmt.Printf("v1变量的类型为%T,值为%v\n", v2, v2)
  14. fmt.Printf("v1变量的类型为%T,字符序号为%v,字符为%c,十六进制为%x ,二进制位%b\n ", v3, v3, v3, v3, v3)
  15. fmt.Printf("v1变量的类型为%T,值为%v\n", v4, v4)
  16. fmt.Printf("v1变量的类型为%T,值为%v\n", v5, v5)
  17. //Output:
  18. //v1变量的类型为int,值为123
  19. //v2变量的类型为float64,值为3.14
  20. //v3变量的类型为int32,字符序号为25105,字符为我,十六进制为6211 ,二进制位110001000010001
  21. //v4变量的类型为string,值为我是fun
  22. //v5变量的类型为bool,值为false

二、变量

1.变量声明及赋值

与其他语言不同,Go的类型声明是后置的

  1. var a int64 //变量类型声明
  2. var b fload64 = 3.14 //变量预赋值
  3. c := aaa //未声明变量使用冒等自动类型赋值
  4. a = 2 //已声明变量可直接等号赋值

2.多个变量一并声明、赋值

  1. var a,b int32 //一次声明两个同类型变量
  2. var c,d int32 = 4,5 //一次声明两个同类型变量并赋值
  3. e,f := "aaa",123 //冒等一次赋值两变量,可不同类型
  4. //可将var提取出来
  5. var (
  6. a int64
  7. b string
  8. )

三、常量

  1. //声明常量
  2. const PI = 3.14
  3. //声明多个常量
  4. const (
  5. LightSpeed = 30 * 10000
  6. earthCircle = 40000
  7. )
  8. //使用iota定义常量
  9. const (
  10. MONDAY = iota + 1
  11. /*自动延用排头兵的表达式,但iota逐一递增*/
  12. TUESDAY
  13. WEDNESDAy
  14. THURSDAY
  15. FRIDAY
  16. SATURDAY
  17. SUNDAY
  18. )
  19. const (
  20. USA = (iota + 1) * 1000
  21. CHINA
  22. RUSSIA
  23. BRITAIN
  24. FRANCE
  25. )
  26. fmt.Println(MONDAY, TUESDAY, WEDNESDAy, THURSDAY, FRIDAY, SATURDAY, SUNDAY)
  27. fmt.Println(USA, CHINA, RUSSIA, BRITAIN, FRANCE)
  28. Output:
  29. 1 2 3 4 5 6 7
  30. 1000 2000 3000 4000 5000

四、枚举

  1. //这种写法可以让值为整数类型,但打印输出为字符串*/
  2. type Gender int
  3. func (g Gender) String() string {
  4. return []string{"Male", "Female", "Bisexual"}[g]
  5. }
  6. const (
  7. //男的
  8. Male = iota
  9. //女的
  10. Female
  11. //二椅子
  12. Bisexual
  13. )

五、类型转换

类型转换要点

  • 相互兼容的不同类型可以相互转换,如数值类型之间(可能发生精度丢失)、非数值类型之间(字符、字节)
  • 非兼容类型转换需要标准包支持,如数值和非数值类型之间的转换

基本语法结构:

  1. resultOfType := Type(expression)

示例:

  1. //相互兼容的数值类型转换
  2. var a int = 1
  3. var b float64 = 3.1415
  4. aa := float64(a)
  5. bb := int(b)
  6. fmt.Printf("a: Type=%T,Value=%v\n", a, a)
  7. fmt.Printf("aa: Type=%T,Value=%v\n", aa, aa)
  8. fmt.Printf("b: Type=%T,Value=%v\n", b, b)
  9. fmt.Printf("bb: Type=%T,Value=%v\n", bb, bb)
  10. //a: Type=int,Value=1
  11. //aa: Type=float64,Value=1
  12. //b: Type=float64,Value=3.1415
  13. //bb: Type=int,Value=3
  14. //相互兼容的非数值类型转换
  15. var s string = "Go语言基础"
  16. sBytes := []byte(s)
  17. sUnit := []uint8(s)
  18. sRunes := []rune(s)
  19. fmt.Printf("s: Type=%T,Value=%v\n", s, s)
  20. fmt.Printf("sBytes: Type=%T,Value=%v\n", sBytes, sBytes)
  21. fmt.Printf("sUnit: Type=%T,Value=%v\n", sUnit, sUnit)
  22. fmt.Printf("sRunes: Type=%T,Value=%v\n", sRunes, sRunes)
  23. //s: Type=string,Value=Go语言基础
  24. //sBytes: Type=[]uint8,Value=[71 111 232 175 173 232 168 128 229 159 186 231 161 128]
  25. //sUnit: Type=[]uint8,Value=[71 111 232 175 173 232 168 128 229 159 186 231 161 128]
  26. //sRunes: Type=[]int32,Value=[71 111 35821 35328 22522 30784]
  27. //非兼容类型转换,使用strconv标准包,可实现字符串和数值类型的转换,以下示例为整型转换,其他可参考该包提供的方法:
  28. //整型转字符串
  29. var i = 1
  30. s = strconv.Itoa(i)
  31. fmt.Printf("i: Type=%T,Value=%v\n", i, i)
  32. fmt.Printf("s: Type=%T,Value=%v\n", s, s)
  33. //i: Type=int,Value=1
  34. //s: Type=string,Value=1
  35. //字符串转整型
  36. var ss = "34"
  37. ii, err := strconv.Atoi(ss)
  38. if err != nil {
  39. fmt.Println("Atoi is equivalent to ParseInt(s, 10, 0), converted to type int")
  40. }
  41. fmt.Printf("ss: Type=%T,Value=%v\n", ss, ss)
  42. fmt.Printf("ii: Type=%T,Value=%v\n", ii, ii)
  43. //ss: Type=string,Value=34
  44. //ii: Type=int,Value=34