小白搭建golang环境并解决其中出现的问题

86 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第五天,点击查看活动详情

windows下Go语言环境搭建

下载Go安装包

studygolang.com/dl 在这里插入图片描述 个人是windows系统所以安装windows版本,如果要安装其他版本可借阅其他博主的博客 在这里插入图片描述 在这里插入图片描述 等待安装成功 安装成功后,打开系统环境变量,看是否存在以下环境 在这里插入图片描述 如果没有则手动添加即可 Gopath指在用户的环境 goRoot则是编译环境,也就是你刚刚安装的目录 然后再在命令行输入 go env测试go语言是否可用 在这里插入图片描述

这样就ok了

go的基本使用

个人在学习新语言时习惯先了解其最基础的东西,而且在学习时有这样一个流程

  1. 数据类型
  2. 变量声明
  3. 输入输出
  4. 运算符的使用
  5. 循环语句和判断语句

数据类型

通过菜鸟教程了解到go的数据类型分为

  • 布尔类型
  • 数字类型
  • 字符串类型
  • 派生类型(后续再说)

布尔类型

只有false和true二种选择

数字类型

在数学中数字可以包含很多,实数.整数.负数.自然数,计算机也是如此 数字类型也分为整数,实数(浮点数) 在这里插入图片描述 但是计算机的常见的操作系统类型则可分为8位,16位,32位,64位 所以整数和浮点数在计算机中也会分的比较细 在这里插入图片描述

在这里插入图片描述

字符串

1)字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节) 2)字符串在Go语言内存模型中用一个2字长的数据结构表示。它包含一个指向字符串存储数据的指针和一个长度数据。 3)字符串是一种值类型,且值不可变。所以多字符串共享同一个存储数据是安全的。 4)切分操作 str[i:j] 会得到一个新的2字长结构,一个可能不同的但仍指向同一个字节序列(即上文说的存储数据)的指针和长度数据。字符串切分不涉及内存分配。 5)string 类型的零值为ptr为nil,len为0的字符串,即空字符串 “” 6)获取字符串中某个字节的地址的行为是非法的,例如: &str[i]

变量声明

在学习变量声明前还是要先了解一点的,就是变量声明的规则而不是直接看变量如何声明,不出意外的话go的变量声明规则应该和其他语言一样

  • 只能_和字母开头
  • 变量里面只能存在_,字母和数字
  • 以前我无疑间看到一篇文章说阿里不建议以下划线开头,虽然我也不知道为什么,但是可能会有用吧
  • 不要和go的关键词重名,go区分大小写

变量声明有三种,根据自己喜好和习惯来选择其中一种即可

FIrst

结构为var+变量名+类型 我猜测go的开发者可能用java或者c什么的用的比较多,但是又忠于js,导致并用,因为java声明变量就是数据类型+变量名,而js就是var+变量名,写java的人可能都习惯将一个变量指定为一个特点的数据类型以方便以后查阅什么的 废话不多说了吧

#定义一个变量
var x int;
#定义多个变量
var (
    y int
    z string
);
​
1234567

其实这里没必要加;号,主要是因为我大学学java和c习惯结束用;号

Second

var+变量名=值 作者是外国人,我看外国教程视频时时常会看到python教程,并且加上外国很多大型网站都是用python写的,所以go作者可能在变量声明时借鉴了一下python的变量声明 这个有好处也有坏处,主要是以个人习惯为主

#变量必须赋值
var a=1; //a就自动定义成int类型
var b,c,d="hello",2,1.2;
​
123

Thrid

变量名:=值 这个应该就是上一种的简化,我感觉可能完全借鉴了python命名,为什么我要这么说主要是go产生于2009年,而python和java还有js分别产生于1991年,1995年,1995年

//直接声明并赋值(必须是初次声明才有冒号)
p2 := "as"
// 多个变量一次性声明并赋值
h, i, j := 1, 2, 31234

根据自己喜欢来选择自己命名方式不过在后面有些可能会是固定的

输入输出

这个无疑是特别重要的,如果不会输出和输入那我怎么学,我怎么测试,废话不多说,学过其他语言或者还没学过,那就一定知道(记住)print这个关键字,无疑go语言也是这样,不过他基本上都是调用SDK这个东西,我也不知道这是个什么,但是我会百度SDK,go语言要调用一个库叫ftm的这个库里面就有打印的函数,打印函数那就可多了,我查了一下go语言打印就有五种

1)Print:   输出到控制台(不接受任何格式化,它等价于对每一个操作数都应用 %v)
​
print 在golang中 是属于输出到标准错误流中并打印,官方不建议写程序时候用它。可以再debug时候用
​
fmt.Print(str)
​
2)Println: 输出到控制台并换行
​
fmt.Println(tmp) 
​
3)Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出整形变量和整形等)
​
fmt.Printf("%d",a) 
​
4)Sprintf:格式化并返回一个字符串而不带任何输出
​
s := fmt.Sprintf("a %s", "string") fmt.Printf(s) 
​
5)Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout
​
fmt.Fprintf(os.Stderr, “an %s\n”, “error”) 
​
123456789101112131415161718192021

如果写c比较多的那可能第三种你可以常用 关于占位符这种东西比较简单,我也不多说了,反正我忘了我就去查,而且基本上都是用常见的占位符,所以不详说 说完输出必然说输入,输入的话好像和c特别特别像,二种方式

  • ftm.scan(变量地址)
  • ftm.scanf(“输入格式”,变量地址) //和c语言基本一样

运算符

在数学中运算符有±*/,但是在计算机则分为六种运算符,OMG,有点多所以我就没说了到后面用到了再说不然头都会大 这里直接上链接明白明白即可

循环语句和判断语句

判断语句比较简单 在这里插入图片描述 go语言的if格式与其他语言的格式有点差别就在于他没有() 在这里插入图片描述

重要的是循环语句,循环则是重中之重 常见的无疑就是for循环通过菜鸟教程可以清晰的理解到for循环的使用,for循环本身不难,难的在于我不知道什么时候用什么时候不用,这个还得考做题或者做项目来巩固,不过很容易发现go语言的for和if都和c语言的特别相似,所以在学习go语言的时候可能也学会了一点c语言

总结

总结没啥说的主要以做题来总结,比较原理懂了但是不会用,那有啥用!!!难度不大也就是在leetcode里面找题目而已, 题目是LeetCode的转置矩阵 在这里插入图片描述

做这个题时看到了这二个东西 在这里插入图片描述 c语言或者其他语言都应该明白这表示二维数组,所以我要引申的就是什么是数组切片,而leetcode主要以切片用的比较多,你自个慢慢去看吧反正不难,go语言的切片和c语言的动态数组及其相似,读者在看的时候可能会出现一些小问题,这里也附上关于创建二维切片的链接

思路

转置矩阵好耳熟的词语,等等这不就是线代的转置矩阵吗?这不就是让我们用电脑实现数学吗?好吧,不过先从数学的角度去分析吧,毕竟这个就是数学题,如果忘记了什么叫转置矩阵,没关系我帮你百度(并不是我想百度的我记得这玩意的原理…),转置矩阵 在这里插入图片描述 在这里插入图片描述 我们从这二张图可以分析出以下问题

  • 原来的a12位置会变成a21的位置…
  • 原来的数组是m行n列,转置后就会变成n行m列 根据这二个问题我们就能很快解决问题了

代码实现

func transpose(A [][]int) [][]int {
    /*
    1.原来的a12位置会变成a21的位置......
    2.原来的数组是m行n列,转置后就会变成n行m列
    */
    //获取原数组的行和列
    var m =len(A);
    var n =len(A[0]);    
    //创建一个n行m列的二维切片
    B:=make([][]int,n);
    //分配二维矩阵空间
    for i:=0;i<n;i++{
        B[i]=make([]int ,m);
    }
    for i:=0;i<m;i++{
        for j:=0;j<n;j++{
            B[j][i]=A[i][j];
        }
    }
    return B;
}
​
123456789101112131415161718192021

这里必要说明一下,go的执行方式为go+run+要执行的go文件 在这里插入图片描述

结果