[golang基础语法 | 青训营笔记]

91 阅读7分钟

这是我参与「第五届青训营 」笔记创作活动的第1天

go语言简介:

go语言(或 Golang)是Google开发的开源编程语言,诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。

go开发环境:

go:

下载地址:studygolang.com/dl

vs code:

下载地址:code.visualstudio.com/

Goland:

下载地址:www.jetbrains.com/go/download…

自己用的是goland,虽然vs code也下载了

go基础语法:

go语言hello world!(任何一门编程语言还是先把hello world!弄出来)

package main

import (
   "fmt"
)

func main() {
   fmt.Println("hello world!")

}

和C语言相似,go语言的基本组成有:

1.包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main。 引入包,其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包。

2.函数,和c语言相同,即是一个可以实现某一个功能的函数体,每一个可执行程序中必须拥有一个main函数。

3.变量,Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

4.语句/表达式,在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

5.注释,和c语言中的注释方式相同,可以在任何地方使用以 // 开头的单行注释。以 /* 开头,并以 */ 结尾来进行多行注释,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

go_变量:

声明变量的一般形式是使用 var 关键字,具体格式为:var identifier typename go中的内置类型包括bool; int(32 or 64),int8,int16,int32,int64; unit; float; string; complex; array; slice; map; chan

package main

import (
   "fmt"
   "math"
)

func main() {
   var a = "initial"
   var b, c int = 1, 2
   var d = true
   var e float64
   f := float32(e)

   g := a + "foo"
   fmt.Println(a, b, c, d, e, f) //initial 1 2 true
   fmt.Println(g)

   const s string = "constant"
   const h = 500000000
   const i = 3e20 / h
   fmt.Println(s, h, i, math.Sin(h), math.Sin(i))

}

变量的类型:

1.函数内定义的变量为局部变量,这种局部变量的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。这种变量在存在于函数被调用时,销毁于函数调用结束后。

2.函数外定义的变量为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,甚至可以使用import引入外部包来使用。全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。

3.函数定义中的变量成为形式参数,定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。形式参数会作为函数的局部变量来使用。

go_指针

与C相同,Go语言让程序员决定何时使用指针。变量其实是一种使用方便的占位符,用于引用计算机内存地址。Go 语言中的的取地址符是&,放到一个变量前使用就会返回相应变量的内存地址。

指针变量其实就是用于存放某一个对象的内存地址。

package main

import "fmt"

func add2(n int) {
   n += 2
}

func add2ptr(n *int) {
   // 指针 对传入参数进行修改
   *n += 2
}

func main() {
   n := 5
   add2(n)
   fmt.Println(n) // 5
   add2ptr(&n)
   fmt.Println(n) // 7
}

第一个函数add2相当于拷贝的形式,并不会改变实参,第二个函数add2ptr传入指针,会对传入参数进行修改,go语言中的指针相当于c++里指针的缩减版,没有那么多的操作,一般都是用来对函数传入参数进行修改

go_数组

和c语言相同,Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型

声明数组

Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:

var variable_name [SIZE] variable_type

以上就可以定一个一维数组,我们举例代码如下:

var balance [10] float32

实例:

package main

import "fmt"

func main() {
   var a [5]int
   a[4] = 100
   fmt.Println(a[4], len(a))

   b := [5]int{1, 2, 3, 4, 5}
   fmt.Println(b)

   var twoD [2][3]int
   for i := 0; i < 2; i++ {
      for j := 0; j < 3; j++ {
         twoD[i][j] = i + j
      }
   }
   fmt.Println("2d:", twoD)
}

go_结构体

go中的结构体,与c中类似,是带类型字段的集合,我们可以在一个结构体中定义多个不同的数据类型。 声明结构体的形式: `

type user struct {
   // 包含两个字段:name和password
   name     string
   password string
}

如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体变量名.成员名。 例如: `

c.password = "1024"

在 Golang 里面可以去为结构体定义一些方法,会有点类似其他语言中的类成员函数, 例如: checkpassword()的实现,从一个普通函数,改成了结构体方法,这样的话,就可以像 a.checkPassword("xx") 去调用,具体代码修改,就是把第一个参数,加上括号,写到函数名称前面

// 在实现结构体方法的时候有两种写法: // 1.带指针,可以对结构体中的内容进行修改 // 2.不带指针,实际操作就是一个 拷贝 ,无法对结构体进行修改

go_字符串

`

package main

import (
   "fmt"
   "strings"
)

// go里strings包中有很多字符串工具函数用strings.x()来实现
func main() {
   a := "hello"
   // Contains() : 判断一个字符串里面是否包含另一个字符串,返回结果类型为bool
   fmt.Println(strings.Contains(a, "ll")) // true

   // Count() : 字符串计数
   fmt.Println(strings.Count(a, "l")) // 2

   // HasPrefix() : strings.HasPrefix()函数用来检测字符串是否以指定的前缀开头
   fmt.Println(strings.HasPrefix(a, "he")) // true

   // HasSuffix() : strings.HasSuffix()函数用来检测字符串是否以指定的字符串结尾
   fmt.Println(strings.HasSuffix(a, "llo")) // true

   // Index() : 查找某一个字符串的位置
   fmt.Println(strings.Index(a, "ll")) // 2

   // Join() : 链接多个字符串
   fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo

   // Repeat() : 重复多个字符串
   fmt.Println(strings.Repeat(a, 2)) // hellohello

   // Replace() : 替换字符
   fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo

   // Split() : 切片
   fmt.Println(strings.Split("a-b-c", "-")) // [a b c]

   // ToLower() : 小写字符串
   fmt.Println(strings.ToLower(a)) // hello

   // ToUpper() : 大写字符串
   fmt.Println(strings.ToUpper(a)) // HELLO

   // len() : 求字符串的长度
   fmt.Println(len(a)) // 5

   b := "你好"

   // 一个中文字符可能对应多个字符
   fmt.Println(len(b)) // 6
}

`

go_函数

函数是完成一定功能的程序指令 golang中的函数 参数类型采取后置新思

golang里面的函数原生支持返回多个值,一般两个,第一个是真正的结果,第二个是错误信息

go_map

map的底层原理是哈希表

golang中的map完全无序

package main

import "fmt"

func main() {
   // 可以用amke来创建一个空的map(需要两个类型,key and value)
   m := make(map[string]int) //[key:string value:int]
   m["one"] = 1
   m["two"] = 2
   fmt.Println(m)           //map[one:1 two:2]
   fmt.Println(len(m))      // 2
   fmt.Println(m["one"])    // 1
   fmt.Println(m["unknow"]) // 0  找不到返回0

   r, ok := m["unknow"]
   fmt.Println(r, ok) // 0 false

   delete(m, "one")

   m2 := map[string]int{"one": 1, "two": 2}
   var m3 = map[string]int{"one": 1, "two": 2}
   fmt.Println(m2, m3)

}