package main
import"fmt"type Student struct{
Name string
Age int
Slice []int
Map map[string]int}funcmain(){
s1 := Student{
Name:"s1",
Age:20,
Slice:[]int{1,2,3},
Map:map[string]int{"1":1,"2":2},}
s2 := Student{
Name:"s1",
Age:20,
Slice:[]int{1,2,3},
Map:map[string]int{"1":1,"2":2},}
fmt.Println(s1 != s2)// 不能比较,因为结构体包含不可比较类型}
package main
import"fmt"type Student struct{
Name string
Age int}funcmain(){
s1 := Student{
Name:"s1",
Age:20,}
s2 := Student{
Name:"s1",
Age:20,}
fmt.Println(s1 == s2)// true}
package main
import"fmt"type Student struct{
Name string
Age int}type Driver struct{
Name string
Age int}funcmain(){
s1 := Student{
Name:"s1",
Age:20,}
d1 := Driver{
Name:"s1",
Age:20,}// fmt.Println(s1 == d1) // 报错
fmt.Println(s1 ==Student(d1))// 可以比较}
2. go defer
延迟函数的参数在defer语句出现时就已经确定下来了
延迟函数可能操作主函数的具名返回值
延迟函数执行按后进先出顺序执行,即先出现的defer最后执行
package main
import"fmt"funcmain(){
a :=1
b :=2defercalc(a,calc(a,b))
a =0defercalc(a,calc(a,b))}funccalc(x,y int)int{
fmt.Println(x,y,x+y)return x+y
}
package main
import"fmt"funcmain(){deferfunc(){fmt.Println(1)}()deferfunc(){fmt.Println(2)}()deferfunc(){fmt.Println(3)}()panic(1)// 程序发生panic 会先处理defer然后panic}
package main
import"fmt"funcprintArray(array *[3]int){for i :=range array {
fmt.Println(array[i])}}funcdeferFuncParameter(){var aArray =[3]int{1,2,3}deferprintArray(&aArray)
aArray[0]=10return}funcmain(){deferFuncParameter()// 10 2 3}
package main
import"fmt"funcmain(){
a :=make([]int,2,2)
a[0], a[1]=1,2
b :=append(a[0:1],3)
c :=append(a[1:2],4)
fmt.Println(b, c)// [1,3],[3, 4] c赋值时底层数组已经发生变化了}
package main
import"fmt"funcmain(){
a :=make([]int,2,2)
a[0], a[1]=1,2
b :=make([]int,1)copy(b, a[0:1])
b =append(b,3)
c :=make([]int,1)copy(c, a[1:2])
c =append(c,4)
fmt.Println(b, c)// [1,3], [2,4]}
8. go copy函数
目标数组长度不足拷贝长度时,只拷贝目标数组长度
两个数组切片不一样大,就会按其中较小的那个数组切片的元素个数进行复制
9. go 实现集合
package main
import("fmt""sync")type Set struct{
set map[string]struct{}
lock sync.Mutex
}func(s *Set)AddElem(elem string){
s.lock.Lock()defer s.lock.Unlock()
s.set[elem]=struct{}{}}func(s *Set)RemoveElem(elem string){
s.lock.Lock()defer s.lock.Unlock()delete(s.set, elem)}func(s *Set)Smembers()[]string{
members, i :=make([]string,len(s.set)),0for key,_:=range s.set {
members[i]= key
i++}return members
}func(s *Set)Size()int{returnlen(s.set)}funcmain(){
s := Set{set:map[string]struct{}{}}
s.AddElem("111")
s.AddElem("222")
fmt.Println(s.Smembers())
s.RemoveElem("222")
fmt.Println(s.Smembers())}
1. go struct能不能比较如果结构体的所有成员变量都是可比较的,那么结构体就可比较如果结构体中存在不可比较的成员变量,那么结构体就不能比较结构体之间能进行强制转换也可以比较。结构体之间进行转换需要他们具备完全相同的成员(字段名、字段类型、字段个数)指针比较实际上是比较指针指向的内存地址,而不是指针变量的内存地址package mainimport "fmt"type Student struct { Name string Age int Slice []int Map