go基本语法

go基本语法

变量

基本类型

  1. bool默认false
  2. int以及int8int32
  3. string用双引号或反引号括起来。反引号括起来的为raw字符串,即自动转义换行等字符
  4. error错误类型

定义变量

  1. var开头,后跟变量名,再跟类型:var a int var a,b,c int var a int = b var a,c int = x,y,z
  2. 如果定义以后赋值可以体现类型,则可以不写类型:var a=1 var a,b = x,y
  3. 此时也可以省略vara:=1 a,b := x,y(次形式仅限用于函数体)
  4. 特殊变量_。赋值给_的值会被丢弃。如_,a := 1,2会把2赋给a,同时1被丢弃
  5. 声明未使用的变量会编译报错
  6. iota作用域内每使用一次会自增,同一行使用时值相同

数组

  1. 定义:arr:=[]int{},arr:=[10]int{1,2},arr:=[...]int{1,2,3}
  2. 获取长度:len(arr)
  3. 多维数组arr:=[...][...]int{[...]int{1},[1]int{2}}

slice

数组切片;引用类型,同一数组的slice指向同一数组;
1. 定义:var s []int(不指定长度)
1. arr:=[...]int{1,3}表示数组s:=arr[0:2]表示从在数组arr从0到2的切片
1. s:=arr[:2]从0到2
1. s:=arr[1:]从1到len(arr)

map

无序;引用类型;
1. 定义:var m map[string]intm:=make(map[string]int)
1. 初始化:m:=map[String]int{"a":1,"b":2}
1. 赋值:m["key"]=1

struct

struct的组合即为面向对象中的类
1. struct组合
1. 匿名字段
1. 组合struct同名字段:优先访问外层

自定义类型

type Pair map[string]int自定义一个类型

常量

const a = 1

语句

  1. 选择if
  2. 循环for

函数(面向过程的函数)

定义函数

第一行 以func开头,后跟函数名,然后小括号内参数列表,以{结尾,然后是函数体,最后以}结束。

函数返回值

如果需要有返回值,则在参数列表后跟小括号,括号内写返回值类型

func get()(a int,b int){
    a=1
    b=2
    return
    // 同return 1,2
}

变长参数

func get(arg ...int){
    for n := range arg{
        // process n
    }
}

传值与传指针

  1. 对于基本类型,同C
  2. 指针在定义时需要些*,而使用时会自动取址和指向(不用写&*

函数作为类型与变量

// 定义一种函数类型
type testInt func(int) bool

// 定义该项类型方法
func bigThanZero(v int) bool {
    return v > 0
}

// 定义该项类型方法
func smallThanZero(v int) bool {
    return v < 0
}

// 方法作为参数
func process(v int,f testInt) bool {
    a := 0
    return f(a)
}

func main() {
    a := 0
    // 方法作为变量
    process(a,bigThanZero)
}

方法(面向对象的方法)

带接收者的函数

// r为变量名,Receiver为接收者类型
func (r Reciever) f(){ }

方法的继承

  1. 不像java或c#的方法是定义在类中的,go的方法是定义在struct之外
  2. struct组合时可以继承其对应的方法

重写继承的方法

声明方法时,指定新的接受者即可

interface

// 定义接口I
type I interface{
    fun1()
    fun2(arg string)
}

接口作为参数

同Java

接口定义变量

同Java

comma-ok

类似java中instanceof

func main() {
    m := map[string]Thing{"key": O{"a"}}
    // m["key"].(Thing)类似java中m.get("key") instanceof Thing
    if value,ok := m["key"].(Thing); ok {
        value.create()
    }

}

type Thing interface {
    create()
}

type O struct {
    name string
}

func (o O) create() {
    o.name = "1"
}

也支持switch-case

func main() {
    m := map[string]Thing{"key": O{"a"}}
    // m["key"].(Thing)类似java中m.get("key") instanceof Thing
    if value,ok := m["key"].(Thing); ok {
        value.create()
    }
    switch m["key"].(type) {
    case Thing:
        // process
    case O:
        //process
    }

}

type Thing interface {
    create()
}

type O struct {
    name string
}

func (o O) create() {
    o.name = "1"
}

接口继承

类似struct的继承,或者叫组合

type i interface{ anotherInterfacce }

代码分组

import "fmt"
import "os"

const i=100
const pi=3.14
const pre = "go"

var i int
var pi float
var pre string

可改写为

import(
    "fmt"
    "os"
)

const(
    i=100
    pi=3.14
    pre="go"
)
var(
    i int
    pi float
    pre string
)

规则

  1. 大写字母开头变量可导出,小写字母开头变量不可导出
  2. 大写字母开头函数为公有,小写字母开头变量为私有

defer

  1. 作用类似java中的try-catch
  2. 写法类似java中的assert
  3. 执行时机为函数返回前,后写的先执行
func f(){
    file.Open("file");
    defer file.Close();
    // process
}

并发

方法前加go关键字,即可异步调用

go run()

主动让出CPU

runtime.Gosched()

通信channel

  1. 定义处理int的channelc:=make(chan int)
  2. 发送数据到channelc <- 2
  3. 从channel接收数据i := <- c
  4. 定义处理int的channel,并指定缓冲区大小为2个intcc := make(chan int,2)
  5. 手动关闭close(c)
  6. 判断是否打开v,ok := <-c

select

select之于channel,类似switch之于int

runtime

并发控制

Tips

if逻辑快内定义变量

//在if逻辑块内,允许声明一个变量,作用域只在块内有效
if x:= get(); x>10{

}

make、new

make返回值,new返回指针

标签

可用于gotobreakcontinue

for-range

m:=map[string]int{"a":1}
for k,v:=range m{
    // process k,v
}
for  _,v:=range m{
    // process v
}

switch自动break

不用手写break自动结束case
如需强制执行下一个case,则需在当前case最后加上fallthrogh

合并case

switch i{
    case 1:
    case 2,3:
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“怎么以正确的方式替换Go语言程序自身”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希
本文小编为大家详细介绍“Go语言中除法运算的效率怎么提高”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中除法运算的效率怎么提高”文章能帮助大家解...
本文小编为大家详细介绍“Go语言中的next()方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go语言中的next()方法怎么使用”文章能帮助大家解决疑...
这篇文章主要介绍了Go语言中slice的反转方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中slice的反转方法怎...
这篇文章主要介绍“怎么使用Go语言实现数据转发功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Go语
这篇文章主要讲解了“Go语言中怎么实现代码跳转”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究
这篇文章主要讲解了“Go语言如何多开协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言如何多开协...