2024年最新Go 专栏 | 变量和常量的声明与赋值(4),2024年最新快手Golang面试经验

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

变量

Go 编程的命名风格更习惯使用「短名称」和「驼峰式」的名称,而且大小写敏感。

开头必须是字母或者下划线,而且首字母是大写还是小写也是有特殊含义的。大写字母开头可以被包外引用,小写字母开头只能在包内使用,这个会在以后的文章中继续分享。

声明

第一种使用关键字 var 声明变量:

var name type = expression

和 C 语言正好相反,类型是跟在变量名后面的。说实话,刚开始写 Go 代码的时候还真有些不习惯。

类型和表达式可以省略一个,但不能都省略。如果类型省略,则类型由初始化表达式决定;如果表达式省略,则初始化值为对应类型的零值。

对于数字是 0,布尔值是 false,字符串是 "",接口和引用(slice,指针,map,通道,函数)是 nil,对于数组或结构体这样的复合类型,零值是其所有元素或成员的零值。

// 没有初始值,会赋默认零值

var v1 int

var v2 string

var v3 bool

var v4 [10]int // 数组

var v5 []int // 数组切片

var v6 struct {

e int

}

var v7 *int // 指针

var v8 map[string]int // map,key 为 string 类型,value 为 int 类型

var v9 func(e int) int

fmt.Println(v1, v2, v3, v4, v5, v6, v7, v8, v9)

// 输出

// 0 false [0 0 0 0 0 0 0 0 0 0] [] {0} map[]

所以在 Go 中是不存在未初始化的变量的。

声明单个变量:

// 声明单个变量

var a = “initial”

fmt.Println(a)

// 声明布尔值变量

var d = true

fmt.Println(d)

一次声明多个变量:

// 声明多个变量

var b, c int = 1, 2

fmt.Println(b, c)

建议以组方式一次声明多个变量:

// 以组的方式声明多个变量

var (

b1, c1 int

b2, c2 = 3, 4

)

fmt.Println(b1, c1)

fmt.Println(b2, c2)

第二种方式是短变量声明:

name := expression

使用 := 来声明,Go 编译器会自动推断变量类型。注意 :== 的区别,前者是声明并赋值,后者是赋值。

这种初始化方式非常方便,在局部变量的声明和初始化时经常使用。

举个例子:

// 短变量声明方式

f := “short”

fmt.Println(f)

多个变量:

// 声明赋值多个变量

g, h := 5, “alwaysbeta”

fmt.Println(g, h)

有一点需要注意,多个变量声明时,最少有一个新变量,否则会报错。

var i int

// i := 100 // 报错 no new variables on left side of :=

i, j := 100, 101 // 有新值 j,不报错

fmt.Println(i, j)

第三种使用内置 new 函数:

p := new(T)

初始化为类型 T 的零值,并返回其地址。

先说一下如何获取变量的地址,其实很简单,使用取地址符 & 即可。

声明一个整型的变量,然后对其取地址:

// 指针

k := 6

l := &k // l 为整型指针,指向 k

fmt.Println(*l) // 输出 6

*l = 7

fmt.Println(k) // 输出 7

使用 new 函数声明变量:

// 使用内置函数 new 声明

var p = new(int)

fmt.Println(*p) // 输出整型默认值 0

*p = 8

fmt.Println(*p) // 输出 8

再来看一个例子,下面两个函数是等价的,唯一的区别就是使用 new 少声明了一个中间变量。

func newInt() *int {

return new(int)

}

func newInt1() *int {

var p int

return &p

}

赋值

使用 = 来赋值:

举例:

// 变量赋值

var m, n int

m = 9

n = 10

fmt.Println(m, n)

多重赋值:

// 变量赋值

var m, n int

m = 9

n = 10

m, n = n, m

fmt.Println(m, n)

这个特性真是很爽,想想在 C 语言中是不能这么做的,要实现相同的效果,必须要借助一个中间变量才行。

如果有不需要的变量,使用空标识符 _ 来忽略,在 Go 语言中,如果声明了变量而不使用,程序是会报错的。

// 空标识符

r := [5]int{1, 2, 3, 4, 5}

for _, v := range r {

// fmt.Println(i, v)

// fmt.Println(v) // 定义 i 但不用会报错 i declared but not used

fmt.Println(v) // 忽略索引

}

作用域

变量分为全局变量和局部变量,局部变量会覆盖全局变量:

// 全局变量

var gg = “global”

func main() {

// 作用域

fmt.Println(gg) // 输出 global

gg = “local”

fmt.Println(gg) // 输出 local

}

使用流程控制语句时,需要特殊注意变量的作用域:

// 条件分支下的作用域

if f, err := os.Open(“./00_hello.go”); err != nil {

fmt.Println(err)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

local

}

使用流程控制语句时,需要特殊注意变量的作用域:

// 条件分支下的作用域

if f, err := os.Open(“./00_hello.go”); err != nil {

fmt.Println(err)

[外链图片转存中…(img-pdwGqyKA-1715737394124)]
[外链图片转存中…(img-taqqC9K3-1715737394125)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值