Golang全栈开发----Golang基础知识

第一章 基础语法

1. 注释

注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。注释是开发人员一个非常重要的习惯,也是专业的一种表现。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾。

单行注释:ctrl + /   (Goland)

多行注释:ctrl +shift +/  (Goland) 

2.变量

在计算机编程中,我们用变量来保存并管理很多数据,并用变量名来区分、识别和处理这些数据。

变量本质上是一种对内存地址的引用,让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字进行操作。

有了变量,我们就可以将存储的数据反复操作

// 声明并赋值
var num1 = 1
var num2 = 2
fmt.Println(num1 + num2) // 如果计算结果程序下面会用到可以赋值
// 计算num1和num2其他运算值
fmt.Println(num1 * num2)
fmt.Println(num1 / num2)
fmt.Println(num1 - num2)

(1)声明变量

和C语言一样,Go语言也是通过var关键字进行声明,不同的是变量名放在类型前,具体格式如下

var  变量名 变量类型
不赋值,默认值

var x int
var s string
var b bool

fmt.Println(x)  // 0
fmt.Println(s)  // ""
fmt.Println(b)  // false

如果声明多个变量,可以进行简写

// 声明多个相同类型变量
var x,y int
// 声明多个不同类型变量
var (
        name      string
        age       int
        isMarried bool
    )

(2)变量赋值

变量赋值的3种方法

变量名=值

// 先声明再赋值
var x int
x = 10     // 不要 重复声明 : var x = 10
fmt.Println(x)
x = 20  // 重新赋值

//  直接声明赋值
// var y string= "hello sanqiansi!"
var y = "hello sanqiansi!"
fmt.Println(y)

// 声明赋值精简版
s := "hi,sanqiansi!"  // 1、编译器会自动根据右值类型推断出左值的对应类型,等同于var s = "hi,sanqiansi!"。2、该变量之前不能声明,否则重复声明
fmt.Println(s)

// 一行声明赋值多个变量
var name,age = "sanqiansi",22

变量名=值 + 值 (变量名)

var a, b = 10, 20
var c = a + b
fmt.Println(c)
var d = c + 100
fmt.Println(d)

变量名=变量名

    var a = 100
    var b = a // 变量之间的赋值是值拷贝
    fmt.Println(a, b)
    a = 200
    fmt.Println(b)

将两个变量的值进行交换

    var num1 = 100
    var num2 = 200
    num1, num2 = num2, num1
    fmt.Println(num1, num2)

//200 100

(3)匿名变量

匿名变量即没有命名的变量,在使用多重赋值时,如果想要忽略某个值,可以使用匿名变量(anonymous variable)。 匿名变量用一个下划线_表示。

 

a,b,c :=4,5,6
fmt.Println(a,b,c)
// 如果只想接受第个变量,可以对前两个变量匿名
_,_,x := 4,5,6
fmt.Println(x)

匿名变量不占用命名空间,不会分配内存

让代码非常清晰,基本上屏蔽掉了可能混淆代码阅读者视线的内容,从而大幅降低沟通的复杂度和代码维护的难度。

(4)变量命名规则

变量命名是需要遵循一定的语法规范的,否则编译器不会通过。

1、变量名称必须由数字、字母、下划线组成。

2、标识符开头不能是数字。

3、标识符不能是保留字和关键字。

4、建议使用驼峰式命名,当名字有几个单词组成的时优先使用大小写分隔

5、变量名尽量做到见名知意。

6、变量命名区分大小写

go语言中有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

还有30多个预定义的名字,用于内建的常量、类型和函数

// 内建常量:
    true false iota nil
// 内建类型:
    int int8 int16 int32 int64
    uint uint8 uint16 uint32 uint64 uintptr
    float32 float64 complex128 complex64
    bool byte rune string error
// 内建函数:
    make len cap new append copy close delete
    complex real imag
    panic recover
程序中变量名命名不正确的是(多选)
A true
B _xyz
C 2a
D $abc

正确答案:B

3. 语句分隔符

就像我们写作文一样,一定要有像逗号或者句号这样的语句分隔符,否则无法断句根本不能理解,编程语言也一样,需要给解释器或者编译器一个语句分割,让它知道哪里到哪里是一个语句,才能再去解析语句。

在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分(不建议这样写)。

// var name = "yuan";var age = 18    // 不报错但是不推荐

// 推荐写法
var name = "yuan"  // 换行即分隔符
var age = 18
fmt.Println(name)
fmt.Println(age)

4. 输入输出函数

(1)输出函数

fmt.Print有几个变种:

Print:   输出到控制台,不接受任何格式化操作
Println: 输出到控制台并换行
Printf : 只可以打印出格式化的字符串,只可以直接输出字符串类型的变量(不可以输出别的类型)
Sprintf:格式化并返回一个字符串而不带任何输出

Print 和Println

Print和Println()函数可以打印出字符串或变量的值。

name := "sanqiansi"
age := 24
fmt.Print(name, age)

fmt.Println("hello world")
fmt.Println(name)
fmt.Println(age)
fmt.Println(name, age)
fmt.Println("姓名:", name, "年龄:", age)

格式化输出(Printf)

Printf 根据格式说明符格式化并写入标准输出。Printf 只打印字符串

比如上面打印一个人的基本信息格式:

name := "sanqiansi"
age := 24
isMarried := false
salary := 3000.549
fmt.Printf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary)
fmt.Printf("姓名:%v 年龄:%v 婚否:%v 薪资:%v\n", name, age, isMarried, salary)
fmt.Printf("姓名:%#v 年龄:%#v 婚否:%#v 薪资:%#v\n", name, age, isMarried, salary)
%v:以默认的方式打印变量的值
%#v:相应值的Go语法表示
%T:打印对应值的类型
%+d :带符号的整型,
%d :不带符号的整型
%o :不带零的八进制,
%#o: 带零的八进制
%x :小写的十六进制,
%X: 大写的十六进制,
%#x: 带0x的十六进制
%b :打印整型的二进制
%t :打印true 或 false
%s :输出字符串表示,
%-5s: 最小宽度为5(左对齐)
%f: 小数点而无指数,默认精度为6
%e:  科学计数法,如-1234.456e+78
%p:  带0x的指针,
%#p: 不带0x的指针
// 整形和浮点型
fmt.Printf("%b\n", 12)  // 二进制表示:1100
fmt.Printf("%d\n", 12)  // 十进制表示:12
fmt.Printf("%o\n", 12)  // 八进制表示:14
fmt.Printf("%x\n", 12)  // 十六进制表示:c
fmt.Printf("%X\n", 12)  // 十六进制表示:c
fmt.Printf("%f\n", 3.1415)  // 有小数点而无指数:3.141500
fmt.Printf("%.3f\n", 3.1415)  // 3.142
fmt.Printf("%e\n", 1000.25)  // 科学计数法:  1.000250e+03,默认精度为6

// 设置宽度
fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1001", "aoteman", 100)
fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1002", "sanqiansi", 98)
fmt.Printf("学号:%s 姓名:%-20s 平均成绩:%-4d\n", "1003", "x", 78)

Sprintf

Printf和Sprintf都是替换字符串,Printf是直接输出到终端,Sprintf是不直接输出到终端,而是返回该字符串

name := "sanqiansi"
age := 24
isMarried := false
salary := 3000.549
info := fmt.Sprintf("姓名:%s 年龄:%d 婚否:%t 薪资:%.2f\n", name, age, isMarried, salary)
fmt.Println(info)

(2)输入函数

go语言fmt包下有三个函数,可以在程序运行过程中从标准输入获取用户的输入:

(1)fmt.Scan

语法:

func Scan(a ...interface{}) (n int, err error)
  • Scan 从标准输入扫描文本,读取由空白符分隔的值保存到传递给本函数的参数中,换行符视为空白符。

  • 本函数返回成功扫描的数据个数和遇到的任何错误。如果读取的数据个数比提供的参数少,会返回一个错误报告原因。

package main

import "fmt"

func main() {
    var (
        name      string
        age       int
        isMarried bool
    )
    fmt.Scan(&name, &age, &isMarried) // 输入类型不一致,按默认值
    fmt.Printf("扫描结果 name:%s age:%d married:%t\t", name, age, isMarried)
}

将上述代码在终端运行,在终端依次输入 sanqiansi、26、false使用空格分隔。

go run main.go
sanqiansi 26 false
扫描结果 name:yuan age:26 married:false

fmt.Scan从标准输入中扫描用户输入的数据,将以空白符分隔的数据分别存入指定的参数中。

(2)fmt.Scanf

语法

func Scanf(format string, a ...interface{})(n int, err error)
  • Scanf从标准输入扫描文本,根据format参数指定的格式去读取由空白符分隔的值保存到传递给本函数的参数中。

  • 本函数返回成功扫描的数据个数和遇到的任何错误。

// 案例1
var (
        name      string
        age         int
        isMarried bool
    )
fmt.Scanf("1:%s 2:%d 3:%t", &name,&age,&isMarried)
fmt.Printf("扫描结果 姓名:%s 年龄:%d 婚否:%t", name,age,isMarried)

// 案例2
var a, b int
fmt.Scanf("%d+%d", &a, &b)
fmt.Println(a + b)

(3)fmt.Scanln

语法

func Scanln(a ...interface{}) (n int, err error)
  • Scanln类似于Scan,它遇到换行立即停止扫描。

  • 本函数返回成功扫描的数据个数和遇到的任何错误。

Scanln和Scan的区别就是Scanln遇到换行立即结束输入,而Scan则会将换行符作为一个空白符继续下一个输入

 

posted @ 2023-06-11 10:41  三千丝  阅读(115)  评论(0编辑  收藏  举报