zl程序教程

您现在的位置是:首页 >  后端

当前栏目

golang学习一:Go语言开发环境,基础类型, fmt包的格式化输出输入,运算符

2023-09-27 14:29:29 时间

一、Go语言是什么:

快速开发与执行执行效率的平衡;

1. 优点:

  • 上手难度低;
  • 效率高: c的执行效率, python的开发效率;
  • 社区;
  • 天然并发;

2. GO适合用来做什么:

  • 服务器编程;
  • 分布式系统;
  • 网络编程;
  • 内存数据库;
  • 云平台;
  • 区块链:

二、Go语言开发环境:

1. 下载程序安装包:

中文社区

2.安装环境:

  • 双击安装包;
  • 测试: cmd -> “go”;
    在这里插入图片描述

3. 安装IDE:

  • 使用vscode
  • 使用GoLand IDE;

4. 第一个go程序:

// 1. go语言以包为单位
// 2. 每个文件必须生命包
// 3. 程序必须有一个main包
package main

import "fmt"	// 导入系统包   标准输入输出包

// 入口函数
func main() {
	fmt.Println("hello Go")
}

二、基础类型:

1. 变量:

  • 在同一个{}中, 声明的变量是唯一;
  • 变量一定是先声明, 再使用;

1.1 指定类型

语法:

// 方法1:
// var 变量名 变量类型
var a int	// 默认值为: 0
var b, c int

// 方法2:
// var 变量名 变量类型 = 值
var d int = 10

1.2 类型推导:

// 根据赋值自动推导变量类型;
语法:

var a = 10;

// 海象赋值
// := 左边必须是没有使用过的变量名;
// 自动推导生成的变量不能再改变数据类型
b := 10 

c, d, e := 20, 3.14, "hello"

1.3 Printf与Println的区别:

  • Printf: 格式化输出:
  • Println: 输出后换行;
func main() {
	var a int = 10
	fmt.Print(a)	// 打印不换行
	fmt.Printf("a = %T", a)	// 不换行
	fmt.Println("a =", a)
}

1.4多重复值与匿名变量:

两数交换:

i, j := 10, 20

i, j = j, i
fmt.Println(i, j)

匿名变量:

func fun1(){
	return 1, 2
}
// _ 为匿名变量
tmp, _ = fun1()

1.5 多个变量:

语法:

var (
	变量名 变量类型 = 值
	变量名 变量类型 =)

1.6 常量

语法:

const 变量名 变量类型 =const (
	变量名 变量类型 = 值
	变量名 变量类型 =)

2. iota枚举类型:

常量声明可以使用iota常量生成器初始化, 它用于生产一组以相似规则初始化的常量, 但是不用每行都写一遍初始化表达式;

  • iota是一个常量生成器;
  • 在一个const声明中, 在第一个声明的常量所在的行, iota将会被初始化为0, 然后在每一个有常量声明的行加1;
func main() {
	const (
		x = iota // x = 0
		y = iota // y = 1
		z = iota // z = 2
		w        // 这里隐式的w = iota, 因此w = 3
	)
	fmt.Println(x, y, z, w)

	const u = iota // 每遇到一个const, iota就会重置, 此处u = 0
	fmt.Println(u)

	const (
		h, i, j = iota, iota, iota // h = 0, i = 0, j = 0, iota在同一行, 值相同
	)
	fmt.Println(h, i, j)
}

3. 数据类型:

3.1 Go语言内置数据类型:

类型名称长度零值说明
bool布尔类型1false不可以用数字代表, 取值: [true, false]
byte字节型10uint8别名
rune字符类型40专用于存储unicode编码, 等价于unint32
int, uint整型4或8032位或64位
int, uint8整型10-120~127, 0~255
int16, uint16整型20-32768~32767, 0~65535
int32, uint32整型40-21亿~21亿, 0~42亿
int64, uint64整型80
float32浮点型80.0小数位精确到7位
float64浮点型80.0小数位精确到15位
complex63复数类型8
complex128复数类型16
uintptr整型4或8位足以存储32位指针的uint32或uint64整数
string字符串utf-8字符串

3.2 布尔类型:

3.3 整型:

注意有无符号的整型;

3.4 浮点类型:

3.5 字节类型:

  • 单引号表示"字符", 双引号表示"字符串"
  • 字符串末尾有\0, 是字符串结束的标志;
func main() {
	var a byte = 'a'
	fmt.Println(a)	// 97
	fmt.Printf("%T\n", a)	// uint8

	// %c是一个占位符, 表示打印输出一个字符
	fmt.Printf("%c\n", 97)	// a

	// 输出ascii码
	var b byte = '0'
	fmt.Println(b)	// 48
}

3.6 字符串:

func main() {
	// 定义声明
	var s1 string
	s1 = "hello world"

	// 自动推导
	s2 := "你好, 世界"
	fmt.Println(s2)        // 你好, 世界
	fmt.Printf("%T\n", s2) // string

	// len函数: 计算字符串中字符的个数, 不包含 \0
	// 在go语言中, 一个汉字占3个字符
	fmt.Println(len(s1)) // 11
	fmt.Println(len(s2)) // 14

	// 字符穿拼接
	s3 := s1 + s2
	fmt.Println(s3) // hello world你好, 世界
}

3.7 字符与字符串的区别:

  • 字符使用单引号; 字符串使用双引号;
  • 字符都是一个字符; 字符串可以有多个字符组成;
  • 字符串的每个字符都有下标, 从0开始, 获取的是字符;
func main() {
	ch := 'a'
	fmt.Println(ch) // 97

	str := "hello world"
	fmt.Println(str)            // hello world
	fmt.Println(str[1], str[5]) // 101 32
	fmt.Printf("%c, %c\n", str[1], str[5])	// e,  
}

3.8 复数类型:

func main() {
	var fu complex64
	fu = 2.1 + 3.14i
	fmt.Println(fu) // (2.1+3.14i)

	fu2 := 2.2 + 6.28i
	fmt.Println(fu2)        // (2.2+6.28i)
	fmt.Printf("%T\n", fu2) // complex128: 默认推导的是128

	// 通过内建函数获取"实部"和"虚部"
	fmt.Println(real(fu2), imag(fu2)) // 2.2 6.28
}

三、fmt包的格式化输出输入:

1. 格式化说明

格式含义
%%一个%字面量
%b一个二进制整数值(基数为2), 或者是一个(高级的)用科学计数法表示的指数为2的浮点数
%c字符型. 可以个输入的数组按照ASCII码相应的转换为对应的字符
%d一个十进制数值(基数为10)
%e以科学技术法e表示浮点数或复数;
%E以科学计数法E表示浮点数或复数值;
%f以标准计数法表示的浮点数或者复数
%g以%e或%f表示的浮点数或复数, 任何一个都以最为紧凑的方式输出
%G以%E或%f表示浮点数或复数, 任何一个都以最为紧凑的方式输出
%o一个以八进制表示的数字(基数为8)
%p以十六进制(基数为16)表示的一个值的地址, 前缀为0x, 字母使用小写的a-f表示
%q使用Go语法以及必须时使用转义, 以双括号括起来的字符串后者字节切片[]byte, 或是以单引号括起来的数字;
%s字符串. 输出字符串中的字符直至字符串中的空字符(字符串以’\0’结尾, 这个’\0’即空字符)
%t以true或false输出布尔值
%T使用Go语法输出的值的类型
%U一个Unicode表示的整型码点, 默认值为4个数字字符
%v使用默认格式输出的内置或者自定义类型, 或者是使用其类型的String()方式输出的自定义值, 如果该方法存在的话
%x以十六进制表示的整型值, 数字a-f使用小写
%X以十六进制表示的整型值, 数字A-F使用大写

2. 输入:

func main() {
	var a int
	// 阻塞进程, 等待用户输入
	// 格式化输入
	fmt.Scanf("%d", &a)
	fmt.Println(a)
}

四、类型转换与别名:

1. 类型转换:

在类型转换时建议将低类型转换成高类型, 保证数据的精度;
int8 --> int16 --> int32 --> int64
float32 --> float64
iny64 --> float64

2.类型别名:

type asname 类型名

type (
	asname1 类型名
	asname2 类型名
)

五、运算符:

1. 算数运算符:

运算符术语
+
-
*
/
%取模(取余)
++后自增, 没有前自增
后自减, 没有前自减

2. 关系运算符:

结果是布尔值

运算符术语
==相等
!=不等
<小于
>大于
<=小于等于
>=大于等于

3. 逻辑运算符:

运算符术语
!
&&
||

4. 位运算符:

运算符术语说明示例
&按位与参与运算的两数各对应的二进制相与60 & 13 = 12
|按位或参与运算的两数各对应的二进制相或60 | 13 = 61
^异或参与运算的两数各对应的二进制相异或, 当两数对应的二进制向异时, 结果为160 ^ 13 = 240
<<左移左移n位就是乘2的n次方. 左边丢弃, 右边补04 << 2 = 16
>>右移右移n位就是除以2的n次方. 右边丢弃, 左边补位.4 >> 2 = 1

5. 赋值运算符:

6. 其他运算符:

运算符说明
&取地址
*取值运算符(指针)

7. 运算符等级: