您的当前位置:首页正文

go 语言结构体相关方面问题

2024-11-26 来源:个人技术集锦

go 语言结构体相关方面问题


1. go struct能不能比较

golang中能够用 == 号直接比较的数据类型有如下
整型 integer、浮点型 float、字符串 string、布尔型 boolean、复数型 complex、指针型 pointer、通道型 channel、接口型 interface、数组型 array

不能直接比较的
切片型 slice、键值对型 map、函数型 func

相同结构体


type S struct {
    Name    string
    Age     int
}
func main() {
    a := S{
        Name:    "aa",
        Age:     1,
    }
    b := S{
        Name:    "aa",
        Age:     1,
    }

      fmt.Println(a == b)
}
  • 结构体只能比较是否相等,不能比较大小
  • 如果struct的所有成员都可以进行比较,则该struct就可以通过==或者!=进行比较是否相等,比较是逐一进行比较,每一项相等才相等
  • 如果成员中有slicemap或者 func不能直接比较可以通过reflect.DeepEqual函数进行比较(reflect.DeepEqual(s1, s2))

不同结构体

type S1 struct {
	s string
	i int
}

type S2 struct {
	s string
	i int
}

func main() {
	var s1 S1
	var s2 S2
	//强制类型转换
	//s3 := S1(s2)
	//fmt.Println(s3 == s1)//true
	s1.s ="zz"
	s2.s ="zxp"
	s3 := S1(s2)
	fmt.Println(s3 == s1)//false
}

不同结构体可以通过强制类型转换来进行比较(前提是不同结构体中的成员顺序是相同的,而且成员个数相同才可以强制类型转换),类型转换后比较方式和相同结构体比较方式是一样的

2. struct是否可以作为map中的key

struct里面的类型必须是可比较的,才能作为map中的key,不然会报错

3.通过指针变量访问其他成员变量name,有哪几种方式

p.name
//p.name的底层写法就是(*p).name,这是Go语言帮我们实现的语法糖。
(*p).name

3. 类型定义和类型别名的区别

type MyInt1 int
type MyInt2 = int
func main() {
    var i int =0
    var i1 MyInt1 = i 
    var i2 MyInt2 = i
    fmt.Println(i1,i2)
}

var i1 MyInt1 = i 相当于是将int类型的变量赋值给Myint1类型的变量,是不通过的,MyInt2是int的别名还是int类型。
MyInt1想要赋值需要强制类型转换。

结构体大小写问题

//Student中的S大写可以在包外被访问,若小写只能在本包里被访问
type Student struct {
	Name  string // S大写的情况下可在包外访问的字段
	class string // S大写的情况下仅限包内访问的字段
	
}
显示全文