c与ch的使用区别(ch5变量常量以及与其它语言的差异)
1.1、源码文件以_Test结尾:***_test.go;,我来为大家科普一下关于c与ch的使用区别?下面希望有你要的答案,我们一起来看看吧!
c与ch的使用区别
1、编写测试程序1.1、源码文件以_Test结尾:***_test.go;
1.2、测试方法名以Test开头:func Testxxx(t *testing.T) {…},首字母大写代表包外可以访问
- t.Log() 可以直接打印出结果
- cmd运行命令:go test -v ***_test.go (不加 -v 会没有对应的测试结果)。
// 标准格式
var 变量名称 数据类型 = 值;
// 自动推到类型格式
var 变量名称 = 值;
// 简短格式(golang官方推荐格式)
变量名称 := 值;
2.1 、声明方法
// 变量声明、初始化方法一
var a int = 1
var b int = 1
// 变量声明、初始化方法二
var (
a int = 1
b = 1
)
// 变量声明、初始化方法三,推荐使用该方法
a := 1 // := 表示自动推断变量类型
b := 1
// 变量声明、初始化方法四
var a int // 先声明后使用,一般是全局变量使用
var b int
a = 1
b = 1
2.2、与其他编程语言的差异:
赋值可以进行自动类型推断;
在一个赋值语句中可以对多个变量进行赋值。
2.3、使用简短格式:=赋值的注意点
- 简短模式的含义是定义的同时初始化
package main
import "fmt"
func main() {
num := 10
num := 20 // 编译报错, 重复定义
fmt.Println("num = ", num)
}
- 一定不要把:=当做赋值运算符来使用
package main
import "fmt"
var num = 10 // 定义一个全局变量
func main() {
num := 20 // 定义一个局部变量
fmt.Println("num = ", num)
test()
}
func test() {
fmt.Println("num = ", num) // 还是输出10
}
- :=只能用于定义局部变量,不能用于定义全局变量
package main
import "fmt"
num := 10 // 编译报错
func main() {
fmt.Println("num = ", num)
}
- 使用:=定义变量时,不能指定var关键字和数据类型
package main
import "fmt"
func main() {
//var num int := 10 // 编译报错
//var num := 10 // 编译报错
num int := 10 // 编译报错
fmt.Println("num = ", num)
fmt.Println("num = ", num)
}
- 变量组中不能够使用:=
package main
import "fmt"
func main() {
var(
num := 10 // 编译报错
)
fmt.Println("num = ", num)
}
- 通过:=同时定义多个变量, 必须给所有变量初始化
package main
import "fmt"
func main() {
//num1, num2 := 666, 888 // 正确
num1, num2 := 666 // 报错
fmt.Printf("%d, %d\n", num1, num2)
}
- 通过:=同时定义多个变量, 只要任意一个变量没有定义过,都会做退化赋值操作
发生退化赋值:
package main
import "fmt"
func main() {
// 定义一个变量num1
num1 := 10
// 同时定义两个变量num1和num2, 由于num2从来没有定义过,
// 所以对于num1来说:=退化为赋值运算符, 而对于num2来说:=仍然是定义 赋值
num1, num2 := 20, 30
fmt.Println("num1 = ", num1)
fmt.Println("num2 = ", num2)
}
不会发生退化的赋值:
package main
import "fmt"
func main() {
num1 := 10
num2 := 20
// 报错, 因为num1,和num2都已经被定义过
// 至少要有任意一个变量没有被定义过,才会退化赋值
num1, num2 := 30, 40
fmt.Println("num1 = ", num1)
fmt.Println("num2 = ", num2)
}
- 定义的局部变量或者导入的包没有被使用, 那么编译器会报错,无法编译运行,但是定义的全局变量没有被使用,编译器不会报错, 可以编译运行
func TestExchange(t *testing.T) {
a := 1
b := 2
a, b = b, a // 和python保持了一致
t.Log(a, b)
}
4.1、使用const声明(与C语言一致)
const 常量名称 数据类型 = 值or const 常量名称 = 值
4.2、与其他语言的差别在于简化了连续的赋值
在常量组中, 如果上一行常量有初始值,但是下一行没有初始值, 那么下一行的值就是上一行的值
package main
import "fmt"
func main() {
const (
num1 = 998
num2 // 和上一行的值一样
num3 = 666
num4 // 和上一行的值一样
num5 // 和上一行的值一样
)
fmt.Println("num1 = ", num1) // 998
fmt.Println("num2 = ", num2) // 998
fmt.Println("num3 = ", num3) // 666
fmt.Println("num4 = ", num4) // 666
fmt.Println("num5 = ", num5) // 666
const (
num1, num2 = 100, 200
num3, num4 // 和上一行的值一样, 注意变量个数必须也和上一行一样
)
fmt.Println("num1 = ", num1)
fmt.Println("num2 = ", num2)
fmt.Println("num3 = ", num3)
fmt.Println("num4 = ", num4)
}
4.3、枚举常量
Go语言中没有C语言中明确意义上的enum定义, 但是可以借助iota标识符来实现枚举类型,Go语言实现枚举格式
const(
枚举元素1 = iota
枚举元素2 = iota
... ...
)
- 利用iota标识符实现从0开始递增的枚举
package main
import "fmt"
func main() {
const (
male = iota
female = iota
yao = iota
)
fmt.Println("male = ", male) // 0
fmt.Println("male = ", female) // 1
fmt.Println("male = ", yao) // 2
}
iota注意点:
- 在同一个常量组中,iota从0开始递增, 每一行递增1
- 在同一个常量组中,只要上一行出现了iota,那么后续行就会自动递增
package main
import "fmt"
func main() {
const (
male = iota // 这里出现了iota
female // 这里会自动递增
yao
)
fmt.Println("male = ", male) // 0
fmt.Println("male = ", female) // 1
fmt.Println("male = ", yao) // 2
}
- 在同一个常量组中,如果iota被中断, 那么必须显示恢复
package main
import "fmt"
func main() {
const (
male = iota
female = 666 // 这里被中断, 如果没有显示恢复, 那么下面没有赋值的常量都和上一行一样
yao
)
fmt.Println("male = ", male) // 0
fmt.Println("male = ", female) // 666
fmt.Println("male = ", yao) // 666
}
package main
import "fmt"
func main() {
const (
male = iota
female = 666 // 这里被中断
yao = iota // 这里显示恢复, 会从当前常量组第一次出现iota的地方开始,每一行递增1, 当前是第3行,所以值就是2
)
fmt.Println("male = ", male) // 0
fmt.Println("male = ", female) // 666
fmt.Println("male = ", yao) // 2
}
- iota也支持常量组 多重赋值, 在同一行的iota值相同
package main
import "fmt"
func main() {
const (
a, b = iota, iota
c, d = iota, iota
)
fmt.Println("a = ", a) // 0
fmt.Println("b = ", b) // 0
fmt.Println("c = ", c) // 1
fmt.Println("d = ", d) // 1
}
- iota自增默认数据类型为int类型, 也可以显示指定类型
package main
import "fmt"
func main() {
const (
male float32 = iota // 显示指定类型,后续自增都会按照指定类型自增
female
yao
)
fmt.Printf("%f\n", male) // 0.0
fmt.Printf("%f\n", female) // 1.0
fmt.Printf("%f\n", yao) // 2.0
fmt.Println("male = ", reflect.TypeOf(female)) // float32
}
- Go语言中_单独作为标识符出现时, 代表空标识符, 它对应的值会被忽略;
- 规则必须遵守, 规范不一定要遵守, 但是建议遵守;
- Go语言的命名规范和C语言一样, 都是采用驼峰命名, 避免采用_命名:
驼峰命名: sendMessage / sayHello
_命名: send_message / say_hello
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com