GO语言入门指南1 |青训营

126 阅读4分钟

一、软件下载和环境配置

1.1、go语言安装

go语言中文网: studygolang.com/dl

go语言环境配置:

  • 安装完毕后打开环境配置文件。
#进入用户的home目录
cd /users/自己电脑的用户名

#打开环境变量配置文件
open .bash_profile

#报错 .bash_profile does not exist
#第一次配置环境变量先创建文件 
touch .bash_profile

#配置go环境变量复制以下内容
export GOPATH=/user/local/go
export PATH=$GOROOT/bin:$PATH:.

#配置文件立即生效
source .bash_profile

#检查环境变量
go -version
  • 接下来进入vscode插件栏搜索go并下载

截屏2023-07-25 18.53.47.png

  • 在vscode试运行,发现右下角跳出弹窗需要下载插件,下载后失败。
#先进入go下载目录
cd /user/ 这里是用户名 /go

#从github下载插件依赖包
git clone github.com/ramya-rao-a/go-outline

#下载好依赖包后执行一下内容等待插件下载
go install golang.org/x/tools/gopls@latest

这就做好配置的工作了,这里参考了

blog.csdn.net/AdolphKevin… blog.csdn.net/u011374856/…


1.2、go基础入门

###1.2.1 代码形式

  • 这里和c语言不同的是package,package需要为main,需要有main函数,否则无法运行
  • package名称的限制

不能把多个包放在同一个目录里,也不能把同一个包的文件分拆到不同目录中。同一目录下的同一级go文件,package名称必须相同,否则无法运行。 package的名称不需要和目录名称相同

package main
import("fmt")
func main(){
    fmt.Pringln("helloworld")
}

1.2.2 变量声明

go变量的声明是”var 变量名 类型“形式
var a int
var a="intital" # 可以不声明变量
var a, b int=1, 2
常量的声明是”const 常量名 类型=值“ const pi float32=3.14

单精度float32 双精度float64

1.2.3 数据类型

字符串

  • 字符串可以拼接
var a = "initial"
g := a + "foo"

数组类型是一组固定长度的同类型元素

`var 变量 [长度]类型` </br>
`var a[5]int`</br>
  • 可以忽略初始化表达式中长度,
    var a[...]int{1,2}
  • 可以使用指定索引值的方式来初始化数组,
var arr = [...]int{
     99: 39   //将第100个(下标为99)的值赋值为39
}
  • 数组遍历
 var a = [...]string{"甘肃“, ”上海“, ”北京“}
 // 方法1:for循环遍历
 for i := 0; i < len(a); i++{
     fmt.Println(a[i])
 }
 // 方法2: for range遍历
 for index, value := range a {
     fmt.Println(index,value)
 }
 // 输出: 0 甘肃 1 上海...

切片是动态数组,格式为“[]类型“

var name[] type
var a = []int{}

  • 切片可以用append追加元素
    s[0]="a"
    s = append(s,"d") # append(追加对象,追加内容)

  • 切片的初始化

//方法一:直接声明
//方法二:用make函数创建切片
m := make([]type,length,caoacity) //capacity是容量

//方法三:
arr := [10]int{1, 2, 3, 4, 5, 6, 7}
ls := [2:5:8] //[low: high: max]
fmt.Println("ls:", ls) // ls:[3 4 5] 

- 字典类型是键值组合,格式为“map[键类型]值类型“

- map的三种定义方式
//方法一:语法糖
var dic map[string]string = map[string]string{"name":"隔壁老王", "hoppy":"喜欢隔壁少妇"}

//方法二:通过make(类型,容量)
var dict = make(map[string]string,3)
dict["name"]="隔壁小刘"
dict["hoppy"]="被隔壁王姐喜欢"

//方法三:通过make(类型)
var dict = make(map[string]string)
dict["name"]="隔壁小刘"
dict["hoppy"]="被隔壁王姐喜欢"

//方法四:通过map直接创建
var mapTwo = map[string]string{}
mapTwo["name"]="俺是老王"

mapFour := map[string]string{
       "a": "A",
       "b": "B", //需要以逗号结束
} 

和切片一样,没有被创建的map不能被使用

//map声明后没有定义不能直接使用,只有通过make或语法糖创建后才会有空间
var dict map[string]string
dict["name"] = "张姐" //报错
- 增,修改 : 和python一样直接用字典名[元素]=值
- 减: delete(字典名,"被删元素对应的key")
  • 查询:使用ok-idiom模式
func MapFindOne() {
  var dict map[string]string = map[string]string{"name": "laowang", "age": "18", "sex": "男"}
  value, ok := dict["age1"]
  if ok {
  	fmt.Println("字典有这个key,对应的值为", value)
  } else {
  	fmt.Println("字典没有这个key,对应的值为", nil)
  }

  if value, ok := dict["age"]; ok {
  	fmt.Println("字典有这个key,对应的值为", value)
  }
 //字典没有这个key,对应的值为 <nil>
 //字典有这个key,对应的值为18     
字典遍历
 - 注意: map和数组以及切片不同,map中存储的数据是无序的,所以多次打印的 顺序可能不同

匿名变量:

m := map[string]int{
    "hello": 100,
    "world": 200,
}
for _,value := range m{  // _相当于占位符
   fmt.Println(value)
}

指针变量

  func main(){
      add2ptr(&n)
      fmt.Println(n)  // 7
  }
  func add2ptr(n *int){
          *n += 2
  }

结构体类型

  • 创建结构体切片:users := []user{}
 type user struct {
	name string
	password string
}
 func main(){
 //添加元素
    a := user{name:"wang", password: "1024"}     b := user{"wang","1023"}
    c := user{name: "wang"}
    c.password = "1024"
    
    fmt.Println(checkPassword(a,"haha")) //false
    
func checkPassword(u user, password string) bool {
	return u.password == password
}