【Go编程语言】 Go语言基础语法
Go语言基础语法
文章目录
- Go语言基础语法
- 一、注释
- 1.单行注释
- 2.多行注释
- 二、变量
- 1.变量的定义
- 2.变量的初始化
- 3.理解变量(内存地址)
- 4.变量交换
- 5.匿名变量
- 6.变量的作用域
- 三、常量
- 1.常量的定义: const
- 2.iota(特殊常量)
- 四、基本数据类型
- 1.布尔类型
- 2.数值型
- 3.字符串型
- 4.数据类型的转换
- 五、运算符
- 1.算术运算符
- 2.关系运算符
- 3.逻辑运算符
- 4.位运算符
- 5.赋值运算符
- 6.其他运算符
- 六、键盘的输入和输出
一、注释
- 我们在写代码的时候会有这种情况时长发生,刚写完的代码,觉得逻辑很清晰,自己怎么这么厉害,过一段时间再去看这个代码,就会产牛疑问,这个代码到底TM谁写的!所以为了防止自己看不懂自己的代码,或者你想把你写的代码给别人看,这个时候,我们就需要汗释了!
注释:你可以理解为写给人看的,机器并不会去执行这行语句。
- 注释主要的功能就是为了增强代码的可读性,不参与程序的一切功能,Go语言的注释主要分成两类。
1.单行注释
package main
// 双斜杠表示单行注释,程序不会执行这行语句,这是写给自己或他人看的
import "fmt"func main() {fmt.Printf("helloword!")
}
2.多行注释
package main
/*杠星 星杠表示多行注释,在二者之间的范围内可以换行写多行注释
*/
import "fmt"/*这是一个main函数,这是go语言启动的入口
*/
func main() {// fmt.Printfln:打印一行内容,然后执行完成后进行换行fmt.Printfln("hello,word!")
}
养成写注释是一个良好的习惯,方便自己阅读,也方便他人阅读
二、变量
- 在数学概念中,变量表示没有固定值且可改变的数。比如 x=1,x= 2;
- 字面上的意思理解:变量就是会变化的量。
- 比如我定一个了一个变量叫做名字,它在Go语言中是这样表示的:这个值既可以是张三,也可以是李四,也可以是王五,也可以是你的名字。那么在这里,这个name就是变量,可以变化的量。
// 这里的等于是赋值,就是把等号右边的值,赋值给左边变量的意思
var name string = "guan"
在这里除了name之外,我们还写了其他的东西,比如 var、string 这些都是干嘛的呢,接下来就来带大家了解下go 语言中的变量的定义以及go 语言的一些数据类型(比如上面的 name 名字,它就是一个字符串类型的,我们有时候还需要表示数字,所以还会存在数字类型等,后面进一步了解)。
1.变量的定义
- Go语言是静态类型语言,就是所有的类型我们都需要明确的去定义。这里先不管其他类型,先了解string,用它来表示字符半。
- 在Go语言中,我们声明一个变量一般足使用
var
关键字:
var name type
- 第一个 var 是声明变量的关键字,是固定的写法,声明一个变量,就需要一个var。
- 第二个 name,就是变量的名字,你可以按照自己的需求给它定 个名字,用来后续使用。
- 第二个 type,就是用来代表变量的类型。
举个栗子:
// 定义一个字符串变量,name
var name string
// 定义一个数字类型变量 age
var age int
如果之前学过Jva, C或者其他编程语言,第一次看到这样的操作肯人不舒服。Go语言和许多编程语言不同,它在声明变量时将变量的类型放在变量的名称之后,这样做的处就是可以避免像C语言那样合糊不清的声明形式,例如: int *a, b; 其中只有 a 是指针而b不是。如过想要这两个变量都是指针变量,则需要将分开书写。而在Go中,则可以和轻松地将们都声明为用钊类型:
var a,b *int
变量的命名规则遵循骆驼命名命法, 即首个单词小写,每个新单词的首字母大写,例如: helloWord 和 guanGuan。 .
变量定义的标准格式为
var 变量名 变量类型
变量声明以关键字 var 开头,后置变量类型,行尾无须分号。
我们有时候会批量定义变量,如果每次都单独定义比较麻烦,Go语言文持批量定义变量使用关键了 var 和括号,可以将一组变量定义放在一起。
var (name stringage intaddr string)
形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值大关紧要的地方。当一个变量被声明之后,如果没有显示的给他赋值,系统自动赋予它该类型的零值:
- 整型和浮点型变量的默认值为 0 和 0.0
- 字符串变量的默认值为空字符串。
- 布尔类型变量默认值为 false。
- 切片、函数、指针变量的默认为 null
fmt.Printf(name, age, addr)
2.变量的初始化
变量初始化的标准格式
var 变量名 类型 = 值(表达式)
比如,我想定义guan的一些信息,我可以这么表示
var name string = "guan"
var age int = 18fmt.Printf("name:%s,age:%d", name, age)
这里的 name 和 age 就是变量名,name 的类型为 string, age 的类型为 int。他们的值分别为 guan 和 18
短变量声明并初始化
name := "guanGuan"
age :=18fmt.Printf("name:%s,age:%d", name, age)
这是Go语言的推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。它可以自动的推导出一些类型,但是使用也是有限制的;
- 定义变量,同时显式初始化。
- 不能提供数据类型。
- 只能用在函数内部。不能随便到处定义
因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。
注意:由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有被定义过的变量。若定义过,将会发生编译错误。
// 定义变量 name
var name string
// 定义变量 name,并赋值为"guanGuan"
name := "guanGuan"
编译会报错,信息如下:no new variables on left side of :=意思是,在“:=”的左边没有新变量出现,意思就是“:=”的左边变量已经被声明了。
3.理解变量(内存地址)
var num intnum = 1000fmt.Printf("num的值:%d,内存地址:%p\n", num, &num)num = 2000fmt.Printf("num的值:%d,内存地址:%p\n", num, &num)
4.变量交换
package mainimport "fmt"func main() {/*在编程中,最简单的算法就是变量的交换,但是一般常见的方式就是定义中间变量var a int = 100var b int = 2oovar t intt = aa = ba = tfmt.Println(a,b)*/var a int = 100var b int = 200fmt.Printf("交换前的变量a=%d,b=%d\n", a, b)// 在Go语言中,可以直接用这样的方式实现值得交换,无需中间变量b, a = a, bfmt.Printf("交换后的变量a=%d,b=%d", a, b)}
输出
5.匿名变量
匿名变量的特点是一个下画线””,““本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃
,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
例如:
package mainimport "fmt"
/*
定义一个test函数,它会返回两个int类型的值,每次调用将会返叵 100 和 200 两个数值、这里我们先不只管 函数的定义,后面会讲解。89我们用这个函数来理解这个匿名变量。
*/
func test()(int, int) {return 100, 200
}
func main(){a,_:= test()_, b := test()fmt.Println(a, b) //输出的结果100,200// 在第一行代码巾,我们只需要获取第一个返叵值,所以第二个返回值定义为匿名交量// 在第二行代码巾,我们只需要获取第二个返叵值,所以第一个返回值定义为匿名变量
}
- 在编译过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代巧的灵活性,这些变量被统称为匿名变量。
- 匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
6.变量的作用域
一个变量(常量、类型或函数)在程序中都有一定的作用范围,称之为作用域。
了解变量的作用域对我们学习Go语言来说足比较重要的,因为Go语言会在编译时检查每个变量足否使用过,一旦出现未使用的变量,就会报编译错误。如果不能埋解变量的作用域,就有可能会带来一些不明所以的编译错误。
局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。
package mainimport "fmt"// 全局变量
var name string = "guanGuan"func main() {//局部变量var age int = 18var name string = "Guan"fmt.Println(name, age)}func test() {fmt.Println(name)}
全局变量
在函数休外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用"import"关键它引入全局变量所在的源文件之后才能使用这个全局变量。
全局变量声明必须以var关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
//声明全局变量
var c int
func main(){//声明局部变量var a,b int初始化参数a = 3b = 4c = a + bfmt.printf("a = %d,b = %d,c = %d\n",a,b,c) //a = 3, b = 4, c = 7
}
Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑。
package main
import "fmt"
//声明全局变量
var a float32 = 3.14
func main(){//声明局部变量var a int = 3fmt.Printf("a = %d\n", a) // a = 3
}
三、常量
1.常量的定义: const
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
- 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符申型
const identifier [type] = value
你可以省略类型说明符[type],因为编译器可以根据变量的值来推断其类型。
- 显式类型定义: const b string = “abc”
- 隐式类型定义: const b = “abc”
多个相同类型的声明可以简写为:
const c_name1, c_name2 = value1, value2
以下实例演示了常量的应用:
package mainfunc main() {// 常量不能被修改的量,否则会报错const URL string = "www.baidu.com"URL = "www.guan.com"
}
输出
package mainimport "fmt"func main() {const URL1 string = "www.baidu.com" // 显式定义const URL2 = "www.guan.com" // 隐式定义const a,b,c = 3.14,"guanGuan",true //同时定义多个常量fmt.Println(URL1)fmt.Println(URL2)fmt.Println(a,b,c)
}
输出
2.iota(特殊常量)
-
iota,特殊常量,可以认为是一个可以被编译器修改的常量。iota是go语言的常量认数器
-
iota在const关键字出现时将被重置为0(const内部的第一行之前), const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
iota 可以被用作枚举值:
const (
a = iota
b = iota
c= iota
)
第一个iota等干0,每当iota在新的一行被使用时,它的值都会自动加 1;所以a=0, b=1,c=2可以简写人如下形式:
package mainimport "fmt"func main() {const (// 一组常量中,如果某个常量没有初始值,默认和上一行一致a = iota //iota=0b //iota=1c //iota=2d = "hello,guan" // hello,guan iota=3e // hello,guan iota=4f = 100 // 100 iota=5g // 100 iota=6h = iota //iota=7i //iota=8)const (j = iota // iota=0k = iota // iota=1)fmt.Println(a, b, c, d, e, f, g, h, i, j, k)
}
四、基本数据类型
Go语言是一种静态类型的编程语言,在Go编程语言中,数据类型用于声明函数和变量。数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要川大数据的时候才需要申请大内存,就可以充分利川内存。编译器在讲行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分配的内存表示什么.
1.布尔类型
布尔型的值只可以是常量 true 或者 false。举一个简单的栗子:
package mainimport "fmt"func main() {// var 变量名 数据类型// bool: true falsevar isFlag boolvar b1 bool = truevar b2 bool = falsefmt.Println(isFlag) //如果不进行初始赋值,则默认值为falsefmt.Printf("%T,%t\n", b1, b1)fmt.Printf("%T,%t\n", b2, b2)
}
2.数值型
整型int和浮点型loat32、 foat64, Go语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
Go 也有基于架构的类型,例如:uint 无符号、int 有符号
序号 | 类型和描述 |
---|---|
1 | uint8 无符号 8 位整型 (0到255) |
2 | uint16 无符号 16 位整型 (0 到 65535) |
3 | uint32 无符号 32 位型 (0 到 4294967295) |
4 | uint64 无符号64位整型 (0到18446744073709551615) |
5 | int8 力符号 8 位整型 (-128 到 127) |
6 | int16 有符号 16位整型(-32768 到 32767) |
7 | int32 有符号 32 位整型 (-2147483648 到 2147483647) |
8 | int64 符号64位整型(-9223372036854775808到9223372036854775807) |
package mainimport "fmt"func main() {// 定义一个整型// byte uint8// rune int32// int int64var age int = -100var i1 int8var i2 uint8i1 = 66i2 = 188fmt.Printf("%T,%d\n",age,age)fmt.Println(i1)fmt.Println(i2)
}
浮点型
序号 | 类型和描述 |
---|---|
1 | float32 IEEE-754 32位浮点型数 |
2 | float64 IEEE-754 64位浮点平数 |
3 | complex64 32 位实数和虚数 |
4 | complex128 64 位头数和虚数 |
package mainimport "fmt"func main() {var f1 float32f1 = 3.14var f2 float64f2 = 5.12// %f 默认保留小数点后6位,.2f%就是保留2位,.3f%就是保留3位fmt.Printf("%T,%.3f\n", f1, f1)fmt.Printf("%T,%f\n", f2, f2)
}
输出
1、关于浮点数在机器中存放形式的简单说明,浮点=符号位+指数位+尾数位
2、尾数位部分可能会丢失,造成精度损失。-123.0000901
package mainimport "fmt"func main() {// float64 尽量使用 float64 来定义浮点类型的小数var num1 float32 = -123.1234567var num2 float64 = -123.1234567fmt.Println("num1=", num1, "num2=", num2)}
- 说明:float64的精度要比float32的要准确
- 说明:如果我们要保存一个精度高的数,则应该选择float64
3、浮点型的存储分为二部分:符号位+指数位+尾数位,在存储过程中,精度会有丢失、
4、golang的浮点型默认为float64类型
5、通常情况下,应该使用float64,因为它比float32更精确
以下列出了其他更多的数字类型:
序号 | 类型和描述 |
---|---|
1 | byte 类似 uint8 |
2 | rune 类似 int32 |
3 | uint 32 或 64 位 |
4 | int 与 uint 一样大小 |
5 | uintptr 无符号整型,用于存放一个指针 |
3.字符串型
import "fmt"func main() {var str stringstr = "helloWorld!"fmt.Printf("%T,%s\n", str, str)//单引号 字符 ,整型-ASCII字符码x1 := 'A'x2 := "A"x3 := '关'// 拓展// 编码表 ASCII 字符码// 所有的中国字的编码表:GBK// 全世界的编码表:Unicode 编码表fmt.Printf("%T,%d\n", x1, x1)fmt.Printf("%T,%s\n", x2, x2)fmt.Printf("%T,%s\n", x3, x3)
}
package mainimport "fmt"func main() {var str1, str2, str3 stringstr1 = "hello"str2 = "guan"str3 = ","// 字符串的连接 用 + 号fmt.Println(str1 + str3 + str2)// 转义字符 \fmt.Println("hello\\guan")fmt.Println("hello\"guan")fmt.Println("hello\nguan") // \n 换行fmt.Println("hello\tguan") // \t 制表符
}
输出
4.数据类型的转换
在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明:
valueofTypeA = typeA (valueofTypeB)
类型 A 的值=类型 A(类型 B的值)
func main() {a := 5.0 // float64b := 8 // int//需求:将int类型的 b 转化为 float64 类型c := float64(b)d := int(a)// 整型不能转换为bool类型//e := bool(b)//fmt.Printf("%T,%f\n", e, e)fmt.Printf("%T,%f\n", c, c)fmt.Printf("%T,%d\n", d, d)}
输出
类型转换只能在定义正确的情况下转换成功,例如从一个取值范围较小的类型转换到一个取值范围较大的类型(将int16 转换为 int32).当从取值范围较大的类型转换到取伯范围较小的类型时(将int32转换为int16或将float32转换为int) ,会发生精度丢失(截断)的情况。
五、运算符
1.算术运算符
下表列出了所有Go语言的算术运算符。假定A值为1, B值为2。
运算符 | 描述 | 实例 |
---|---|---|
+ | 相加 | A+B 输出结果 3 |
- | 相减 | A-B 输出结果 -1 |
* | 相乘 | A*B 输出结果 2 |
/ | 相除 | A/B 偷出结果 0 |
% | 求余 | A % B 输山结果 1 |
++ | 自增 | A++ 输出结果2 |
– | 自减 | A–输出结果 1 |
package mainimport "fmt"func main() {var a int = 1var b int = 2// + - * / % ++ --fmt.Println(a + b)fmt.Println(a - b)fmt.Println(a * b)fmt.Println(a / b)fmt.Println(a % b)a++fmt.Println(a)a--fmt.Println(a)}
输出
2.关系运算符
下表列出了所有Go语言的关系运算符。假定A值为1, B值为2.
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个值是否相等,如果相等返回True,否则返回 False | (A == B) 为 False |
!= | 检查两个值是否个相等,如果不相等返回True否则返回 False | (A!=B)为True |
> | 检查左边值是否大于右边值,如果是返回 True,否则返回 False | (A > B) 为 False |
< | 检查左边值是否小于右边值,如果是返回True,否则返回False | (A < B) 为 True |
>= | 检查左边值是否大于等于右边的值,如果是返回 True,否则返回 False | (A > B) 为 False |
<= | 检查左边值是否小于右边值,如果是返回True,否则返回False | (A<=B)为 True |
package mainimport "fmt"func main() {var a int = 1var b int = 2// ==等于 =赋值// 关系运算符 返回结果都是 bool值fmt.Println(a == b)fmt.Println(a != b)fmt.Println(a > b)fmt.Println(a < b)fmt.Println(a >= b)fmt.Println(a <= b)}
输出结果
3.逻辑运算符
下表列出了所有Go语言的逻辑运算符。假设A值为True, B值为False。
运算符 | 描述 | 实例 |
---|---|---|
&& | 逻辑 AND 运算符。如果两边的操作数都是 True,则条件 True,否则为 False | (A && B) 为 False |
|| | 逻辑 OR 运算符。如果两边的操作数有一个 True,则条件 True,否则为 False。 | (A || B)为True |
! | 逻辑 NOT 运算符。如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 | !(A && B) 为True |
package mainimport "fmt"func main() {var a bool = truevar b bool = false// 逻辑与 && 要左右两边的表达式同时为真,才执行,结果才为真,否则为假// 关系运算符 返回结果都是 bool值fmt.Println(a && b)// 逻辑或 || 只要其中有一个为真,则为真,全为假则为假fmt.Println(a || b)// !为逻辑非,即取反,结果相反// a = true// b = falsefmt.Println(!a) fmt.Println(!b)}
输出结果
4.位运算符
Go语言文持的位运算符如下表所示。倭定A为60, B为13:
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符"&"是双目运算符。都足1结果为1,否则足0 | (A & B) 结果为 12,二进制为0000 1100 |
| | 按位或运算符"|"是双月运算符。都是0结果为0,否则是1 | (A|B)结果为 61,二进制为 0011 1101 |
^ | 按位异或运算符"^"是双目运算符。不同则为1,机同为0 | (A^B)结果为49,二进制为 0011 0001 |
&^ | 位清空,a&^b,对于b上的每个数值,如果为0,则取a对应位上的数值,如果为1,则取0 | (A &^ B) 结果为 48,二进制为 0011 0000 |
<< | 左移运算符"<<“是双目运算符。左移n位就是乘以2的n次方。其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,低位补0 | A<<2 结果为 240,二进制为 1111 0000 |
>> | 右移认算符">>“是双目运算符。右移n位就是除以2的n次方。其功能是把”>>“左边的运算数的各二进制文全部右移若干位,”>>"右边的数指定移动的位数 | A >> 2 结果为 15,二进制为0000 1111 |
package mainimport "fmt"func main() {// 二进制 0 1 逢二进一// 位运算:二进制上的 0 false 、 1 true// 逻辑运算符: && 只要有一个为假,则为假、 || 只要有一个为真,则为真// a 60 0011 1100// b 13 0000 1101// --------------------------// & 0000 1100 同时满足// | 0011 1101 一个满足就行// ^ 0011 0001 不同为1,相同为0// << 2// >> 2var a uint = 60var b uint = 13// 位运算var c uint = 0c = a & b //位运算fmt.Printf("%d,二进制%b", c, c) // 0000 1100fmt.Println()c = a | b //位运算fmt.Printf("%d,二进制%b", c, c) // 0011 1101fmt.Println()c = a ^ b //位运算fmt.Printf("%d,二进制%b", c, c) // 0011 0001fmt.Println()// 60 0011 1100c = a << 2fmt.Printf("%d,二进制%b", c, c) //fmt.Println()a = 60c = a >> 2fmt.Printf("%d,二进制%b", c, c) //
}
输出
5.赋值运算符
下表列出了所有Go语言的赋值认算符。
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,将一个表达式的值赋给一个左值 | C=A+B将 A+B表达式结果赋值给C |
+= | 相加后赋值 | B+=A等于B=B+A |
-= | 相减后再赋值 | B-=A 等于 B=B-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 |
package mainimport "fmt"func main() {var a int = 21var c int// 将等号右边的值,赋值给左边c = afmt.Printf("第 1 行 = 运算符实例,c 值为 = %d\n", c)c += afmt.Printf("第 2 行 += 运算符实例,c 值为 = %d\n", c)c -= afmt.Printf("第 3 行 -= 运算符实例,c 值为 = %d\n", c)c *= afmt.Printf("第 4 行 *= 运算府实例,c 值为 = %d\n", c)c /= afmt.Printf("第 5 行 /= 运算符实例,c 值为 = %d\n", c)c = 200c <<= 2fmt.Printf("第 6行 <<= 运算符实例,c值为 = %d\n", c)c >>= 2fmt.Printf("第 7 行 >>= 运算符实例,c 值为 = %d\n", c)c &= 2fmt.Printf("第 8 行 &= 运算符实例,c 值为 = %d\n", c)c ^= 2fmt.Printf("第 9 行 ^= 运算符实例,c 值为 = %d\n", c)c |= 2fmt.Printf("第 10 行 |= 运算符实例,c 值为 =%d\n", c)
}
输出
6.其他运算符
下表列出了Go语言的其他运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 返回变量存储地址 | &a;将给出变量的实际地址 |
* | 指针变量 | *a;是一个指针变量 |
package mainimport "fmt"func main() {var a int = 6var b int32var c float32var ptr *int/* 运算符实例 */fmt.Printf("第 1 行 a 变量类型为 = %T\n", a)fmt.Printf("第 2 行 b 变量类型为 = %T\n", b)fmt.Printf("第 3 行 c 变量类型为 = %T\n", c)/* & 和 * 运算符实例 */ptr = &a /* 'ptr' 包含了 'a' 变量的地址 */fmt.Printf("a 的值为 = %d\n", a)fmt.Printf("ptr 的值为 = %p\n", ptr)fmt.Printf("ptr 的值为 = %d\n", *ptr)}
输出
六、键盘的输入和输出
package mainimport "fmt"func main() {var name stringvar phoneNumber string// 定义了两个变量,想用键盘来输入这两个变量//fmt.Println() //打印并换行//fmt.Printf() //格式化输出//fmt.Print() //打印输出fmt.Println("请输入姓名和手机号码:")// 变量去地址 &变量// 指针、地址来修改和操作变量// Scanln 阻塞等待从键盘输入fmt.Scanln(&name, &phoneNumber)fmt.Println("name:", name)fmt.Println("phoneNumber:", phoneNumber)// fmt.Scanln() //接收输入并换行// fmt.Scanf() // 接收输入,格式化输入// fmt.Scan() // 接收输入}
输出
相关文章:

【Go编程语言】 Go语言基础语法
Go语言基础语法 文章目录 Go语言基础语法一、注释1.单行注释2.多行注释 二、变量1.变量的定义2.变量的初始化3.理解变量(内存地址)4.变量交换5.匿名变量6.变量的作用域 三、常量1.常量的定义: const2.iota(特殊常量) 四…...

洗稿用什么软件-洗稿软件免费
洗稿文章的主要优势 洗稿文章的主要优势在于提高文章的质量和效率。以下是洗稿文章的几个主要优势: 优化结构和语言 洗稿可以删除冗余、无用和重复的内容,同时对文章的结构和语言进行优化,提高文章的可读性和吸引力。这可以使文章更加专业…...
网络请求发送
私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 后端系列文章——传送…...

微信小程序开发
文章目录 1 开发准备工作2 小程序开发工具使用3 初始化项目4 index页静态搭建5 数据绑定5.1 初始化数据5.2 使用数据5.3 修改数据 6 数据绑定---小程序,Vue,React7 事件绑定7.1 事件分类7.2 绑定事件7.3 向事件对象传参7.4 补充:事件流的三个…...

number类型超出16位的问题(前端、后端处理)
目录 1、前端解决方案 1.1 甩链接 1.2 接口返回数据过程中将数据处理为字符串(过过嘴瘾) 1.3 对返回的json字符串进行数据预处理代码如下 2、后端解决方案 2.1 toString、String、 、new String() 自己悟、就是要改的地方多。 2.2拦截器 (可能超出…...

【高并发】网络模式
I/O 多路复用 多线程创建 服务器的主进程负责监听客户的连接,一旦与客户端连接完成,accept() 函数就会返回一个「已连接 Socket」,这时就通过 fork() 函数创建一个子进程,实际上就把父进程所有相关的东西都复制一份,…...

springboot+dubbo+zookeeper 项目实战
现在有一段代码再前台,后台系统中都存在,都需要这段代码,存在这种情况,我们可以选择将这段代码提取出来作为一个服务,让前台和后台系统作为消费者远程调用这段代码,提高了代码的复用性。 springboot集成dub…...

PHP学习笔记第一天
前言 作者简介:不知名白帽,网络安全学习者。 博客主页:不知名白帽的博客_CSDN博客-网络安全,CTF,内网渗透领域博主 网络安全交流社区:https://bbs.csdn.net/forums/angluoanquan 目录 PHP语法 基本的PHP语法 PHP的数据类型 PH…...

案例研究|萤石网络通过JumpServer解决安全运维难题
杭州萤石网络股份有限公司(以下简称为萤石网络)于2015年在杭州成立,是安全智能生活主流品牌,核心产品包括智能家居摄像头、智能门锁、智能服务机器人等。2021年,萤石网络家用摄像头占国内出货量市场份额的25%ÿ…...

即时聊天app开发-即时通讯app开发方案分析
如今,即时聊天APP层出不穷,它已经成为人们日常生活中密不可分的社交工具。如今,即时聊天APP不仅是聊天工具,也是企业营销的利器。我们经常可以在聊天主页上看到一些广告。如有必要,用户可以直接点击广告了解详情。即时…...
js为什么会阻塞渲染, 什么是异步?
javaScript 是单线程执行的语言,它的执行机制是基于事件循环模型的。当 JavaScript 执行代码时,如果遇到阻塞(如执行时间较长的代码、同步的网络请求、计算密集型操作等),则会阻塞 JavaScript 引擎的执行,直…...

Nuvoton NK-980IOT开发板 u-boot 编译
前言 最近搭建了 Nuvoton NK-980IOT开发板 的开发编译环境,记录一下 u-boot 的 编译流程 Nuvoton NK-980IOT开发板 资源还是比较的丰富的,可以用于 嵌入式Linux 或者 RT-Thread 的学习开发 开发板上电比较的容易,两根 USB 线即可࿰…...
OpenCL使用CL_MEM_USE_HOST_PTR存储器对象属性与存储器映射
随着OpenCL的普及,现在有越来越多的移动设备以及平板、超级本等都支持OpenCL异构计算。而这些设备与桌面计算机、服务器相比而言性能不是占主要因素的,反而能耗更受人关注。因此,这些移动设备上的GPU与CPU基本都是在同一芯片上(So…...

浅谈osgEarth操控器类的createLocalCoordFrame函数如何将局部坐标系的点转为世界坐标系下的Martix(ENU坐标)
在osgEarth操控器类的EarthManipulator中的如下函数: void EarthManipulator::setLookAt(const osg::Vec3d& center,double azim,double pitch,double range,const osg::Vec3d& posOffset) {setCenter( center );.... //…...
PHP程序员和Python程序员的职业前景怎么样?我来聊聊自己的体会
大家好,今天我们来聊一下程序员这个职业的特点。在讲这个话题之前,我先说一下我自己的情况:我在福州和深圳做了8年左右的程序员,然后回到老家,在家里面为福州的一个公司做远程开发。目前已经在老家做了将近3年。 今天…...

【MATLAB图像处理实用案例详解(8)】—— 图像数字水印算法
目录 一、背景意义二、基本原理三、算法介绍3.1 数字水印嵌入3.2 数字水印提取 四、程序实现 一、背景意义 数字水印技术作为信息隐藏技术的一个重要分支,是将信息(水印)隐藏于数字图像、视频、音频及文本文档等数字媒体中,从而实现隐秘传输、存储、标注…...

最全的免费SSL证书申请方式
在SSL广泛普及的今天,申请一张免费的SSL证书是一件非常容易的事情。这里为大家总结当前阶段(2023年)拥有一张免费SSL证书的方式。首推的方式为来此加密网站,文章后面会有详细的介绍。 下面介绍几种获取免费SSL证书的方式,大家可以根据自己的…...

Ceph入门到精通-CrushMap算法概述
下面是伪代码object到osd的伪代码 locator =object_name obj_hash =hash(locator) pg =obj_hash %num_pg OSDs_for_pg =crush(pg) # returns a list of OSDs primary =osds_for_pg[0] replicas =osds_for_pg[1:] defcrush(pg): all_osds=[osd.0,osd.1,osd.2,...] resu…...

如何利用API做好电商,接口如何凋用关键字
一.随着互联网的快速发展,电子商务成为了众多企业的首选模式,而开放API则成为了电商业务中不可或缺的部分。API(Application Programming Interface),即应用程序接口,是软件系统不同组件之间交互的约定。电…...
Give me a logic game idea about economics
Here’s an logic game idea about economics: Game name: “Economics Tycoon” Game Objective: Build an economic empire and grow from a small business owner to a global tycoon. Gameplay: Start with a small business and limited resources. Manage your compa…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...