go语言基础

Posted 一只小阿大:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言基础相关的知识,希望对你有一定的参考价值。

目录

go安装

参照菜鸟教程 Go 语言环境安装
可以学习的博文 李文周GO

关于vscode配置go语言开发环境问题

go env -w GOPROXY=https://goproxy.cn,direct
安装完go后命令台执行这个指令
有什么用呢?
vscode扩展go后会有个像下图的提示,这时候install all,会发现下载失败,这就是没有输入上面那个指令的问题,卸载扩展go,去命令台输入指令,再安装后install all即可

语言结构

需要注意的一点是 不能单独放在一行,所以以下代码在运行时会产生错误:

package main

import "fmt"

func main()  
  //错误, 不能在单独的行上
    fmt.Println("Hello, World!")

行分隔符

格式跟python一样,不需要分号结尾
因为go的编译器会自动添加,如果需要多个语句在同一行,就需要分号了,但实际开发过程中不提倡这么写

注释

跟c语言一样的,单行// 多行/**/

标识符

也就是命名变量的时候是否合法
不合法的:
1ab(以数字开头)
case(Go 语言的关键字)
a+b(运算符是不允许的)

格式化字符串

package main

import (
    "fmt"
)

func main() 
   // %d 表示整型数字,%s 表示字符串
    var stockcode=123
    var enddate="2020-12-31"
    var url="Code=%d&endDate=%s"
    var target_url=fmt.Sprintf(url,stockcode,enddate)
    fmt.Println(target_url)

Operation results:
Code=123&endDate=2020-12-31

数据类型

Go语言数据类型

我测试了一下如果超过变量类型存放的数据大小会怎样

package main

import "fmt"

func main()
	var a uint8 = -1
	//查看变量类型
	fmt.Printf("type = %t\\n",a)


发现go语言有个参数边界检测提示

“var”与“:=”的区别

定义变量格式:
var variableName type = value

定义了一个int类型的变量number,初始化为10
var number int = 10

由于go语言设计者觉得这样比较繁琐
所以缩短成了 var variableName = value ,这样直接忽略掉了变量类型
然后继续简化成了 variableName := value
相当于var variableName = value 语句和variableName := value语句等同

变量

单变量声明

第一种,指定变量类型,如果没有初始化,则变量默认为零值。

go语言变量未初始化的初始值
数值类型(包括complex64/128)为 0
布尔类型为 false
字符串为 “”(空字符串)
以下几种类型为 nil:
var a *int
var a []int
var a map[string] int
var a chan int
var a func(string) int
var a error // error 是接口

第二种,根据值自行判定变量类型。

就是没定义变量类型,编译器会根据你的变量来设置变量类型

第三种,如果变量已经使用 var 声明过了

如果变量已经使用 var 声明过了,再使用 := 声明变量,就产生编译错误

多变量声明

package main

var x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量
    a int
    b bool
)

var c, d int = 1, 2
var e, f = 123, "hello"

//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"

func main()
    g, h := 123, "hello"
    println(x, y, a, b, c, d, e, f, g, h)

Operation results:
0 0 0 false 1 2 123 hello 123 hello

值类型和引用类型

所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值

当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝

go语言可以像c语言一样操作地址,用了&取地址符
值类型变量的值存储在堆中
更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。
一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。

当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。

如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响

数据交换

如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同。
这样就不需要加个变量Buffer了。
往常c语言值的交换,就是Buffer = a , a = b ,b = Buffer

iota

iota
常用来设置枚举类型

package main

import "fmt"

func main()
	const (
		ColorRed      = iota
		ColorOrange      
		ColorYellow      
		ColorGrassland   
		ColorCyan            
		ColorBlue            
		ColorPurple      
	)

	fmt.Println(ColorOrange)
	fmt.Println(ColorPurple)
	const (
		a      = iota
		b     
	)
	fmt.Println(a)
	fmt.Println(b)

Opetion results:
1
6
0
1

运算符

跟c语言没区别,就不想写了

条件语句

多了个select(随机执行),是为了避免饥饿问题
一般配合通道(chan)一起使用

package main

import "fmt"

func main() 
   var c1, c2, c3 chan int
   var i1, i2 int
   select 
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok 
            fmt.Printf("received ", i3, " from c3\\n")
          else 
            fmt.Printf("c3 is closed\\n")
         
      default:
         fmt.Printf("no communication\\n")
       

循环


循环嵌套就循环套循环,没多大区别
循环控制语句也没啥区别,也是break,continue,goto

以上是关于go语言基础的主要内容,如果未能解决你的问题,请参考以下文章

Go语言中的值类型和引用类型

go语言学习笔记 — 基础 — 基本数据类型 — 类型类别:值类型和引用类型

C语言中的一个等号和两个等号有啥区别

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 常量变量的声明:常量的初始化定义

Go基础--笔记

最好的开发语言一定是那位吗?Go语言有话说