• go基础语法


    01 关键字与标识符

    标识符

    标识符的作用

    • 标识符是用来标识go中的变量名或函数名的

    标识符的命名规范

    规范

    • 以字母或者_开头,后面跟着字母、数字、_

    合法标识符举例

    • a_b
    • _a
    • ab_23d

    非法标识符举例

    • 1ab 以数字开头
    • case go里面的关键字
    • a+b 带了运算符

    空白标识符

    • _ 本身就是一个特殊的标识符,被称为空白标识符
    • 用来导入包,只初始化init函数,不使用内部方法
    • 函数返回值不使用变量,多变量返回

    25个关键字

    break     default      func    interface  select
    case      defer        go      map        struct
    chan      else         goto    package    switch
    const     fallthrough  if      range      type
    continue  for          import  return     var
    
    

    36个 预定义标识符

    • 基本类型的名称
    • 一些基本的内置函数
    append	bool	byte	cap	close	complex	complex64	complex128	uint16
    copy	false	float32	float64	imag	int	int8	int16	uint32
    int32	int64	iota	len	make	new	nil	panic	uint64
    print	println	real	recover	string	true	uint	uint8	uintptr
    
    
    

    02 操作符

    算术运算符

          • / % ++ --
    • 代码如下
    package main
    
    import "fmt"
    
    func main() {
    
    	var a = 21
    	var b = 10
    	var c int
    	fmt.Printf("[初始化的值是什么: a=%d b=%d c=%d]
    ", a, b, c)
    	// 加法
    	c = a + b
    	fmt.Printf("[加法操作: a+b=%d]
    ", c)
    	// 减法
    	c = a - b
    	fmt.Printf("[减法操作: a-b=%d]
    ", c)
    	// 乘法
    	c = a * b
    	fmt.Printf("[乘法操作: a*b=%d]
    ", c)
    	// 减法
    	c = a / b
    	fmt.Printf("[除法操作: a/b=%d]
    ", c)
    	// 取余
    	c = a % b
    	fmt.Printf("[减法操作: a对b取余=%d]
    ", c)
    	// 自增
    	c++
    	fmt.Printf("[c自增: c++=%d]
    ", c)
    
    	// 自减
    	c--
    	fmt.Printf("[c自减: c++=%d]
    ", c)
    	/*
    		[初始化的值是什么: a=21 b=10 c=0]
    		[加法操作: a+b=31]
    		[减法操作: a-b=11]
    		[乘法操作: a*b=210]
    		[除法操作: a/b=2]
    		[减法操作: a对b取余=1]
    		[c自增: c++=2]
    		[c自减: c++=1]
    	*/
    }
    
    

    关系运算符

    • > < == !=
    package main
    
    import "fmt"
    
    func main() {
    	var a = 10
    	var b = 5
    
    	if a > b {
    		fmt.Printf("a>b")
    	}
    }
    
    

    逻辑运算符

    • && 逻辑 AND 运算符
    • || 逻辑 OR 运算符
    • ! 逻辑 NOT 运算符
    package main
    
    import "fmt"
    
    func main() {
    	var a = true
    	var b = false
    	if a && b {
    		fmt.Printf("[ab 同为true才为true]
    ")
    	}
    	if a || b {
    		fmt.Printf("[a b 中有一个为true 就是true]
    ")
    	}
    	if !(a && b) {
    		fmt.Printf("[a b同为true再取非为true]
    ")
    	}
    }
    
    

    位运算符

    • 与操作 & 二进制位同为1 结果为1
    • 或操作 | 二进制位至少一个为1 结果为1
    • 异或操作 ^ 二进制位不同时 结果为1
    • 左移运算符 << 左移n位就是乘以2的n次方
    • 右移运算符 >> 右移n位就是除以2的n次方
    package main
    
    import "fmt"
    
    func main() {
    
    	var a uint = 60
    	var b uint = 13
    	var c uint = 0
    	fmt.Printf("[a=%d 二进制=%08b]
    ", a, a)
    	fmt.Printf("[b=%d 二进制=%08b]
    ", b, b)
    
    	c = a & b
    	fmt.Printf("[与操作][%d=%d&%d][%08b=%08b & %08b ]
    ", c, a, b, c, a, b)
    
    	c = a | b
    	fmt.Printf("[或操作][%d=%d | %d][%08b=%08b | %08b ]
    ", c, a, b, c, a, b)
    
    	c = a ^ b
    	fmt.Printf("[异或操作][%d=%d^%d][%08b=%08b ^ %08b ]
    ", c, a, b, c, a, b)
    
    	c = a << b
    	fmt.Printf("[左移放大操作][%d=%d&%d][%08b=%08b & %08b ]
    ", c, a, b, c, a, b)
    
    	c = a >> b
    	fmt.Printf("[右移动缩小操作][%d=%d&%d][%08b=%08b & %08b ]
    ", c, a, b, c, a, b)
    
    	/*
    		[a=60 二进制=00111100]
    		[b=13 二进制=00001101]
    		[与操作][12=60&13][00001100=00111100 & 00001101 ]
    		[或操作][61=60 | 13][00111101=00111100 | 00001101 ]
    		[异或操作][49=60^13][00110001=00111100 ^ 00001101 ]
    		[左移放大操作][491520=60&13][1111000000000000000=00111100 & 00001101 ]
    		[右移动缩小操作][0=60&13][00000000=00111100 & 00001101 ]
    	*/
    }
    
    

    赋值运算符

    • += -= *= ...
    package main
    
    import "fmt"
    
    func main() {
    	var a = 21
    	var c int
    
    	c = a
    	fmt.Println(c, a)
    	c += a
    	fmt.Println(c, a)
    	c *= a
    	fmt.Println(c, a)
    	/*
    		21 21
    		42 21
    		882 21
    	*/
    }
    
    

    关于指针的运算符

    • & 返回变量存储地址 可以使用%p去打印地址
      • 指针变量 var a *int
        1. 用来定义变量,类型是指针的
        2. 可以对指针地址再赋值或取值
    package main
    
    import "fmt"
    
    func main() {
    	var a = 4
    	var ptr *int
    	fmt.Printf("[a 变量类型为 %T]
    ", a)
    	fmt.Printf("[ptr 变量类型为 %T]
    ", ptr)
    
    	ptr = &a
    	fmt.Printf("[a 变量的值为 %d]
    ", a)
    	fmt.Printf("[*ptr 的值为%d ]
    ", *ptr)
    	fmt.Printf("[ptr 的值为%v ]
    ", ptr)
    	fmt.Printf("[a 的指针地址为%p ]
    ", &a)
    
    	/*
    		[a 变量类型为 int]
    		[ptr 变量类型为 *int]
    		[a 变量的值为 4]
    		[*ptr 的值为4 ]
    		[ptr 的值为0xc00001a098 ]
    		[a 的指针地址为0xc00001a098 ]
    	*/
    }
    
    

    03 变量、常量、枚举

    变量

    方法一:使用var 声明变量并初始化

    • 关键字var可以使用结构类型声明变量,并初始化为零值,举例
    var p int
    
    
    • 关键字 var 创建了类型为 int 且名为 p 的变量,p被称作类型 int 的一个实例(instance)。
    • 当声明变量时,这个变量对应的值总是会被初始化。
    • 使用var关键字用零值初始化,对数值类型来说,零值是 0;对字符串来说,零值是空字符串;对布尔类型,零值是 false。
    • 多变量声明 var a,b,c,d string

    var 等号 :使用自定义数据初始化

    • var p int = 10

    var特点:可以在函数外部使用,可以声明初始化全局变量

    • 举例使用 var=XXXX 初始化全局缓存

    方法二:使用短变量声明操作符(:=) 初始化

    特点1:使用自定义值初始化

    • p:=10

    特点2:不可以在函数外部使用,不可以声明初始化全局变量

    • 可以试一试 .compute.go:8:1: syntax error: non-declaration statement outside function body

    常量 const定义的

    • 定义在全局的位置,函数外部
    • 常量必须赋值,否则报 Missing value in const declaration
    const Pi = 3.1415
    const Max float64 = 1000.11111
    const cname = "go编程"
    const dname
    
    
    

    枚举

    • go中没有enum这么一个关键字来定义,而是依靠const和iota
    package main
    
    import "fmt"
    
    const (
    	a = iota
    	b
    	c
    	d
    )
    
    func main() {
    
    	fmt.Println(a, b, c, d)
    }
    
    
    
    • 自定义类型
    package main
    
    import "fmt"
    
    type MyType int
    
    const (
    	T1 MyType = iota
    	T2
    	T3
    	T4
    )
    
    func main() {
    
    	fmt.Println(T1, T2, T3, T4)
    }
    
    
    
    • _ 可以跳过值
    package main
    
    import "fmt"
    
    type MyType int
    
    const (
    	T1 MyType = iota
    	T2
    	_
    	_
    	T3
    	T4
    )
    
    func main() {
    
    	fmt.Println(T1, T2, T3, T4) //0 1 4 5
    
    }
    
    
    
    • 中间插值 iota 会被覆盖掉 不再继续自增。但是用另一个 iota 接一下,又会继续自增
    package main
    
    import "fmt"
    
    type MyType int
    
    const (
    	a = iota
    	b = 5
    	c
    	d = iota
    	e
    )
    
    func main() {
    
    	fmt.Println(a, b, c, d, e) //0 5 5 3 4
    
    
    }
    
    
    
    • 位掩码表达式
    package main
    
    import "fmt"
    
    type MyType int
    
    const (
    	T1 MyType = 1 << iota
    	T2
    	_
    	_
    	T3
    	T4
    )
    
    func main() {
    
    	fmt.Println(T1, T2, T3, T4) //1 2 16 32
    
    
    }
    
    
    
    • 定义数量级 ,比如说字节大小
    package main
    
    import "fmt"
    
    type MyType int
    
    const (
    	_          = iota
    	KB float64 = 1 << (10 * iota)
    	MB
    	GB
    	TB
    )
    
    func main() {
    
    	fmt.Println(KB, MB, GB, TB) //1024 1.048576e+06 1.073741824e+09 1.099511627776e+12
    	fmt.Println(1 << 10)
    }
    
    
    

    04 变量作用域

    • 在 Golang 中,变量作用域分为 :本地局部变量、全局变量、参数变量

    本地局部变量

    • 在函数、if 、for等中定义的变量,
    • 生效范围:定义在函数里面则在整个函数范围有效; 定义在语义块,则在整个语义块生效
    package main
    
    import "fmt"
    
    func T1() string {
    	str1 := "函数T1中的字符串变量"
    	fmt.Println(str1)
    	return str1
    }
    
    func main() {
    	// .compute.go:12:14: undefined: str1
    	// 试图引用在函数里面定义的变量
    	//fmt.Println(str1)
    
    	for i := 0; i < 10; i++ {
    		fmt.Println(i)
    	}
    	// 报错是这个.compute.go:18:14: undefined: i
    	// 试图引用在for里面定义的变量
    	//fmt.Println(i)
    
    	if str := T1(); str == "" {
    		fmt.Println("[函数返回为空]")
    	}
    	// 
    	// 报错是这个.compute.go:26:14: undefined: str
    	// 试图引用在if里面定义的变量
    	//fmt.Println(str)
    }
    
    
    

    全局变量 var xxx

    参数变量

  • 相关阅读:
    jedis jedispool Redistemplate
    开箱一个docker
    JPA分页查询与条件分页查询
    基于token与基于服务器的身份认证
    uni-app第三方登陆-微信
    main.js中封装全局登录函数
    idea搭建可运行Servlet的Web项目[maven]
    什么是servlet?
    简单了解request与response
    颓废的三天
  • 原文地址:https://www.cnblogs.com/zhanghan5/p/15004967.html
Copyright © 2020-2023  润新知