go语言学习_incomplete

这篇具有很好参考价值的文章主要介绍了go语言学习_incomplete。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

rust没咋整明白,再来了解下go语言基础知识,参考资料为菜鸟教程以及go程序设计语言。go语言与google关系匪浅,且发明人之一还是c语言的发明人之一,可以说是很神奇了。

构建系统

go和cargo的编译命令挺像,也有build和run

编码风格

关于函数大括号,go似乎更严格,虽然rust有标准风格,但括号不在同一行也可以编译通过,而go会直接报错:

~/project/hello_go$ go build hello.go
# command-line-arguments
./hello.go:6:1: syntax error: unexpected semicolon or newline before {

go也有gofmt可以格式化代码。
与python一样,一行代表一个语句结束,如果想在一行写多个语句,可以使用;分隔。
注释与c相同,使用//和/**/。
go语言中标识符的开头字母的大小写决定了这个符号是否是外部符号,大写可以被其他人所用,否则只能在包内部可见并可用。
与python一样,go支持字符串通过+连接。

数据类型

布尔

数字

和rust类似,以占用空间大小命名类型,包括各种有符号无符号的整型,浮点型,另外还有byte,rune,uint,int与uintptr等类型。

字符串

派生类型

指针

go中的指针与c中的也很像

数组

形式如下:

var variable_name [SIZE] variable_type

go中的数组与c中的很像,只是语法不同。

结构体

同上,和c很像

Channel类型

函数

切片

声明形式:

//声明一个未指定大小的数组来定义切片:切片不需要说明长度。
var identifier []type

//或使用 make() 函数来创建切片:
var slice1 []type = make([]type, len)

//也可以简写为

slice1 := make([]type, len)
//也可以指定容量,其中 capacity 为可选参数。
make([]T, length, capacity)

需要注意的是不要和长度不确定的数组的定义混了,长度不定数组定义实例:

var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

切片有点像可变长数组

接口类型

形式:

/* 定义接口 */
type interface_name interface {
   method_name1 [return_type]
   method_name2 [return_type]
   method_name3 [return_type]
   ...
   method_namen [return_type]
}

/* 定义结构体 */
type struct_name struct {
   /* variables */
}

/* 实现接口方法 */
func (struct_name_variable struct_name) method_name1() [return_type] {
   /* 方法实现 */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
   /* 方法实现*/
}

实例:

package main

import (
    "fmt"
)

type Phone interface {
    call()
}

type NokiaPhone struct {
}

func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}

type IPhone struct {
}

func (iPhone IPhone) call() {
    fmt.Println("I am iPhone, I can call you!")
}

func main() {
    var phone Phone

    phone = new(NokiaPhone)
    phone.call()

    phone = new(IPhone)
    phone.call()

}

Map类型

map的定义同样使用make:

/* 使用 make 函数 */
map_variable := make(map[KeyType]ValueType, initialCapacity)

类型转换

形式:

type_name(expression)

实例:

var a int = 10
var b float64 = float64(a)

变量

go是强类型语言。

变量声明

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

var v_name v_type
v_name = value

第二种,根据值自行判定变量类型。
形式如下:

var v_name = value

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

v_name := value

intVal := 1 相等于:

var intVal int 
intVal =1 

这也就是说go中不能二次声明。
多变量声明
形式如下:

//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3

var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断

vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误

a, b, c := 5, 7, "abc"

// 这种因式分解关键字的写法一般用于声明全局变量
var (
    vname1 v_type1
    vname2 v_type2
)

交换变量值

a, b = b, a

作用域

基本与c相同,局部变量,全局变量等

常量

定义实例如下:

const b string = "abc"//显式类型定义
const b = "abc"//隐式类型定义

用做枚举:

const (
    Unknown = 0
    Female = 1
    Male = 2
)

iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
iota 可以被用作枚举值:

const (
    a = iota
    b = iota
    c = iota
)

简写如下:

const (
    a = iota
    b
    c
)

不要把这个和itoa混了。

Range

与python中的range可以产生序列不同,go中的range用于迭代遍历成员。

运算符

运算符和c基本一致

控制流

分支

if
else if
else
switch
select

循环

for

函数

定义形式:

func function_name( [parameter list] ) [return_types] {
   函数体
}

例子:

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
   /* 声明局部变量 */
   var result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result 
}

函数可以返回多个值

值传递和引用传递

和c类似,传引用是通过指针实现的。

函数作为实参

package main

import (
   "fmt"
   "math"
)

func main(){
   /* 声明函数变量 */
   getSquareRoot := func(x float64) float64 {
      return math.Sqrt(x)
   }

   /* 使用函数 */
   fmt.Println(getSquareRoot(9))

}

闭包

package main

import "fmt"

func getSequence() func() int {
   i:=0
   return func() int {
      i+=1
     return i  
   }
}

func main(){
   /* nextNumber 为一个函数,函数 i 为 0 */
   nextNumber := getSequence()  

   /* 调用 nextNumber 函数,i 变量自增 1 并返回 */
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   fmt.Println(nextNumber())
   
   /* 创建新的函数 nextNumber1,并查看结果 */
   nextNumber1 := getSequence()  
   fmt.Println(nextNumber1())
   fmt.Println(nextNumber1())
}

方法

形式如下:

func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
}

实例:

package main

import (
   "fmt"  
)

/* 定义结构体 */
type Circle struct {
  radius float64
}

func main() {
  var c1 Circle
  c1.radius = 10.00
  fmt.Println("圆的面积 = ", c1.getArea())
}

//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

错误处理

实例:

package main

import (
    "fmt"
)

// 定义一个 DivideError 结构
type DivideError struct {
    dividee int
    divider int
}

// 实现 `error` 接口
func (de *DivideError) Error() string {
    strFormat := `
    Cannot proceed, the divider is zero.
    dividee: %d
    divider: 0
`
    return fmt.Sprintf(strFormat, de.dividee)
}

// 定义 `int` 类型除法运算的函数
func Divide(varDividee int, varDivider int) (result int, errorMsg string) {
    if varDivider == 0 {
            dData := DivideError{
                    dividee: varDividee,
                    divider: varDivider,
            }
            errorMsg = dData.Error()
            return
    } else {
            return varDividee / varDivider, ""
    }

}

func main() {

    // 正常情况
    if result, errorMsg := Divide(100, 10); errorMsg == "" {
            fmt.Println("100/10 = ", result)
    }
    // 当除数为零的时候会返回错误信息
    if _, errorMsg := Divide(100, 0); errorMsg != "" {
            fmt.Println("errorMsg is: ", errorMsg)
    }

}

并发

协程

形式:

go 函数名( 参数列表 )

实例:

package main

import (
        "fmt"
        "time"
)

func say(s string) {
        for i := 0; i < 5; i++ {
                time.Sleep(100 * time.Millisecond)
                fmt.Println(s)
        }
}

func main() {
        go say("world")
        say("hello")
}

通道

创建通道形式如下:

ch := make(chan int)

实例:文章来源地址https://www.toymoban.com/news/detail-501618.html

package main

import "fmt"

func sum(s []int, c chan int) {
        sum := 0
        for _, v := range s {
                sum += v
        }
        c <- sum // 把 sum 发送到通道 c
}

func main() {
        s := []int{7, 2, 8, -9, 4, 0}

        c := make(chan int)
        go sum(s[:len(s)/2], c)
        go sum(s[len(s)/2:], c)
        x, y := <-c, <-c // 从通道 c 中接收

        fmt.Println(x, y, x+y)
}

到了这里,关于go语言学习_incomplete的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言学习笔记

    注:安装教程 注:上一篇笔记 注:下一篇笔记 2.6、流程控制 2.6.1、条件语句 2.6.2、选择语句 2.6.3、循环语句 2.6.4、跳转语句 goto语句跳转到本函数内的某个标签 2.7、函数 2.7.1、函数定义 函数构成代码执行的逻辑结构。函数的基本组成为:func、函数名、参数列表、返回值

    2024年02月06日
    浏览(36)
  • go语言学习计划。

    第1周:Go语言概述与环境搭建 内容 :了解Go语言的历史、特点和应用场景。安装Go环境,配置工作区。 实践 :编写第一个Go程序,了解Go的编译运行流程。 第2周:基本语法与数据类型 内容 :学习基本数据类型(整型、浮点型、布尔型、字符串)和基本语法。 实践 :编写简

    2024年01月23日
    浏览(23)
  • go语言学习——9

    前言:统计1~90000000数字中,哪些是素数? 使用循环,很慢 使用并发或者并行的方式,将任务分配给多个goroutine去完成,就会使用到goroutine 进程和线程 进程 是程序在操作系统中的一次执行过程,是 系统进行资源分配和调度 的基本单位 线程 是进程的一个执行实例,是 程序

    2024年02月08日
    浏览(34)
  • Go语言学习笔记(三)

    教程:文档 - Go 编程语言 (studygolang.com) 在call-module-code需要注意,需要在hello目录下操作 这是一个在Go项目的模块管理中的命令。在Go的模块管理工具( go mod )中,这个命令用于修改模块依赖关系。 具体来说, go mod edit -replace example.com/greetings=../greetings  这个命令的作用是:

    2024年02月02日
    浏览(38)
  • Go语言学习笔记(二)

    以下是一些推荐的Go语言学习资源的链接: Go语言教程:https://golang.org/doc/ Go by Example:Go by Example Golang Tutorials:https://golangtutorials.com/ Go语言第一课(慕课网):PHP模糊查询技术案例视频教程-慕课网 Go语言进阶教程(实验楼):极客企业版 Go语言高级编程(GitBook):谁是凶手

    2024年01月20日
    浏览(38)
  • go语言学习笔记1

    ​ GoLang是一种静态强类型、编译型、并发型,并具有 垃圾回收 功能的编程语言;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性,还可以发挥多核处理器同步多工的优点,并可解决面向对象程序设计的麻烦,并帮助程序设计师处理琐碎但重要的内存管理问题

    2024年02月12日
    浏览(38)
  • Go语言学习笔记(狂神说)

    视频地址:https://www.bilibili.com/video/BV1ae41157o9 聊聊Go语言的历史-KuangStudy-文章 下面列举的是原生使用Go语言进行开发的部分项目。 Docker Docker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理服务器上快速

    2024年02月15日
    浏览(34)
  • Go语言学习Day1:什么是Go?

    名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN) (一个喜欢古诗词和编程的Coder😊) 1、走近Go ①Go语言的Logo Go语言,通常被称为Golang,是一种高效、静态类型的编程语言,旨在简化多核心、网络编程及大型软件项目的开发。Go语言的

    2024年03月22日
    浏览(29)
  • go语言--区块链学习(一)

    温馨跳转链接:模块二:go语言–区块链学习(二)-CSDN博客 1.1 密码介绍 1.1.1 为什么要加密 ? 保护隐私和数据安全:在信息传输过程中,不加密的数据可以被未经授权的人员截获和查看,这可能导致个人隐私泄露、商业机密被窃取或者敏感数据被篡改。通过加密数据,可以

    2024年01月21日
    浏览(32)
  • Go学习圣经:Go语言实现高并发CRUD业务开发

    现在 拿到offer超级难 ,甚至连面试电话,一个都搞不到。 尼恩的技术社群中(50+),很多小伙伴凭借 “左手云原生+右手大数据”的绝活,拿到了offer,并且是非常优质的offer, 据说年终奖都足足18个月 。 第二个案例就是:前段时间,一个2年小伙伴希望涨薪到18K, 尼恩把

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包