变量指向一个内存地址,其中存储了某种类型的值。在静态语言中,此内存存储的变量类型不可变。

  1. Go 中的变量如何声明?
  2. Go 变量声明可以指定哪些类型?
  3. Go 中如何实现类型的转换和断言?

1. Go 中的变量如何声明

使用 var 关键词声明变量,有以下几种可变形式:

  1. 简单的类型声明:var a int
  2. 声明并赋初值:var a int = 1 或 var a = 1
  3. 同时声明多个变量: var a, b = 1, 2

当声明初始值时,可以不用指定类型,Go 会根据赋值判断并自动定义变量的类型。

以下为变量声明的示例:

package main

import "fmt"

func main() {
  var a int 
  var b int = 2 
  var c = 3 
  
  var d, e  = 4, 5
  
  fmt.Printf("a: %d, b: %d, c: %d, d: %d, e: %d", a, b, c, d, e)
}

Go 还提供了省略 var 关键词的声明方式,需要注意的是,已经声明的变量不能再次使用 :=,除非左边有新的变量:

package main

import "fmt"

func main() {
    a := 1
    fmt.Println(a)
    
    a, b := 2, 3
    fmt.Printf("a: %d, b: %d", a, b)
}

2. Go 变量声明可以指定哪些类型

  • bool, string
  • byte, rune
  • float32, float64, complex64, complex128
  • (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr

byte 是 uint8 的别名,rune 是 int32 的别名。 byte代表的是字节,rune 代表的是字符。在 utf8 编码中,1个中文字符占用 3个字节。

complex64的实部和虚部都是float64类型,complex128同理。

3. Go 中如何实现类型的转换

  1. int -> int64
  2. string -> int
  3. int -> string

更多转换查看 strconv包

注意:int 转换为 int64 在32位机器上存在精度问题。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // int 到 int64
    a := 1
    b := int64(a)
    fmt.Printf("a: %d, b: %d", a, b)

    // string 到 int
    c := "123"
    d, _ := strconv.Atoi(c)
    fmt.Printf("c: %s, d %d", c, d)

    // int 到 string
    e := 234
    f := strconv.Itoa(e)
    fmt.Printf("e: %d, f %s", e, f)

    // float32 到 string
    g := 3.14
    h := strconv.FormatFloat(g, 'E', -1, 32)
    fmt.Printf("g: %f, h: %s", g, h)
}

Reference


Donne
694 声望25 粉丝

知其然,知其所以然。