写点什么

Go 语言学习查缺补漏 ing Day3

  • 2021 年 12 月 06 日
  • 本文字数:1813 字

    阅读完需:约 6 分钟

作者:ReganYue

来源:恒生LIGHT云社区

Go 语言学习查缺补漏 ing Day3

零、前言

因为笔者基础不牢,在使用 Go 语言的时候经常遇到很多摸不着头脑的问题,所以笔者下定决心好好对 Go 语言进行查漏补缺,本【Go 语言查缺补漏 ing】系列主要是帮助新手 Gopher 更好的了解 Go 语言的易错点、重难点。希望各位看官能够喜欢,点点赞、关注一下呗!

一、结构体的比较问题

我们先来看一段关于结构体的比较的代码:


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、函数其中任一项的结构体均不能做比较。


还有几点值得注意的是:


  1. 结构体之间只能比较它们是否相等,而不能比较它们的大小。

  2. 只有所有属性都相等而属性顺序都一致的结构体才能进行比较。

二、通过指针变量访问成员变量的几种方式

先看这段代码:


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 inttype 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 之前的切片与之后的切片是不是引用的相同的内存空间。


所以说这个执行 fun1 来 append 之后的切片 a 与外面的切片 a 不是同一个,所以查看外面的 a,可以发现外面切片的内容没有改变。

五、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())}
复制代码


这里提到了四种连接字符串的方式,第一种利用+号直接连接,第二种利用 fmt.Sprintf(),第三种是利用 strings.Join(),第四种是利用 buffer.WriteString()来进行字符串连接。

发布于: 2021 年 12 月 06 日阅读数: 6
用户头像

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
Go语言学习查缺补漏ing Day3