前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言学习查缺补漏ing Day3

Go语言学习查缺补漏ing Day3

作者头像
Regan Yue
发布2022-02-12 09:08:00
2410
发布2022-02-12 09:08:00
举报
文章被收录于专栏:ReganYue's Blog

Go语言学习查缺补漏ing Day3

零、前言

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

一、结构体的比较问题

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

代码语言:javascript
复制
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")
	}
}

你觉得编译时会报错吗?

image-20211121193059286
image-20211121193059286
image-20211121193143297
image-20211121193143297

啊这,出大问题。它说包含map的结构体不能被比较。

是的,只有包含bool类型、数值型、字符串、指针、数组等类型的结构体才能比较,而包含slice、map、函数其中任一项的结构体均不能做比较。

还有几点值得注意的是:

  1. 结构体之间只能比较它们是否相等,而不能比较它们的大小。
  2. 只有所有属性都相等而属性顺序都一致的结构体才能进行比较。
二、通过指针变量访问成员变量的几种方式

先看这段代码:

代码语言:javascript
复制
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)
}

你觉得哪里会报错?

image-20211121194638463
image-20211121194638463

哦!是(&s2).name有点问题…

因为&是取地址符,*是指针解引用符。所以将指针解引用才能访问到成员变量。

你会好奇为什么指针不解引用也能获取成员变量吗?其实是进行解引用了,这就是我们GO语言的强大之处了,它能够自动进行解引用,但是遗憾的是,只能解引用乙级指针,如果是多级指针,就得靠你自己了。

三、类型别名和类型定义的区别
代码语言:javascript
复制
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)
}

是不是一眼就看出来问题所在了?

不过他们放在一起,你能马上分别哪个是类型别名,哪个是类型定义吗?

代码语言:javascript
复制
type Int1 int

是定义了基于int类型创建了一个新类型,而

代码语言:javascript
复制
type Int2 = int

是将Int2作为int类型的别名。

所以将会报如下错误:

image-20211121201235626
image-20211121201235626

这是因为Go是强类型语言,所以我们需要将int强制转换Int1类型就可以通过编译了。

四、切片的一个注意事项
代码语言:javascript
复制
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
}

看一看运行结果:

代码语言:javascript
复制
[7 8 9]
[7 8 9]
[8 8 9]

什么?!! 没有append进去?这是因为append可能会导致内存的重新分配,我们就不能再确定append之前的切片与之后的切片是不是引用的相同的内存空间。

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

五、Golang字符串连接的几种方式
代码语言:javascript
复制
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()来进行字符串连接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/02/11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go语言学习查缺补漏ing Day3
    • 零、前言
      • 一、结构体的比较问题
        • 二、通过指针变量访问成员变量的几种方式
          • 三、类型别名和类型定义的区别
            • 四、切片的一个注意事项
              • 五、Golang字符串连接的几种方式
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档