可比較的資料型別除了上述三種外,還有boolean,complex,pointer,channel,inte***ce和array
不可比較的資料型別包括,slice, map, 和function
不包含不可比較的成員變數
reflect.deepequal函式,指標和例項均可以比較(無論有沒有包含不可比較的成員變數)
package main
import (
"fmt"
"reflect"
)type t1 struct
func main() ,
ptr: new(int),
slice: int,
map1: make(map[string]string, 0),
} t2 := t1,
ptr: new(int),
slice: int,
map1: make(map[string]string, 0),
} // 報錯 例項不能比較 invalid operation: t1 == t2 (operator == not defined on t1)
// fmt.println(t1 == t2)
// 指標可以比較
fmt.println(&t1 == &t2) // false
fmt.println(reflect.deepequal(t1, t2)) // true
t3 := &t1,
ptr: new(int),
slice: int,
map1: make(map[string]string, 0),
} t4 := &t1,
ptr: new(int),
slice: int,
map1: make(map[string]string, 0),
} fmt.println(t3 == t4) // false
fmt.println(reflect.deepequal(t3, t4)) // true
fmt.printf("%p, %p \n", t3, t4) // 0xc000046050, 0xc0000460a0
fmt.printf("%p, %p \n", &t3, &t4) // 0xc000006030, 0xc000006038
// 前面加*,表示指標指向的值,即結構體例項,不能用==
// invalid operation: *t3 == *t4 (operator == not defined on t1)
// fmt.println(*t3 == *t4)
t5 := t3
fmt.println(t3 == t5) // true
fmt.println(reflect.deepequal(t3, t5)) // true
fmt.printf("%p, %p \n", t3, t5) // 0xc000046050, 0xc000046050
fmt.printf("%p, %p \n", &t3, &t5) // 0xc000006030, 0xc000006040
}
package main
import (
"fmt"
)type t2 struct
type t3 struct
func main()
package main
import (
"fmt"
"reflect"
)type t2 struct
type t3 struct
func main()
package main
import (
"fmt"
)type t1 struct
type t2 struct
func main()
golang中struct和 byte的相互轉換
在網路傳輸過程中,經常會這樣處理 socket接收到資料,先獲取其訊息頭,然後再做各種不同的業務處理。在解析訊息頭的時候的方法有多種多樣。其中最為高效解析訊息頭的方法就是直接把資料頭部分強制型別轉換為對應的訊息頭結構體。這種做法在c c 中非常的常見。而golang其實也是可以這樣子做的。類似這樣的...
golang中json和struct的使用
在struct的字段後面加入json key 可以進行json格式輸出,其中key為json的鍵名 響應的結果為 1.如果struct的某個字段沒有傳值,則輸出的json為預設值,可以通過 omitempty 引數忽略掉值為空的鍵 type mydata struct data mydata suc...
Golang中struct結構標籤 Tag 的使用
在看別人的一些 時,宣告結構時有個json name是做什麼用的?想知道原因得了解下 在golang中,命名都是推薦都是用駝峰方式,並且在首字母大小寫有特殊的語法含義 包外無法引用。但是由經常需要和其它的系統進行資料互動,例如轉成json格式,儲存到redis等等。這個時候如果直接用屬性名來作為鍵值...