变量

变量、储存数据的一种容器

变量的声明方式有几种?

有 三种 第三种、是Go语言在类型推断的基础上增加了一点语法糖、并且第三种只能在 函数内部使用

  1. package main
  2. import "fmt"
  3. func main() {
  4. // 声明1 指定变量类型
  5. var name string
  6. // 声明2 类型推断
  7. var age = 20
  8. // 声明3 类型推断
  9. sex := "男"
  10. fmt.Println("name: ", name)
  11. fmt.Println("age: ", age)
  12. fmt.Println("sex: ", sex)
  13. }

类型推断可以带来哪些好处 ?

不显示的指定变量类型、可以使变量被赋予任何类型的值、 也就是说 变量在初始化时、值和类型由其它程序动态确定

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. )
  6. func main() {
  7. var name = getTheFlag()
  8. flag.Parse()
  9. fmt.Printf("Hello, %v!\n", *name)
  10. }
  11. func getTheFlag() *string {
  12. return flag.String("name", "everyone", "The greeting object.")
  13. }

变量的重声明是什么意思 ?

重声明指的是 对已经声明的变量、重新声明、重新声明是有条件的

  1. 由于变量的类型在初始化的时候就已经确定了、所以再次声明时 赋值的类型必须是和原来类型相同
  2. 变量的重声明 只会发生在某一个代码块中、否则就是其他情况了
  3. 变量的重声明 只会发生在以下情况、其他情况是无法通过编译的
  4. 被声明并赋值的变量必须是多个、至少要有一个新的变量、这时候才是重声明
  1. var err error
  2. n, err := io.WriteString(os.Stdout, "Hello, go!\n")

如果一个变量 与其外层代码中的变量 重名了会出现什么状况?

以下代码是可以运行的、原因如下:

  1. 使用变量时、会优先查找当前代码块的那个变量、不包含任何子块
  2. 如果当前代码块没有这个变量、则会向上层代码块一层层的寻找
  3. 如果还是找不到则 编译器会报错
  1. package main
  2. import "fmt"
  3. var block = "package"
  4. func main() {
  5. block := "function"
  6. {
  7. block := "inner"
  8. fmt.Printf("The block is %s.\n", block)
  9. }
  10. fmt.Printf("The block is %s.\n", block)
  11. }
  12. /**
  13. Output:
  14. The block is inner.
  15. The block is function.
  16. */

怎么判断一个变量的类型 ?

断言判断

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. var names = []string{"11"}
  7. if value, ok := interface{}(names).([]string); ok {
  8. fmt.Println("value: ", value)
  9. }
  10. }

各基础类型互转

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. func main() {
  7. var i = 10
  8. fmt.Println("int to string: ", fmt.Sprintf("%d", i))
  9. i, _ = strconv.Atoi("1000")
  10. fmt.Println("string to int: ", i)
  11. var i64 int64 = 100
  12. tempStr := strconv.FormatInt(i64, 10)
  13. fmt.Println("int64 to string: ", tempStr)
  14. i64, _ = strconv.ParseInt("10000", 10, 64)
  15. fmt.Println("string to int64: ", i64)
  16. fStr := strconv.FormatFloat(1.27, 'E', -1, 32)
  17. fmt.Println("float32 to string: ", fStr)
  18. fStr = strconv.FormatFloat(3.14, 'E', -1, 64)
  19. fmt.Println("float64 to string: ", fStr)
  20. // 字符串转 float32时会有问题、所以一般不用float32
  21. f32, _ := strconv.ParseFloat("3.13", 32)
  22. fmt.Println("string to float32: ", f32)
  23. f64, _ := strconv.ParseFloat("3.1416726", 64)
  24. fmt.Println("string to float64: ", f64)
  25. fmt.Println("rune to string: ", string([]rune{'\u4F60', '\u597D'}))
  26. str := string([]byte{'\xe4', '\xbd', '\xa0', '\xe5', '\xa5', '\xbd'})
  27. fmt.Println("byte to string: ", str)
  28. fmt.Println("string to byte: ", []byte(str))
  29. }

什么是 别名类型?什么是潜在类型?

image.png