2.Go变量 1.什么叫变量 在前面的讲解案例中,我们是让计算机输出数据到屏幕上,那么有同学可能就要问了,怎样让计算机保存我们通过键盘输入的数据呢?这就要用到变量了。 ” img 关于GO语言中的有哪些类型,我们后面会具体讲解。下面我们先看一下怎样声明变量? 3. 变量声明 所谓声明变量就是创建一个变量,并且指定该变量存储什么类型的数据。 声明格式 var 变量名 类型,变量声明了,必须使用 //2. 声明整型变量,默认值为0 //3. ,2是来自哪个变量,3来自哪个变量,除非该程序员阅读代码。 除了上面提到的规范要求以外,GO语言自己特有的,具有一定含义的一些字符,也不能作为变量名称。
下面是代码例子: //go 变量 //申明包名main package main //导入包名 import( "fmt" ) var a int //声明一个int类型的变量 var b var h,i,j = 5,"abd",0.4 func main(){ name2 := "test" //2声明变量并初始化值,这种赋值不能在函数外面进行赋值 //打印变量 fmt.Println(a,b,c,d,e,f,g,h,i,j) fmt.Println(name1,name2) } 总结: 1、变量声明(variable declaration)中的初始化表达式 3、赋值语句求值分为两个阶段,第一阶段是等号左边的index expressions、pointer indirections和等号右边的表达式中的操作数的求值顺序按照2中从左到右的顺序;第二阶段按从左到右的顺序对变量赋值 注意: 1.Go里面不损失精度的情况下会把8.0这类浮点数视作整数8 2.Go里面的常数是高精度数,分为几类。1.有类型的:uint(8),类型显式指定了,在表达式里面不会变化。
变量 变量分为普通变量和指针变量 变量创建 一行声明一个变量 var <name> <type> // eg: var name string = "张三" var name = "张三" var ", age) fmt.Println("ptr: ", ptr) } // 输出结果 // age: 28 // ptr: 0xc000010098 而这里要说的 new 函数,是 Go 使用表达式 new(Type) 将创建一个Type类型的匿名变量,初始化为Type类型的零值,然后返回变量地址,返回的指针类型为*Type。 ,表示从内存地址中取出值 } // 输出 // ptr address: 0xc000010098 // ptr value: 0 用new创建变量和普通变量声明语句方式创建变量没有什么区别,除了不需要声明一个临时变量的名字外 但也有例外,这就要说到一个特殊变量:匿名变量,也称作占位符,或者空白标识符,用下划线表示。
测试代码 //demo_1.go package main import ( "fmt" ) func main() { const name string = "Tom" fmt.Println 测试代码 //demo_2.go package main import ( "fmt" ) func main() { var age_1 uint8 = 31 var age_2 = 32 , height := "Jay", true, 180.66 fmt.Println(name_2, is_boy, height) } 运行结果: ? 测试代码 //demo_3.go package main import ( "fmt" ) func main() { fmt.Print("输出到控制台不换行") fmt.Println 推荐阅读 Go - 环境安装 本文欢迎转发,转发请注明作者和出处,谢谢!
Go变量声明的核心机制 静态类型语言要求变量在使用前必须声明,明确内存边界。 Go作为静态语言,通过变量声明实现这一机制: 变量绑定特定内存区域,类型信息确定操作边界 声明形式为:var 变量名 类型 = 值 未显式初始化时自动赋零值(int为0,bool为false等) 标准声明方式 通用变量声明语法结构: var a int = 10 组成要素: var关键字 变量标识符 类型声明 初始值(可省略) 多变量声明格式: var x, y, z int = 1, 2, 3 var ( : var a, b, c = 1, true, "str" 短变量声明 函数内部的简化声明方式: n := 42 msg := "hello" 限制条件: 只能在函数/方法内使用 必须包含初始值 支持多变量声明 } 零值机制 各类型默认零值: 数值类型:0 布尔型:false 字符串:“” 指针/接口:nil 复合类型:递归零值初始化 最佳实践建议 包级变量: 导出变量使用完整声明 相关变量使用声明块组织 延迟初始化变量单独声明
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。 Go 语言变量名由字母、数字、下划线组成,其中首个字母不能为数字。 //类型相同多个变量, 非全局变量 var vname1, vname2, vname3 type vname1, vname2, vname3 = v1, v2, v3 var vname1, vname2 , vname3 = v1, v2, v3 //和python很像,不需要显示声明类型,自动推断 vname1, vname2, vname3 := v1, v2, v3 //出现在:=左侧的变量不应该是已经被声明过的 ,否则会导致编译错误 // 这种因式分解关键字的写法一般用于声明全局变量 var ( vname1 v_type1 vname2 v_type2 ) 实例如下: package main 这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。
变量 变量声明 Go+语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。 声明变量的语法: var 变量名 类型 var a string a = "hello" println(a) 同时可以一次声明多个变量。 var 变量名1, 变量名2... type var name,name2 string 如果不对变量进行初始化的话就必须定义类型。如果对变量进行了初始化,那么GO+会根据值的类型自动判断变量类型。 变量初始化 一般写法 对单个变量进行初始化。 var name = "admin" println(name) 如果变量没有初始化的话就必须指定类型,这个时候变量的值是默认值。 ,声明语句写上 var 关键字其实是显得有些多余了,而且很容易和js的变量声明产生混淆,也是GO+有简单的写法::= 赋值操作符,例如: name := "admin" println(name) //
声明单个变量 使用var关键字是Go最基本的定义变量方式,Go把变量类型放在变量名后面,如果有其他开发语言经验的同学可能在这有些不习惯。 如果变量未被赋值,Go 会自动地将其初始化,赋值该变量类型的零值(Zero Value)。 age 就被赋值为 0。 } 声明多个变量 Go 能够通过一条语句声明多个变量。 : a=2 b=3 a=3 b=2 在有些情况下,我们可能会想要在一个语句中声明不同类型的变量。 _ 忽略变量 _(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。在这个例子中,我们将值2赋予b,并同时丢弃1: _, b := 1, 2
局部变量 定义:定义在{}里面的变量为局部变量 作用域:只能在{}里面有效;执行到定义的那句话,开始分配内存空间,离开作用域自动进行释放 局部变量一定是在函数内部声明 在哪个{}内部声明; 执行到定义的那句话 TestGlobal xiaoming --- PASS: TestGlobal (0.00s) PASS 测试: 跨包访问 package variable import ( "fmt" //"go :例如定义了一个全局变量, 然后有使用了 := 给全局变量赋值, 此时会出现问题。 看下面的例子: package dbops import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log" ) var ( 在这里插入图片描述 参考资料 https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-panic-recover/
局部变量 定义:定义在{}里面的变量为局部变量 作用域:只能在{}里面有效;执行到定义的那句话,开始分配内存空间,离开作用域自动进行释放 局部变量一定是在函数内部声明 在哪个{}内部声明; 执行到定义的那句话 TestGlobal xiaoming --- PASS: TestGlobal (0.00s) PASS 测试:跨包访问 package variable import ( "fmt" //"go 看下面的例子: package dbops import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log" ) var ( 还有个坑,最近看代码, 发现 全局变量名字一样,然后,在 init 也初始化了, 然后跨包应用这个全局变量时,这个全局变量还是个 nil, 查了半天,才看到全局变量的名字是一样的,但是归属不同的 包 A 博客:CSDN 王小明 参考资料 https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-panic-recover/
{ fmt.Println(i,n) } } func main() { demo("derek","看书","打球","游戏") } //结果 derek 的爱好是 0 看书 1 打球 2 在go语言中函数也是一种类型 定义万函数变量后,可以使用匿名函数进行赋值,也可以使用已经定义好的函数进行赋值 函数变量定义以后与普通函数调用语法相同,变量名就是普通函数声明的函数名 函数变量是除了 0x47d820 } (2)函数作为参数 package main import "fmt" func mydo(arg func(name string)) { fmt.Println("执行 函数作为返回值 func a() func() int{ return func() int { return 110 } } func main() { result := a() r2 := result() fmt.Println(r2) //110 }
package main; import "fmt"; func main() { //定义一个类型为int的变量a var a int; //定义多个类型为int的变量 var b,c,d int; //定义并初始化 var e int = 0; //定义多个变量并初始化 var f,g,h int = 1,2,3; 上面简化写法,根据值的类型初始化 var i,j,k = 4,5,6; //更简洁的写法 //但这种方式只能在函数内部使用 //:=这种操作是先声明再初始化两步操作,你对一个变量两次 :=操作会报错 l := 7; //特殊的变量名_,任何赋予它的值都会被丢弃 _,m := 8,9; fmt.Printf("%d %d %d %d %d %d
一、变量声明 Go语言是静态类型语言,变量是有明确类型要求的,编译器也会检查变量类型的正确性。 如果采用go的一种形式, int *csdn,zhou 在Go中,当一个变量被声明之后,系统会自动赋予该类型的零值,Go中所有的内存都是经过初始化的。 比如说下方的代码示例: 二、不指明变量类型 如果没有声明变量类型,Go会编译的时候自动推到类型。 比如说下面的例子,其中printf是表示带有格式化的输出。 2、不能提供数据类型。 3、定义变量,同时显式初始化。 五、初始化变量与匿名变量 不可以重复声明一个变量,会提示报错。 但是在网络连接时候存在特例,net网络包的返回值有两个。 六、变量交换赋值 Go语言中,提供了一种非常方便的赋值交换方式,如下代码所示。 七、变量作用域 Go语言有一个很重要的性质,就是编译的时候会进行变量检测,如果出现了没有使用过的变量,就会报编译错误。
变量和常量 变量 变量:主要作用是存储信息,类似一个容器。变量的值是存储在计算机内存中。 在go中,变量有三个属性:变量类型、变量名和变量值。 声明变量 var 变量名 变量类型 例子: 1 var name string 2 var age int 3 var isOk bool 4 5 var ( 6 a string 7 ,切片、函数、指针变量是nil; 声明变量并初始化的时候也可以不用指定类型,go语言会根据等号右边的值类型自动推导变量的类型。 例子: 1 var name = "xiaoming" 2 var age = 18 短变量声明 在函数内部可以使用 := 方式声明并初始化变量 例子: 1 func main() { 2 n := 10 例子: 1 const ( 2 n1 = 100 3 n2 4 n3 5 ) 上面示例中,n1、n2、n3都是100。 iota iota是go语言的常量计数器,只能在常量的表达式中使用。
本文将从两个方面介绍如何在 Go 项目中使用环境变量:使用标准库(不依赖任何第三方库)使用 viper1、使用 Go 标准库读取环境变量(推荐方式)Go 提供了 os 包来处理环境变量,无需引入任何第三方依赖 2、手动解析 .env 文件(无第三方库)虽然 Go 没有内建对 .env 文件的支持,我们可以手动读取 .env 文件并使用 os.Setenv() 进行配置:示例代码:package mainimport strings.TrimSpace(line) == "" { continue } parts := strings.SplitN(line, "=", 2) = 2 { continue } key := strings.TrimSpace(parts[0]) value := strings.TrimSpace (支持系统和 .env)viper 是 Go 中功能最强大的配置库之一。
首先明确一点就是Go语言是静态语言,意味着对于变量的使用来说,必须先进行声明之后才可以使用。 变量的声明方法通用的变量声明格式如下:这里和kotlin的变量声明方式有点类似, 比如都是把变量类型放在变量名后面,只不过,kotlin多一个“:”符号以及“;”分号,在之前的Go入门系列中我们提到Go ,如下格式var a, b, c int = 1, 2, 3等价于:var a int = 1var b int = 2var c int = 3复制代码变量类型初值与此同时,Go为开发者更好的使用,提供了两种 省略类型信息的声明:Go开发中支持省略类型信息,由go语言自动根据右边变量初值自动推导出变量类型,并赋予变量初值对应的默认类型。 var b = int32(13)复制代码2. 短变量声明:使用短变量声明时,我们甚至可以省去var关键字以及类型信息,它的标准范式是“varName := initExpression”。
[GO专栏-3]Go语言的变量定义 变量 声明变量 短声明 指针 new函数 变量的生命期 变量的作用域 点击直接资料领取 变量 声明变量 go定义变量的方式和c,c++,java语法不一样,如下 var go的所有类型在没有初始值时都默认会初始化为该类型的零值)。若p指向一个变量,那么p != nil 就是true,因为p会被赋予变量的地址。 如果flag.Parse报错,那么程序就会打印出一个使用说明,然后调用os.Exit(2)来结束。 让我们来测试一下上面的程序: $ go build gopl.io/ch2/echo4 $ . p := new(int) // p,类型*int,指向一个没有命名的int变量 fmt.Println(*p) // "0" *p = 2 fmt.Println(*p) // "2" 这种声明方式和普通的 变量的作用域 如果你有c,c++,java的经验,那么go语言的变量使用域名和这几门语言是一样的 一句话: 就近原则,定义在作用域用的变量只能在函数中使用。 如果外面有定义的同名变量,则就近原则。
在 Go 语言中,变量需要明确声明,编译器会使用这些声明来例如检查函数调用的类型正确性。 package mainimport "fmt"func main() {// 使用 var 可以声明一个变量 var a = "initial" fmt.Println(a)// 也可以同时声明多个变量 var b, c int = 1, 2 fmt.Println(b, c)// Go 会初始化变量的类型 var d = true fmt.Println(d)// 声明但未初始化的变量会被赋予零值 var e int fmt.Println(e)// `:=` 语法是声明并初始化变量的简写形式,例如,等同于 `var f string = "apple"`。 f := "apple" fmt.Println(f)}go run variables.goinital1 2true0apple
文章目录 1 一般语法 2 添加初始化器 3 简化变量声明 4 成块地声明变量 5 基本类型 6 类型转换 7 类型推断 8 常数类型 9 数字常数 1 一般语法 var 变量名 变量类型 多个同类型变量可以声明成一条语句 : var 变量名1, 变量名2, 变量名3 变量类型 变量声明可以是包级的或者函数级的,如: package main import "fmt" var c, python, java bool // 包级变量声明 func main() { var i int // 函数级变量声明 fmt.Println(i, c, python, java) } 2 添加初始化器 可以给每个变量添加一个初始化器 (initializer): var 变量名1, 变量名2 变量类型 = 初始化器1, 初始化器2 注意初始化器的个数必须与变量个数相同。 go参考文档 Go’s Declaration Syntax
Go语言变量 变量是一个数学定义,它是一个符号,表示某一个事物的取值。在编程语言里,它表示计算机能表示的抽象值概念或者说是计算结果。变量的体现在它的实际值可能在不断地变动。 Go语言变量由数字、大小写字母、下划线组成,但首字母不能是数字。这一点同其他语言。 Go语言标准的变量声明使用var关键字: var variable type Go语言也允许一次性声明多个同类型变量: var variable1, variable2 type Go语言一共支持三种变量声明 使用:=(数学意义为定义为)操作符可以高效地创建一个新的变量,这被称作初始化声明。 Go语言常量 常量与变量的定义相对应,它也表示抽象化的值概念,但它指向的数值一经定义后就不能再被修改。 iota是Go语言所引入的一个特殊常量,它特殊之处在于它的值可以被编译器修改。