go基础 | 青训营

65 阅读4分钟

走进GO语言基础语法

7.25

语言结构

Hello wold

 package main
 import "fmt"
 func main(){
     fmt.ptintln("hello world")
 }

第一行为此代码的包名

第二行为导包的,而且在golang里不用明确的指出所在地址,只用写个包名就可以

第三行是说的是主方法

  • 真正的是分为
  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句&表达式
  • 注释

{不能单独的放在一行

运行

需要在命令行当中输入

 $ go run hello.go

就这一点我就觉得一点都不银杏

基础语法

关键字

下面列举了 Go 代码中会使用到的 25 个关键字或保留字:

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:

appendboolbytecapclosecomplexcomplex64complex128uint16
copyfalsefloat32float64imagintint8int16uint32
int32int64iotalenmakenewnilpanicuint64
printprintlnrealrecoverstringtrueuintuint8uintptr

程序一般由关键字、常量、变量、运算符、类型和函数组成。

程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}。

程序中可能会使用到这些标点符号: .,;:

真的是太少了,你敢信,英语困难户的福音啊!!!!!

变量的声明

在go中,好处是可以随意的声明,go会自动的匹配数据类型,比其他的方便多了

1、var

 package main
 ​
 import "fmt"
 ​
 func main() {
     var i int
     var f float64
     var b bool
     var s string
     fmt.Printf("%v %v %v %q\n", i, f, b, s)
 }

使用var来对变量进行定义,可以使用变量的属性来定义,在go中,所有的变量类型都是在,变量名称之后

2、使用var来自动匹配变量的类型

 package main
 import "fmt"
 func main() {
     var d = true
     fmt.Println(d)
 }

3、:=

 intVal := 1 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句

等价于

 var intVal int 
 intVal =1 

4、多变量的声明

 //类型相同多个变量, 非全局变量
 var vname1, vname2, vname3 type
 vname1, vname2, vname3 = v1, v2, v3
 ​
 var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断
 ​
 vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
 ​
 ​
 // 这种因式分解关键字的写法一般用于声明全局变量
 var (
     vname1 v_type1
     vname2 v_type2
 )
 ​

const修饰常量

需要注意的是,在go中有指针的概念

也就是

 type jia (n int){
     n+=2   //值不会改变
 }
 ​
 type jia(n *int){
     n+=2  //
 }
 func main(){
     n:=1
     jia(n)
     fmt.println(n)//1
     jia(&n)
     fmt.println(n)//3
 }

判断语句

较简单的是,在go当中

只有if and switch

if

 func pow(x, n, lim float64) float64 {
     if v := math.Pow(x, n); v < lim {
         return v
     }
     return lim
 }
 ​

func 主方法

pow 方法名

(x, n, lim float64) 参数x,n,lim 是float64 的类型

float64 返回类型

if v := math.Pow(x, n); v < lim if 不需要将判断语句用括号抱起来,而却还可以在判断语句 v<lim 前执行一段代码,需要用;来隔开

其他的和c系语言一样的if-else用法一样

switch

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。

您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。

  switch {
       case grade == "A" :
          fmt.Printf("优秀!\n" )    
       case grade == "B", grade == "C" :
          fmt.Printf("良好\n" )      
       case grade == "D" :
          fmt.Printf("及格\n" )      
       case grade == "F":
          fmt.Printf("不及格\n" )
       default:
          fmt.Printf("差\n" );
    }
 switch var1 {
     case val1:
         ...
     case val2:
         ...
     default:
         ...
 }

var可以是任何的类型,与java 的相比就智能很多了,但是也麻烦很多

循环

for

在Golang中,只有一种循环,for循环。 没错 是只有一种 做梦都能笑醒了😂

和判断语句一样,在Golang中也是没有小括号的。

 func main() {
     sum := 0
     for i := 0; i < 10; i++ {
         sum += i
     }
     fmt.Println(sum)
 }

此外,在循环条件中,初始化语句和后置语句是可选的,这个时候把分号去掉,for循环就变成了while循环

 fortran复制代码func main() {
     sum := 1
     for sum < 1000 {
         sum += sum
     }
     fmt.Println(sum)
 }

不仅如此,如果省略循环条件,该循环就不会结束,因此无限循环可以写得很紧凑,这个时候,和while(true)的效果是一样的。

 autoit复制代码func main() {
     for {
         ...
     }
 }

数组

image-20230725213130781.png

切片

可变长度的数组

append需要再次赋值回去原来的数组

copy可以拷贝

image-20230725213635198.png

map

是完全无须的

image-20230725213819454.png

range

对map和数组进行遍历

对数组的时候,会返回一个值 和 下标

对map的时候会返回 K 和 V

image-20230725214048391

函数

在go中,函数本会返回多个值,但在大多情况的下会去定义

在Golang的函数定义中,所有的函数都以func开头,并且Golang命名推荐使用驼峰命名法。

注意,在Golang的函数中,如果首字母是小写,则只能在包内使用;如果首字母是大写,则可以在包外被引入使用。可以理解为,使用小写的函数,是private的,使用大写的函数,是public的。

 func swap(x, y string) (string, string) {
     return y, x
 }
 ​
 func main() {
     a, b := swap("hello", "world")
     fmt.Println(a, b)
 }
 ​
 func split(sum int) (x, y int) {
     x = sum * 4 / 9
     y = sum - x
     return
 }
 ​

结构体

image-20230725214841001.png 类似于是一个类了

结构体方法

相当于在类里添加方法

image-20230725215043890.png 带指针的可以修改结构体中的值

错误处理

image-20230725224803310.png

在函数的返回值中定义error来返回方法的错误

并且还要定义两个值,一个去接返回的数 一个去接返回的错误信息

字符串操作

Strings方法

image-20230725224950647.png 一个中文可能会对应多个字符

字符串的格式化

image-20230725225111069.pngPrintf中可以对输出的结果显示信息进行格式化的定义

JSON操作

image-20230725225219653.png

序列化,需要定义一个结构体并且每个字段的首字母是大写的

调用json.Marshal()来对对象进行序列化

序列化后返回的是一个字符数组

在输出序列化问件的时候,如果不需要将字段进行大写的输出,可以在定义结构体的时后再字段的后面添加`json:"age"来定义输出时的格式

当需要反序列化的时候,则需要定义一个序列化数组

 var b userInfo
 err = json.Unmarshal(buf,&b)

时间处理

image-20230725230010544.png

go中的时间是用"time"

now.Unix()用来获取一个是按戳

go中的定义时间的格式不像其他的用yyyy-mm-dd来表示,二十用的一个特定的时间来表示,其在函数中有声明

数字解析

image-20230725230341804.png

可以将字符串在字符串和数字之间转换

进程信息

image-20230725230521647.png