go语言的变量与常量

变量

作用域:

在一个函数中使用某一变量会先在该作用域中寻找,如果没有会在上一层作用域中寻找,以此类推,如果全都没有则报错;

go语言中推荐使用小驼峰式命名(首字母小写,首字母之后的单词首字母大写);

同一个作用域内({})不能重复声明变量

go语言必须先声明再使用,go是静态类型语言,变量类型声明之后不可改变,,且声明的变量必须使用

变量可以声明为全局变量和局部变量,在函数外声明为全局变量,函数内声明为局部变量;

go语言无法直接定义二进制数

变量分类

  • 整型

int(不同操作系统下大小不一样,32位CPU就是4个字节,如果是64位就是8个字节)、int8、int16、int32、int64

在这里插入图片描述

package main

import "fmt"

// %v    只输出所有的值
// %+v 先输出字段类型,再输出该字段的值
// %#v 先输出结构体名字值,再输出结构体(字段类型+字段的值)

func main(){
    
    
  // 十进制以不同的进制展示
  var a int = 10
  fmt.Printf("%b \n", a)   // 1010  占位符%b表示二进制
  fmt.Printf("%o \n", a)   // 12    占位符%o表示八进制
  fmt.Printf("%d \n", a)   // 10    占位符%d表示十进制
  fmt.Printf("0x%x \n", a) // 0xa  占位符%x表示十六进制
    
    //b:=(int8)5,可以声明为int8类型的变量

  // 八进制(以0开头)
  var b int = 077
  fmt.Printf("%b \n", b)   // 111111
  fmt.Printf("%o \n", b)   // 77
  fmt.Printf("%d \n", b)   // 63
  fmt.Printf("0x%x \n", b) // 0x3f

  // 十六进制(以0x开头)
  var c int = 0xff
  fmt.Printf("0x%x \n", c) // 0xff
  fmt.Printf("0X%X \n", c) // 0xFF

  // 数字字面量语法(Number literals syntax)
  binary := 0b1111
  octal := 0o17
  digital := 15
  hexadecimal := 0xf
  specialhexa := 0x8p-2    // 8 / 2^2 = 2
  underline := 10_24

  fmt.Printf("binary : %b , digital : %d\n", binary, binary)
  fmt.Printf("octal : %o , digital : %d\n", octal, octal)
  fmt.Printf("digital type (变量类型): %T,digital : %d\n", digital, digital)
  fmt.Printf("hexadecimal : %x, digital : %d, specialhexa : %f\n", hexadecimal, hexadecimal, specialhexa)
  fmt.Printf("underline : %d \n", underline)
} 
  • string

    在go中只能用双引号进行表示,单引号为字符,字符串不可修改;

    一个字符’a’为一个字节(uint8),一个utf8编码的汉字字符为3个字节(是rune类型,golang中string底层是通过byte数组实现的,中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而Go语言默认使用UTF-8编码),len()求的是字节的数量byte 等同于int8,常用来处理ascii字符,rune 等同于int32,常用来处理unicode或utf-8字符

    (Unicode 是「字符集」 UTF-8 是「编码规则」)

    反引号

    反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出;

s1 := `第一行
第二行
第三行
`
s2 := `c:\weiyigeek\go\hello`  // 注意点此处没用转义符(\) 也能输出路径

fmt.Println(s1,s2) 

//字符串的修改
s2 := "白萝卜"
s3 = []rune(s2)
s3[0] = '红'
s4 = string(s3)
  • bool

    布尔值在go语言中默认为false,不允许将整型强转为布尔型,布尔值无法参与数值运算,也无法与其他类型进行转换

  • uint(不同操作系统下大小不一样)、uint8、uint16、uint32、uint64、uintptr(无符号整型,用于存放一个指针)

  • byte // uint8 的别名

  • rune // int32 的别名 代表一个 Unicode 码

  • float32、float64 //go中默认为float64

  • complex64、complex128

定义方式

var 变量名 变量类型

//法一
var a int 
a = 1
//法二
var a int = 1 //不建议,因为本身可以进行类型推导
//法三
var a = int32(1)//强制类型转换
//法四
a := int32(1)

var b string
var c,d int

var{
    
    
    a string
    b int
    c []float32
    d func() bool
    e struct {
    
    
        x int
    }
}

简短模式(short variable declaration):

除 var 关键字外,还可使用更加简短的变量定义和初始化语法。

名字 := 表达式

需要注意的是,简短模式(short variable declaration)有以下限制:

  • 定义变量,同时显式初始化。
  • 不能提供数据类型。
  • 只能用在函数内部
func main() {
	x:=100
    a,s:=1, "abc"
}

因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var 形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。

匿名变量:

func foo(){
    
    
	return 10,"123"
}

func main(){
    
    
    _, a = foo()
    a, _ = foo()
}

在多重赋值的时候,如果要想忽略某个值可以使用匿名变量接收要忽略的值,匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。

常量

定义之后不允许修改

const pi = 3.1415
const (
	n1 = 10
    n2 		//如果某一行没有写值,则该行变量的值和上一行是一样的
    n3 = "123"
)

iota

iota是go的常量计数器,只能在常量的表达式中使用,在const关键字出现时将被置为0,const中每新增一行常量声明将使iota计数一次(iota相当于const语句块中的行索引),使用iota可以简化定义,在定义枚举的时候很有用;

:不同const语句块中iota会重新置数

const(
	n1 = iota //0
    n2		  //1
    n3		  //2
    _		  // _ 会占位
    n4		  //4
    n5 = 100  //100
    n6		  //6
)

const(
	d1, d2 = iota +1, iota+2 //d1 = 1,d2 = 2 
    d3, d4 = iota +1, iota+2 //d3 = 2,d4 = 3
)//只有在新增一行的时候iota才会加1

//定义数量级
const(
	_ = iota
    kb = 1 << (10 * iota) //1左移十位为2^10
    mb = 1 << (10 * iota)
    gb = 1 << (10 * iota)
    tb = 1 << (10 * iota)
)

猜你喜欢

转载自blog.csdn.net/SFDWU3QVG/article/details/129637309