Go学习笔记-程序实体(上)

本文深入探讨Go语言中的变量类型,包括预定义类型、自定义类型如函数、结构体和接口,以及常量的合法类型限制。讲解了变量声明方式、类型推断的好处和重构实践,展示了如何通过类型推断提升程序灵活性,以及变量重声明的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

变量的类型可以是预定义的类型,也可以是程序自定义的函数、结构体或接口。

常量的合法类型只能是Go语言预定义的基本类型。

基本类型:

 

类型的声明方式:

var声明 与 短变量

(1)var name string //var name string = "hehe"

(2)name := "hehe" //用来了go的类型推断 ,编译器自动推断表达式

第一种方式更通用,可用在任何地方,第二种方式只能在函数体内部使用,用来声明一些临时变量。

 

类型推断的好处:

可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。


package main



import (

"flag"

"fmt"

)

func main() {

var name = getTheFlag()

flag.Parse()

fmt.Printf("Hello, %v!\n", *name)

}



func getTheFlag() *string {

return flag.String("name", "everyone", "The greeting object.")

}

var name =右边的表达式可以变为针对getTheFlag函数的调用表达式。

这实际上是对声明并赋值name变量的那行代码的重构。我们通常把“不改变某个程序与外界的任何交互方式和规则,而只改变其内部实现”的代码修改方式,叫做对该程序的重构。

 

重构的对象可以是一行代码、一个函数、一个功能模块,甚至一个软件系统。

 

你会发现,你可以随意改变getTheFlag函数的内部实现及其返回结果的类型,而不用修改main函数中的任何代码。

我们不显式地指定变量name的类型,使得它可以被赋予任何类型的值。也就是说,变量name的类型可以在其初始化时由其他程序动态地决定。

这种类型的确定是在编译期完成的,因此不会对程序的运行效率产生影响。

 

短变量重声明:

对同一个代码块中的变量进行重新声明。

代码块一般是由花括号括起来的区域,里面可以包含表达式和语句。也可以是单独的文件,或者一些包。

package main



import (

"fmt"

)



var a int = 8



func main() {

fmt.Println(a) //8



a := "bb"

fmt.Println(a) //bb



a, err := "aa", false

fmt.Println(a) //aa

fmt.Println(err)



a, er := 3, false //cannot use 3 (type int) as type string in assignment

fmt.Println(a) //aa

fmt.Println(er)

}

变量重声明的前提条件:

由于变量的类型在其初始化时就已经确定了,所以对它再次声明时赋予的类型必须与其原本的类型相同,否则会产生编译错误。

变量的重声明只可能发生在某一个代码块中。如果与当前的变量重名的是外层代码块中的变量,那么就是另外一种含义了。

变量的重声明只有在使用短变量声明时才会发生,否则也无法通过编译。如果要在此处声明全新的变量,那么就应该使用包含关键字var的声明语句,但是这时就不能与同一个代码块中的任何变量有重名了。

被“声明并赋值”的变量必须是多个,并且其中至少有一个是新的变量。这时我们才可以说对其中的旧变量进行了重声明

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值