Go语法基础之变量

1、变量

变量: 赋值后,可用改变值得标识符

建议采用驼峰法。

var a // 错误的,因为没有右边,go是强类型语言,此时不能使用右边来推导,左边又没有指定类型,所以错误。

var a = 100 //右边无类型常量,缺省雷士是int ,左边a 没有指定类型,用到类型推导,所以a 为int 类型,var a int = 100

var a int // 正确,但是没有赋值,go中正确的原因是 零值可用。 int 的零值是0

案例一:

package main

import (
	"fmt"
)

func main() {

	var (
		a = 100
		b int
		c string = "abc"
	)

	fmt.Println(a, b, c)
	// var a int ,b string //不支持,批量定义 var()
	// var a int, b int 错误
	var d, e int // 如果写在一行,必须同类型,只需要在最后指定类型就行
    var f, g int = 100,200 //如果要写在一行,必须同类型,只需要在最后指定类型就行,可以赋值,但要全部对于给出值。
	fmt.Println(d, e)
}

案例二:

func main() {

	a := 100 //赋值语句,段格式变量定义语句,定义变量,定义了变量标识符,右边可以用来推导a 的类型为int
	b := "abd"
	fmt.Println(a, b)

}


func main() {

	a := "100" //赋值语句,段格式变量定义语句,定义变量,定义了变量标识符,右边可以用来推导a 的类型为int
	b := "abd"
	fmt.Println(a, b)
	b = "a"
	b = a
	fmt.Println(a, b)
}

a := 100 //不能定义全局变量。



{
    var a int //零值0
    a := 200 //重复定义
    
    a,b := 123, "abcd" //竟然可以,在这里a不能重新定义为新类型,a被检测到了,go语言上只能迁就你了,但是要求a同类型,b是新定义的。
    
}


{
    a,b,c := 123, "abc",12.5 //定义赋值加推导,段格式批量同一行定义,因为短格式不能指定类型,所以采用类型推导,左右要求个数一致。
    fmt.Println(a,b,c)
    a,b = b,c //为什么是等号,不是变量定义,这是纯粹的赋值;
}


{
    var (
    	m = 111
        n = 222
    )
    // m,n = n,m //交换
    tmp := m
    m = n
    n = tmp
    fmt.Println(m,n)
    fmt.Println(tmp)
}


// _bank 空白标识符,只能用在左边,其它地方不可以用;
{
    a,_ ,c := 123,34 ,567
    _ //就是黑洞;
}

_下划线是空白标识符(Blank identifier)

1.1 短格式

  • 使用 := 定义变量并立即初始化
  • 只能用在函数中,不能用来定义全局变量
  • 不能提供数据类型,由编译器来推断;

1.2 零值

零值可用

  • int 0
  • float 0.0
  • bool false
  • string 为空串 ”“
  • 指针类型为nil

2 标识符本质

每一个标识符对于一个具有数据结构的值,但是这个值不方便直接访问,标识符就是一个指代。

标识符写代码时候,用来指代某个值,编译后还有变量、常量标识符吗? 没有了。。

因为数据在内存中,内存访问靠什么? 地址,标识符编译后就没有了就换成了地址了。

2.1 包级标识符

在Go语言中,在.go文件中的顶层代码中,定义的标识符称为包级标识符。如果首字母大写,可在包外可见。如果首字母小写,则包内可见。

案例一:

//同一个目录就是同一个包,同一个目录里面只能有一个包

package main 

import "fmt" //导入包或者第三方包

var a = 100  //全局变量,包内可见,

func main (){ //main函数入口函数,go约定main函数必须在main包中定义

}

顶层代码中定义包级标识符:

  • 首字母大写作为包导出标识符,首字母小写作为包内可见标识符

  • const定义包级常量,必须在声明时初始化

  • var定义包级变量

    • 可以指定类型,也可以使用无类型常量定义

    • 延迟赋值必须指定类型,不然没法确定零值

有相关关系的,可以批量定义在一起

一般声明时,还是考虑“就近原则”,尽量靠近第一次使用的地方声明

不能使用短格式定义。

bool在go中不是int类型,也不是其它整数类型。在go中,bool就是布尔型,和整型没有关系,就是完全不同的类型。

3 整型

长度不同:int8、int16(c语言short)、int32、int64

​ 最高位符号位

​ rune类型本质是int32

长度不同无符号:uint8、uint16、uint32、uint64

​ u即unsigned,最高位不是符号位

​ byte类型,它是uint8的别名

Go对类型近乎苛刻的语言,int、uint、int64、uint64,这四个都是完全不同的类型,不能互操作。

有符号,无符号类型:

​ u unsigned 无符号、以int8、uint8

​ 8bits,总共能表达256中状态。

​ int 8 ,1 byte ,8 bits,表示正负数,将最高位留出来不能表示数据状态,用1表示负,用0表示正,剩余7位表示数字,能够表示多少个不同的数字呢?256种

​ uint8,1字节,不能表示负数,所有的8位都用来表示数字

​ 能够表示多少个不同的数字呢? 256种

案例一:

fmt.Printf("%T %T %T %T\n",a,b,c,a+b+c) //format
Printf 往控制台打印,f是format

%T 占位符,和后面的值依次对应
%T 表示type,取值的类型
%d 占位符,数字类型,往往用于整数
%s 用string类型的值
%q 带字符串类型引号的%s ,quote 引号;
%c character 字符输出
%f 占位符,

fmt.Printf("%[1]d %d %[2]d %d ",100,200,300,400) 如果没有指定,是根据上面一个推下来。 
值从1开始编 %[index]? 下一个如果没有指定索引,索引默认是index+1



# type

type  A int32 //定义新类型
type B = int32 // 类型别名

type rune = int32 类型别名 ,type定义时使用了 = ,你等于我,你就是我,不是新类型,和int32是同一个类型

rune go内建的 ,
type myint int32 // 特别注意这里没有等号 = ,这不是别名,它是个新类型,新和旧类型不是同一个类型。


rune类型,保存的是什么? 字符的unicode码。

强制类型转换:显示 指明 类型转换 ,有可能失败

fmt.Println(a + int(m) ) // int(m)

string (整数值看做是)

强制类型转换: 把一个值从一个类型强制转换到另一种类型,有可能转换失败。

func main () {
	var m int64 = 50 
	fmt.Printf("%T %d\n" ,m,n)
	fmt.Printf("%T %s %q\n",sting(m),string(m),string(m)) //string (整数值看做是ascii或unicode码)
    fmt.Printf("%T %d\n",rune(m),rune(m))  //type rune= int32 4字节
    fmt.Printf("%T %[1]d\n",rune(m))  //通过索引的方式
}


fmt.Printf("%[2]T %[1]d\n",rune(m),stirng(m)) 值从1开始编

fmt.Printf("%[1]d %d %[2]d %d ",100,200,300,400) 如果没有指定,是根据上面一个推下来。

func main() {
	var a = '测'                       // rune int32
	fmt.Printf("%T %[1]d %[1]c\n", a) // 27979 rune是int32 是整数,"测”是字面表达,实际计算机存储色是数字
	a = 'c' //重新赋值,类型不变 int32 rune
    fmt.Printf("%T %[1]d %[1]c\n", a)
    a = 99 // unicode 兼容ascii 
    fmt.Printf("%T %[1]d %[1]c\n", a)
    a = '\x63' // \x指16进制字符表示法;
    fmt.Printf("%T %[1]d %[1]c\n", a)
}

   var m byte = '测'  不可以 爆了
    // uint8 int32= >27979 unicode编码不是utf-8
   fmt.Println(m)
 
   var m byte = 'a'  //ascii表不超过1字节, var m byte = byte('a')
  
	var d byte = '\x61'

可以认为go中没有字符类型,本质上是int32的别名,习惯上称为rune为字符类型

var a int32 = 123 //正确,指定了类型,也赋值。不会采用类型推导,隐式类型转换,语法糖。
var a int32 = int32(123) //

var a = '测'  //rune int32
a = 99  
//99是字面常量,默认类型是int,a=99 是赋值语句不是定义语句,a类型不变;
// a = int32(99) 

只限于 untyped constant;

编程中使用单独类型整型,浮点型、字符串、字符是最多的。

特别注意:字符串是若干字符组成,在内存中使用utf-8编码,而rune只能保存一个字符,输出是unicode

浮点数打印

func main() {
    fmt.Println(1000 + 3.6) 
    fmt.Printf("%f\n", 1000+2.486)
    fmt.Printf("%.2f\n", 1000+2.486)
    fmt.Printf("%3f\n", 1000+2.486) //打印宽度为3,默认右对齐;
    fmt.Printf("%7.1f\n", 1000+2.486) //宽度为7,保留一位小数
    fmt.Printf("%-10.1f\n", 1000+2.486) //左对齐
}

4 进制及转换

常见进制有二进制、八进制、十进制、十六进制。应该重点掌握二进制、十六进制。

十进制逢十进一;十六进制分十六进一;二进制逢二进一;

每8位(bit) 为一个字节(byte)

一个字节能够表示的整数的范围。

无符号数0~0xFF ,即0到255,256中状态。

有符号数,依然是256种状态,去掉最到位还剩7位,能够描述的最大正整数为127,那么负数最大就为-128 。也就是说负数有128个,正整数有127个,加0 ,共256种。

^托字符,这表示 幂运算

x进制 => 十进制

1111 1111

f f

二进制到16进制,每4位一断。

二进制到8进制,每3位一断

5 转义字符

每一个都是一个字符,rune类似(int32).可以作为单独字符使用,也可以作为字符串中的一个字符。

\a
\b
\f
\n
\r
\t
\v
\\
\'
\"

问题: 在Go中'\n'和"\n"的区别是什么?
字符和字符串,

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是Go语言基本语法和高级变量类型的介绍: 1. 变量声明和初始化 在Go语言中,可以使用var关键字声明变量变量声明可以包含一个或多个变量,可以在声明时初始化变量,也可以在后续代码中初始化变量。例如: ```go var name string var age int = 18 married := false ``` 2. 数据类型 Go语言中的数据类型包括基本数据类型和复合数据类型。基本数据类型包括bool、string、int、float等,复合数据类型包括数组、切片、结构体、接口、函数等。例如: ```go // 基本数据类型 var b bool = true var s string = "hello" var i int = 10 var f float32 = 3.14 // 复合数据类型 var arr [3]int = [3]int{1, 2, 3} var slice []int = []int{1, 2, 3} type Person struct { Name string Age int } var p Person = Person{Name: "Tom", Age: 18} ``` 3. 指针类型 Go语言中的指针类型用于存储变量的内存地址。可以使用&运算符获取变量的地址,使用*运算符获取指针指向的变量的值。例如: ```go var i int = 10 var p *int = &i fmt.Println(*p) // 输出:10 ``` 4. 结构体类型 Go语言中的结构体类型用于定义一组相关的数据字段。可以使用type关键字定义结构体类型,使用.运算符访问结构体字段。例如: ```go type Person struct { Name string Age int } var p Person = Person{Name: "Tom", Age: 18} fmt.Println(p.Name) // 输出:Tom ``` 5. 接口类型 Go语言中的接口类型用于定义一组方法签名。可以使用type关键字定义接口类型,使用实现接口的类型来实现接口方法。例如: ```go type Animal interface { Speak() string } type Dog struct {} func (d Dog) Speak() string { return "汪汪" } var a Animal = Dog{} fmt.Println(a.Speak()) // 输出:汪汪 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ehuo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值