介绍Go结构体的比较问题等四个问题
【摘要】 Go语言学习查缺补漏ing Day4一、结构体的比较问题我们先来看一段关于结构体的比较的代码:package mainimport "fmt"func main() { struct1 := struct { age int name string sex bool }{age: 18, name: "搏达", sex:false}...
一、结构体的比较问题
我们先来看一段关于结构体的比较的代码:
package main
import "fmt"
func main() {
struct1 := struct {
age int
name string
sex bool
}{age: 18, name: "搏达", sex:false}
struct2 := struct {
age int
name string
sex bool
}{age: 21, name: "Regan Yue", sex:true}
if struct1 == struct2 {
fmt.Println("struct1 == struct2")
}
struct3 := struct {
age int
people map[string]bool
}{age: 31, people: map[string]bool{"搏达": false}}
struct4 := struct {
age int
people map[string]bool
}{age: 21, people: map[string]bool{"ReganYue": false}}
if struct3 == struct4{
fmt.Println("struct3 == struct4")
}
}
你觉得编译时会报错吗?
啊这,出大问题。它说包含map的结构体不能被比较。
是的,只有包含bool类型、数值型、字符串、指针、数组等类型的结构体才能比较,而包含slice、map、函数其中任一项的结构体均不能做比较。
还有几点值得注意的是:
-
结构体之间只能比较它们是否相等,而不能比较它们的大小。
-
只有所有属性都相等而属性顺序都一致的结构体才能进行比较。
二、通过指针变量访问成员变量的几种方式
先看这段代码:
package main
import "fmt"
func main() {
s1 := struct {
name string
age int64
}{name:"Regan",age:21}
s2 := &s1
fmt.Println(s2.name)
fmt.Println((*s2).name)
fmt.Println((&s2).name)
}
你觉得哪里会报错?
哦!是(&s2).name有点问题.....
因为&是取地址符,*是指针解引用符。所以将指针解引用才能访问到成员变量。
你会好奇为什么指针不解引用也能获取成员变量吗?其实是进行解引用了,这就是我们GO语言的强大之处了,它能够自动进行解引用,但是遗憾的是,只能解引用乙级指针,如果是多级指针,就得靠你自己了。
三、类型别名和类型定义的区别
package main
import "fmt"
type Int1 int
type Int2 = int
func main() {
var i = 0
var i1 Int1 = i
var i2 Int2= i
fmt.Println(i, i1, i2)
}
是不是一眼就看出来问题所在了?
不过他们放在一起,你能马上分别哪个是类型别名,哪个是类型定义吗?
type Int1 int
是定义了基于int类型创建了一个新类型,而
type Int2 = int
是将Int2作为int类型的别名。
所以将会报如下错误:
这是因为Go是强类型语言,所以我们需要将int强制转换Int1类型就可以通过编译了。
四、切片的一个注意事项
package main
import "fmt"
func main() {
a := []int{7, 8, 9}
fmt.Printf("%+v\n", a)
fun1(a)
fmt.Printf("%+v\n", a)
fun2(a)
fmt.Printf("%+v\n", a)
}
func fun1(a []int) {
a = append(a, 5)
}
func fun2(a []int) {
a[0] = 8
}
看一看运行结果:
[7 8 9]
[7 8 9]
[8 8 9]
什么?!! 没有append进去?这是因为append可能会导致内存的重新分配,我们就不能再确定append之前的切片与之后的切片是不是引用的相同的内存空间。
五、Golang字符串连接的几种方式
package main
import (
"bytes"
"fmt"
"strings"
)
func main() {
str1 := "abc"
str2 := "def"
strs := []string{"Regan","Yue"}
fmt.Println(str1+str2)
sprintf := fmt.Sprintf("abc%s", "accc")
fmt.Println(sprintf)
join := strings.Join(strs, "-")
fmt.Println(join)
var buffer bytes.Buffer
buffer.WriteString("hello")
buffer.WriteString("world")
fmt.Println(buffer.String())
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)