数据类型

go 基本数据类型

在go buildin 的包中包含 go 预先声明的标识符, 其中基本数据类型包含:

整型: uint, uint, unit8, uint16, uint32, unit64,
int, nit8, int16, int32, int64
uintptr �(超大无符号整型,大小可以容纳任何指针)
byte(unit8), rune(int32, 用户存储unicode码)

浮点: float32 float64

布尔: bool

复数: complex64, complex128

字符串: string

java 基本数据类型

整型: byte(8) , short(16), int(32), long(64)

字符:char (16位,存储Unicode码)

浮点: float(32位), double(64)

布尔: boolean

go的基本数据类型除了整形, 浮点, 布尔, 还多出了字符串和复数两个数据类型

值传递比较

java

基本数据类型,如果调用函数的时候,我们认为是 传递的是函数参数值的拷贝
如果是非基本数据类型,我们认为传递的是值的引用 (类比指针)
字符串是按照值的类型传递的, 在java中 String 是不可变类型

go

无论是基本数据类型还是复杂数据类型,默认都是值的拷贝, 除非明确指定指针类型, 数组 隐式传递为数组指针

示例:

go 复杂数据

  1. package main
  2. import "fmt"
  3. type Obj struct {
  4. a int
  5. }
  6. func main() {
  7. obj := Obj{
  8. a: 1,
  9. }
  10. fmt.Println("===================")
  11. fmt.Printf("%p:%v\n", &obj, obj)
  12. obj1 := dealObj(obj)
  13. fmt.Printf("%p:%v\n", &obj, obj)
  14. fmt.Printf("%p:%v\n", &obj1, obj1)
  15. fmt.Println("===================")
  16. fmt.Printf("%p:%v\n", &obj, obj)
  17. obj2 := dealObj2(&obj)
  18. fmt.Printf("%p:%v\n", &obj2, obj2)
  19. fmt.Println("===================")
  20. fmt.Printf("%p:%v\n", &obj, obj)
  21. obj3 := dealObj3(&obj)
  22. fmt.Printf("%p:%v\n", obj3, *obj3)
  23. }
  24. func dealObj(obj Obj) Obj {
  25. fmt.Printf("intObj: %p:%v\n", &obj, obj)
  26. obj.a = 2
  27. return obj
  28. }
  29. func dealObj2(obj *Obj) Obj {
  30. fmt.Printf("inObj2: %p:%v\n", obj, *obj)
  31. (*obj).a = 2
  32. return *obj
  33. }
  34. func dealObj3(obj *Obj) *Obj {
  35. fmt.Printf("inObj2: %p:%v\n", obj, *obj)
  36. (*obj).a = 2
  37. return obj
  38. }
  39. 输出如下:
  40. ===================
  41. 0xc0000160a8:{1}
  42. intObj: 0xc0000160b8:{1}
  43. 0xc0000160a8:{1}
  44. 0xc0000160b0:{2}
  45. ===================
  46. 0xc0000160a8:{1}
  47. inObj2: 0xc0000160a8:{1}
  48. 0xc0000160c0:{2}
  49. ===================
  50. 0xc0000160a8:{2}
  51. inObj2: 0xc0000160a8:{2}
  52. 0xc0000160a8:{2}

go 数组类型

  1. func main() {
  2. array := make([]string, 10)
  3. fmt.Printf("%p:%v\n", array, array)
  4. array2 := deal1(array)
  5. fmt.Printf("%p:%v\n", array, array)
  6. fmt.Printf("%p:%v\n", array2, array2)
  7. }
  8. func deal1(array []string) []string {
  9. array[0] = "c"
  10. fmt.Printf("in method: %p:%v\n", array, array)
  11. return array
  12. }
  13. # 输出
  14. 0xc00012e000:[ ]
  15. in method: 0xc00012e000:[c ]
  16. 0xc00012e000:[c ]
  17. 0xc00012e000:[c ]

java 对象类型

  1. public static void main(String[] args) {
  2. Obj o = new Obj();
  3. o.a = 1;
  4. System.out.printf("%s,%d\n", o.toString(), o.a);
  5. Obj o2 = deal(o);
  6. System.out.printf("%s,%d\n", o.toString(), o.a);
  7. System.out.printf("%s,%d\n", o.toString(), o.a);
  8. }
  9. public static Obj deal(Obj o) {
  10. System.out.printf("inMethod: %s,%d\n", o.toString(), o.a);
  11. o.a = 2;
  12. return o;
  13. }
  14. 输出:
  15. com.tonny.obj.Obj@29453f44,1
  16. inMethod: com.tonny.obj.Obj@29453f44,1
  17. com.tonny.obj.Obj@29453f44,2
  18. com.tonny.obj.Obj@29453f44,2

java 字符串类型

  1. public static void main(String[] args) {
  2. Obj o = new Obj();
  3. o.a = 1;
  4. System.out.printf("%s,%d\n", o.toString(), o.a);
  5. Obj o2 = deal(o);
  6. System.out.printf("%s,%d\n", o.toString(), o.a);
  7. System.out.printf("%s,%d\n", o.toString(), o.a);
  8. }
  9. public static Obj deal(Obj o) {
  10. System.out.printf("inMethod: %s,%d\n", o.toString(), o.a);
  11. o.a = 2;
  12. return o;
  13. }
  14. 输出:
  15. com.tonny.obj.Obj@29453f44,1
  16. inMethod: com.tonny.obj.Obj@29453f44,1
  17. com.tonny.obj.Obj@29453f44,2
  18. com.tonny.obj.Obj@29453f44,2