Go的基础语法学习笔记 | 青训营笔记

98 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。

一、变量使用

含义

变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。

所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变

var名称类型是声明单个变量的语法,以字母或下划线开头,由一个或多个字母、数字、下划线组成

/**
    一、单变量声明
 */
//4、直接声明并赋值
var username string = "changluchanglu"func Test01(t *testing.T){
    //1、指定类型
    var name string
    name = "name"//2、自动推断(自动根据值来进行推断)
    var name1 = "name1"
    fmt.Println(name)
​
    //3、省略var(这种方式只能用在函数体中,不能用在全局变量)
    //3.1单个变量赋值时,必须是新变量
    name3 := "name3"
    //3.2多个变量赋值时,必须有一个时新变量
    name1,name2 := "hh","name2"
    fmt.Println(name)
    fmt.Println(name1)
    fmt.Println(name2)
    fmt.Println(name3)
    fmt.Println(username)
​
}

二、常量使用

2.1、常量的定义与使用

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

package main
​
import (
    "fmt"
    "testing"
)
​
//1、显示定义(指明类型)
const A string = "abc"
//2、隐式定义(不指明类型)
const B = "abc"func Test_03_01(t *testing.T){
    //多重赋值(函数体中)
    const C, D, E = "c","d","e"
    fmt.Println(C, D, E) //c d e
    const AREA float32 = 5.0
    const WIDTH float32 = 6.0
    //注意:这里相乘必须是float同一类型
    fmt.Println("面积为:", AREA * WIDTH) //面积为: 30//常量可作为枚举,没有逗号
    const (
        Unknow = 0
        Femal = 1
        Male = 2
    )
    fmt.Println(Unknow, Femal, Male) //0 1 2//常量可以不指定类型以及初始化值,则与上一行非空常量右值相同
    const (
        F string = "ff" //指定类型
        G   //默认与上面类型一致
        H = "abc"   //直接=
    )
    fmt.Println(F, G, H) //ff ff abc
}

注意点:

1、常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型

2、不曾使用的常量,在编译的时候,是不会报错的。

3、显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量是可以是不同的类型值

2、iota(特殊常量)

iota,特殊常量,可以认为是一个可以被编译器修改的常量

/**
  iota特殊常量使用(自增默认是int类型)
 */
//第一个 0,之后会依次递加
const (
    a = iota
    b = iota
    c = iota
)
​
//第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1
//好处:若是我们要定义多组数据按顺序,就可以写多个变量,第一个为iota即可
const (
    d = iota
    v
    z
)
​
//这里主要就是熟悉一下之前的,当第二个iota出现时,这个值也就是对应从aa到其次数累加1
//bb连上aa+1  dd与cc一致  gg与ff一致  hh连上之前数个+1,ii继续hh+1
const (
    aa = iota
    bb
    cc = "hh"
    dd
    ff = 100
    gg
    hh = iota
    ii
)
​
func Test03_02(t *testing.T){
    fmt.Println(a, b, c) //0 1 2
    fmt.Println(d, v, z) //0 1 2
    fmt.Println(aa, bb, cc, dd, ff, gg, hh, ii)//0 1 hh hh 100 100 6 7
}
​

如果中断iota自增,则必须显式恢复。且后续自增值按行序递增

自增默认是int类型,可以自行进行显示指定类型

数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址


三、基础数据类型

3.1、基本数据类型

快速检索:第3节:基础数据类型

image-20220423175910372

package main
​
import (
    "fmt"
    "testing"
)
​
/**
   一、基本类型
 */
//1、布尔类型:只可以是常量true或false
var bbb bool = true//2、整数类型
var num int = 100//3、字符串类型
var str string = "123"func Test_04_01(t *testing.T){
    //数据类型转换
    //可以自动转型或者手动转型
    var strNum = int(num)  //例如字符串"100" => 100
    fmt.Println(strNum)
}

3.2、 复合类型(派生类型)

/**
   二、复合类型
    1、指针类型(Pointer)
    2、数组类型
    3、结构化类型(struct)
    4、Channel 类型
    5、函数类型
    6、切片类型
    7、接口类型(interface)
    8、Map 类型
 */

四、运算符

算数运算符:+ - * / %(求余) ++ --
关系运算符:== != > < >= <=
逻辑运算符:
    运算符 描述
    &&  所谓逻辑与运算符。如果两个操作数都非零,则条件变为真
    ||  所谓的逻辑或操作。如果任何两个操作数是非零,则条件变为真
    !   所谓逻辑非运算符。使用反转操作数的逻辑状态。如果条件为真,那么逻辑非操后结果为假
位运算符:
   运算     描述                                                        示例
    &   二进制与操作副本位的结果,如果它存在于两个操作数                 (A & B) = 12, 也就是 0000 1100
    |   二进制或操作副本,如果它存在一个操作数                          (A | B) = 61, 也就是 0011 1101
    ^   二进制异或操作副本,如果它被设置在一个操作数就是按位取非           (A ^ B) = 49, 也就是 0011 0001
    &^  二进制位清空&^                                              (A&^B)=48,也就是110000
    <<  二进制左移位运算符。左边的操作数的值向左移动由右操作数指定的位数     A << 2 =240 也就是 1111 0000
    >>  二进制向右移位运算符。左边的操作数的值由右操作数指定的位数向右移动    A >> 2 = 15 也就是 0000 1111
运算符	             描述                              	           示例
=	   简单的赋值操作符,分配值从右边的操作数左侧的操作数	             C = A + B 将分配A + B的值到C
+=	   相加并赋值运算符,它增加了右操作数左操作数和分配结果左操作数	      C += A 相当于 C = C + A
-=	   减和赋值运算符,它减去右操作数从左侧的操作数和分配结果左操作数	     C -= A 相当于 C = C - A
*=	   乘法和赋值运算符,它乘以右边的操作数与左操作数和分配结果左操作数	    C * = A 相当于 C = C * A
/=	   除法赋值运算符,它把左操作数与右操作数和分配结果左操作数	           C /= A 相当于 C = C / A
%=	   模量和赋值运算符,它需要使用两个操作数的模量和分配结果左操作数	     C %= A 相当于 C = C % A
<<=	   左移位并赋值运算符	                                       C <<= 2 相同于 C = C << 2
>>=	   向右移位并赋值运算符	                                       C >>= 2 相同于 C = C >> 2
&=	   按位与赋值运算符	                                            C &= 2 相同于 C = C & 2
^=	   按位异或并赋值运算符	                                        C ^= 2 相同于 C = C ^ 2
|=	   按位或并赋值运算符	                                          C |= 2 相同于 C = C | 2
有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
优先级	运算符
7	~ ! ++ --
6	* / % << >> & &^
5	+ - ^
4	== != < <= >= >
3	<-
2	&&
1	||
当然,你可以通过使用括号来临时提升某个表达式的整体运算优先级。

五、键盘打印与输出

输出

fmt包:fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb(’verb’)源自C语言但更简单。

格式化打印占位符:
            %v,原样输出
            %T,打印类型
            %t,bool类型
            %s,字符串
            %f,浮点
            %d,10进制的整数
            %b,2进制的整数
            %o,8进制
            %x,%X,16进制
                %x:0-9,a-f
                %X:0-9,A-F
            %c,打印字符
            %p,打印地址
            。。。
import (
	"fmt"
	"testing"
)

func Test_05_01(t *testing.T) {
	a := 100           //int
	b := 3.14          //float64
	c := true          // bool
	d := "Hello World" //string
	e := "Ruby"        //string
	f := 'A'       //int32
	fmt.Printf("%T,%b\n", a, a)
	fmt.Printf("%T,%f\n", b, b)
	fmt.Printf("%T,%t\n", c, c)
	fmt.Printf("%T,%s\n", d, d)
	fmt.Printf("%T,%s\n", e, e)
	fmt.Printf("%T,%d,%c\n", f, f, f)
	fmt.Println("-----------------------")
	fmt.Printf("%v\n", a)
	fmt.Printf("%v\n", b)
	fmt.Printf("%v\n", c)
	fmt.Printf("%v\n", d)
	fmt.Printf("%v\n", e)
	fmt.Printf("%v\n", f)

}