Go 基础之数据类型、变量

Go 是一种类 C 语言,大部分语法和 C 类似。

一、第一个 go 程序,Hello world。

package main

import "fmt" // 实现格式化的 I/O

/* Print something */
func main() {
    fmt.Printf("Hello, world\n")
}
  • 在不引起语义混淆的情况下,Go 可以省略句末的分号,编译器会在每句末尾自动加上分号;并且强制要求左花括号位于句末,另起一行会出现编译错误。
  • 首行这个是必须的。所有的 Go 文件以 package <something> 开头,对于独立运行的执行文件必须是 package main
  • fmt 包(函数库)导入到 main,可以使用小括号导入多个包,如
import (
    "fmt"
    "io"
)
  • 在 Go 中, package 总是首先出现,然后是 import,接着是其他所有内容。当 Go 程序在执行的时候,首先调用的函数是 main(),这是从 C 中继承而来。
  • Go 的注释可以用 C 风格注释 /* */ 和 C++ 风格注释 / /。

二、变量、数据类型

1、变量

  • Go 声明变量时类型放在变量名之后 var varname vartype。其中 var 为声明变量的保留字。Go 编译器会对未初始化的变量自动赋值其类型的 0 。

    /* 先声明,后初始化 */
    var a int // 声明 int 类型变量
    var b bool // 声明 bool 类型变量
    a = 10 // 赋值
    b = true
    
    /* 声明变量并初始化 */
    var c int = 12 
    
    /* 声明并赋值的简写形式,变量类型是根据值推断出来的,但是只能用在函数内部 */
    d := 8 
    • 多个 var 的声明可以成组(使用圆括号),const 和 import 同样可以如此做。相同类型的多个变量可以放在同一行,也可以使用平行赋值。一个特殊的变量名 _ 表示赋给它的值都将被丢弃。
    /* 成组声明变量 */
    var (
        ia int
        bb bool
    )
    
    /* 相同类型变量同行声明 */
    var ic, id int
    var ic, id int = 1, 2 // 声明并初始化
    
    /* 平行赋值 */
    ie, bg := 3, true // ie = 3, bg = true
    _, bg := 3, true // 3被丢弃

    注意:Go 编译器对声明但未使用的变量会报错。

2、类型

  • bool 类型

    • 值为 true 和 false。
  • 数字类型

    • 整型

      有符号整数:int int8 int16 int32 int64
      无符号整数:uint uint8(byte) uint16 uint32 uint64

      byteuint8 的别名,runeint32 的别名。

      赋值可以用八进制、十六进制或科学计数法: 077, 0xFF, 1e3 或者 6.022e23 这些都是合法的。
      注意:int 类型是和系统相关的,在 32位操作系统上是32位,64为操作系统上时64位。其他类型都和系统类型无关。

      注意:不同的数据类型之间不能混用,否则会出现编译出错。Go 的数据类型不支持隐式转换,必须显示转换。

      var a int = 2
      var b int32
      b = a + a // 错误,int 不能隐式转换为 int32
      b = b + 5 // 可以
    • 浮点型

      float32 float64

    • 常量

      常量(const)是在编译时被创建。只能是数字,字符串和布尔型。可以使用 itoa 生成枚举值,第一次使用时值为 0,再一次在新行使用时值加 1。

      const x = 4 // 声明常量     
      /* 成组声明 */
      const (
          x1 = 4
          y1 = true
      )
      /* itoa生成枚举值 */     
      const (
          a = iota // a = 0
          b = iota // b = 1
          c        // c = 2 可以省略重复的 itoa,其值自动加 1
      )
  • 字符串

    字符串在 Go 中是 UTF-8 的由双引号(”“)包裹的字符序列。如果你使用单引号(”)则表示一个字符( UTF-8编码)——这种在 Go 中不是 string。

    注意:一旦给变量赋值,字符串就不能修改了:在 Go 中字符串是不可变的。

    var s string = "hello"
    s[0] = 'c'  // 报错
    
    /* 先转换在修改 */
    s := "hello"
    c := [] byte(s) 0.
    c[0] = 'c' 1.
    s2 := string(c) 2.
    fmt.Printf("%s\n", s2) 

    多行字符串连接需要将 “+” 放在当前行尾部,不要放在下一行开头,否则编译器会误解加入分号导致错误。另一种方式是使用反引号 ` 作为原始字符串符号,但是此时引号中的转义字符不会被转义。

    s := "Starting part"
        + "Ending part"
    // 会被转换为:
    s := "Starting part" ;
        + "Ending part" ;
    // 这是错误的语法,应当这样写:
    s := "Starting part" +
        "Ending part"
    // 使用反引号 ` 作为原始字符串符号,但转义字符不被解释
    s := `Starting part // s 中含有换行符
        Ending part`
  • rune

    Rune 是 int32 的别名。用 UTF-8 进行编码。一般用在需要遍历字符串中的字符。可以循环每个字节(仅在使用 US ASCII 编码字符串时与字符等价,而它们在 Go 中不存在!)。因此为了获得实际的字符,需要使用 rune 类型。

  • 复数

    Go 原生支持复数。默认变量类型complex128 ( 64 位虚数部分)。还有 complex64(32 位的虚数部分)。复数写为 re + im ire 是实数部分,im 是虚数部分,而 i 是标记 ‘i’ ( √− 1)。

    var c complex64 = 5+5i;
    fmt.Printf("Value is: %v", c)

    将会打印: (5+5i)。

    注意:对于简写形式复数声明赋值如 v := a + bib 必须存在,否则出现 i 无定义。

  • 错误

    Go 有为了错误而存在的内建类型,叫做 error。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章