数据类型
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 复杂数据
package mainimport "fmt"type Obj struct {a int}func main() {obj := Obj{a: 1,}fmt.Println("===================")fmt.Printf("%p:%v\n", &obj, obj)obj1 := dealObj(obj)fmt.Printf("%p:%v\n", &obj, obj)fmt.Printf("%p:%v\n", &obj1, obj1)fmt.Println("===================")fmt.Printf("%p:%v\n", &obj, obj)obj2 := dealObj2(&obj)fmt.Printf("%p:%v\n", &obj2, obj2)fmt.Println("===================")fmt.Printf("%p:%v\n", &obj, obj)obj3 := dealObj3(&obj)fmt.Printf("%p:%v\n", obj3, *obj3)}func dealObj(obj Obj) Obj {fmt.Printf("intObj: %p:%v\n", &obj, obj)obj.a = 2return obj}func dealObj2(obj *Obj) Obj {fmt.Printf("inObj2: %p:%v\n", obj, *obj)(*obj).a = 2return *obj}func dealObj3(obj *Obj) *Obj {fmt.Printf("inObj2: %p:%v\n", obj, *obj)(*obj).a = 2return obj}输出如下:===================0xc0000160a8:{1}intObj: 0xc0000160b8:{1}0xc0000160a8:{1}0xc0000160b0:{2}===================0xc0000160a8:{1}inObj2: 0xc0000160a8:{1}0xc0000160c0:{2}===================0xc0000160a8:{2}inObj2: 0xc0000160a8:{2}0xc0000160a8:{2}
go 数组类型
func main() {array := make([]string, 10)fmt.Printf("%p:%v\n", array, array)array2 := deal1(array)fmt.Printf("%p:%v\n", array, array)fmt.Printf("%p:%v\n", array2, array2)}func deal1(array []string) []string {array[0] = "c"fmt.Printf("in method: %p:%v\n", array, array)return array}# 输出0xc00012e000:[ ]in method: 0xc00012e000:[c ]0xc00012e000:[c ]0xc00012e000:[c ]
java 对象类型
public static void main(String[] args) {Obj o = new Obj();o.a = 1;System.out.printf("%s,%d\n", o.toString(), o.a);Obj o2 = deal(o);System.out.printf("%s,%d\n", o.toString(), o.a);System.out.printf("%s,%d\n", o.toString(), o.a);}public static Obj deal(Obj o) {System.out.printf("inMethod: %s,%d\n", o.toString(), o.a);o.a = 2;return o;}输出:com.tonny.obj.Obj@29453f44,1inMethod: com.tonny.obj.Obj@29453f44,1com.tonny.obj.Obj@29453f44,2com.tonny.obj.Obj@29453f44,2
java 字符串类型
public static void main(String[] args) {Obj o = new Obj();o.a = 1;System.out.printf("%s,%d\n", o.toString(), o.a);Obj o2 = deal(o);System.out.printf("%s,%d\n", o.toString(), o.a);System.out.printf("%s,%d\n", o.toString(), o.a);}public static Obj deal(Obj o) {System.out.printf("inMethod: %s,%d\n", o.toString(), o.a);o.a = 2;return o;}输出:com.tonny.obj.Obj@29453f44,1inMethod: com.tonny.obj.Obj@29453f44,1com.tonny.obj.Obj@29453f44,2com.tonny.obj.Obj@29453f44,2
