学习golang的历程——持续更新

学习一门语言首先hello world

1,首先建立一个目录,新建一个hello.go的文件

package main

import (
   "fmt"
)

func main()  {
   fmt.Println("hello world")
}

2,go run hello.go



[email protected] study % go run hello.go
hello world



上面我们就完成了我们的基础使命。下面我们正式开始入门

在正式进入写代码之前,推荐大家使用JB家族的Goland

在设置中需要注意GOPATH和GOROOT不能写同一个地址,否则会报错:

warning: GOPATH set to GOROOT (/usr/local/go) has no effect

一,入门篇

1,golang语言特性

① 垃圾回收

  1. 内存自动回收,不需要开发人员管理内存
  2. 开发人员只需关注业务实现,降低负担
  3. 只需new分配内存,不需要释放

② 天然并发

  1. 从语言层面支持并发,非常简单
  2. goroute,轻量级线程,创建成千上万个goroute成为可能
  3. 基于CSP(Communicating Sequential Process)模型实现

③ 管道(channel)

  1. 管道,类似unix/linux中的pipe
  2. 多个goroute之间通过channel进行通信
  3. 支持任何类型

④ 多返回值

  1. 定义函数返回类型需要加括号
  2. 返回需要以,作为分隔

⑤ 需要编译

go build + 路径

2,变量的定义:

# 第一种package变量
var (
    a = 1
    b = 2
)
var aa = true

# 第二种非package变量
var a, b int = 1, 2
# 简写
var a,b = 1, "89"
# 精简
a, b := 1, "78"  // 全局不可使用

在上一个例子的基础上写一个加法函数,传入两个变量,返回两个参数之和

package main

import (
    "fmt"
)

func add(a int, b int) int {
    var sum int
    sum = a + b
    return sum

}

func main()  {
    var c int
    c = add(100, 200)
    fmt.Println("hello world!", c)
}

在上述例子中,我们可以看到,他是没有封号

在定义变量的时候需要指定比变量的类型,定义函数的时候,在()外需要写上返回值的类型

需要注意的是,go不容许定义变量而不使用的情况发生,否则编译的时候就会报错,比如:



c declared and not used


3,包的定义

  • 和Python语言,把相同功能代码放到一个目录中,称之为包(因此,在写代码的时候都需要写package 包名)
  • 包当然支持被其他包的引用
  • main包是用来生成可执行文件,每一个程序有且只能有一个main包
  • 包的主要用途是提高代码的可复用性

4,注意事项

① Go 进行build的时候经常会遇到 can‘t load package

在Goland中配置

需要加上Project GOPATH 路径

② Go新建项目默认需要在src下,并且,编译的时候不需要将src路径写入

go默认所有的项目文件都放在src目录下面

在project目录下执行go build go_test/day1/example即可

③ 一般build文件都指定在一个bin目录

go build -o bin/calc go_dev/day1/package_count/main

用 -o 来指定目录bin,文件为calc,编译的是main

5,go的基本类型

① 文件名&关键字&标识符

  • [x] 所有源码以.go结尾
  • [x] 标识符以字母或者下划线开头,大小写敏感(_)
  • [x] _是特殊标识符,用来忽略结果
  • [x] 保留关键字
    break default func interface select
    case defer go map struct
    chan else goto package switch
    const fallthrough if range type
    continue for import return var

② Go程序基本结构

  1. 任何一个代码文件隶属于一个包
  2. import 关键字,引用其他包
    import ("fmt")
    import ("os")
    // 通常写为
    import (
     "fmt"
      "os"
    )
  3. Golang 可执行程序,package main,并且有且只有一个main函数入口
  4. 包内函数调用,直接调用
  5. 不同包内调用函数,需要通过包名 + 点 + 函数名进行调用(函数名首字母必须大写)
    package main
    
    import "fmt"
    
    func list(n int) {
       for i := 0; i <= n; i++ {
          fmt.Println("%d+%d=%d\n", i, n-i, n)
       }
    }
    func main() {
       list(10)
    }
    // 打印循环
  • [x] 注意:在包中可以定义一个init函数,默认会在main执行之前执行

    package calc
    
    var Name string = "jack"
    var Age int = 10
    
    func init() {
       Name = "zhou"
       Age = 100
    }
    // 最终结果是Name为zhou,Age为100
    // 执行顺序 先执行全局变量,在执行init,最后到main

③ 常量和变量

一,常量

  1. 常量使用const修饰,代表永远是只读的,运行期间不能够修改
  2. const只能修饰boolean,number(int相关类型、浮点类型、cpmplex)和string
  3. 语法:const identifier [type] = value,其中type可以省略。
    const b string = "hello world"
    const b = "hello world"
    const Pi = 3.1415926
    const a = 9.3
    const c = getValue() // 错误,因为常量是不可改变的
  4. 单行注释 // 多行注释 /* */(其实和JS的写法一致的)

二,变量

见上方变量的定义

④ 数据类型和操作符

一,数据类型

值类型: 基本数据类型int,float, bool, string以及数组和struct

当值类型需要修改的时候 传入值之前加一个&即可,比如:

modify(a) ---->>> modify(&a)

这样就相当于传入a的内存地址到modify中去

引用类型: 指针,slice,map, chan等都是引用类型

二,操作符

  1. 逻辑操作符

    == 、!=、<=、>=、>、<、!、&&、 ||

    func main() {
       a := 10
       if (a > 2) {
          fmt.Println(a)
       }
    }
  2. 数学操作符

    +、-、*、/ 等等

⑤ 字符串类型

func main()  {
   var str = "hello world\n"
   var str1 = `
        窗前明月光,
      地上鞋两双。
      `
   var b byte = 'c'
   fmt.Println(str)
   fmt.Println(str1)
   fmt.Println(b)
   fmt.Printf("%c\n", b)
}

go在进行输出的时候是不会改变原有的样式的,对于打印bytes对象,会直接打印对于字符表中的具体位置的

fmt文档:给您放这里啦

例子: 交换两个变量的值

package main

import (
   "fmt"
   _ "os"
)

func swap(a int, b int) {
   tem := a
   a = b
   b = tem
   return
}

func main() {
   first := 100
   second := 200
   swap(first, second)
   fmt.Println(first, second)
}


结果如下:

[email protected] ~ % /Users/jack_zhou/workspace/gospace/project/main ; exit;

100 200



为啥没有产生变化呢?

因为这两个变量属于值类型的,值类型是属于复制拷贝,改的是副本的值,如果需要改就必须传入指针地址。那如何修改呢?

package main

import (
   "fmt"
   _ "os"
)

func swap(a *int, b *int) {
   tem := *a
   *a = *b
   *b = tem
   return
}

func main() {
   first := 100
   second := 200
   swap(&first, &second)  // 传入变量的地址
   fmt.Println(first, second)
}


结果如下:

Last login: Sun Dec 8 22:55:57 on ttys002

[email protected] ~ % /Users/jack_zhou/workspace/gospace/project/main ; exit;

200 100


package main

import (
   "fmt"
   _ "os"
)

func swap(a int, b int) (int, int) {
   tem := a
   a = b
   b = tem
   return a, b
}

func main() {
   first := 100
   second := 200
   first, second = swap(first, second)  // 传入变量的地址
   fmt.Println(first, second)
}

通过返回值的方式也是可以的

最简单的方式是:

package main

import (
   "fmt"
   _ "os"
)

func main() {
   first := 100
   second := 200
   first, second = second, first
   fmt.Println(first, second)
}

写到这突然发现还是Python大法好啊╮( ̄▽ ̄)╭

⑥ 字符串的操作

  1. 直接相加

    package main
    
    import "fmt"
    
    func main()  {
       var str = "hello"
       var str2 = " world"
       str3 := str+str2
       fmt.Println(str3)
    }
  2. 格式化输出
package main

import "fmt"

func main() {
   var str = "hello"
   var str2 = " world"
   // str3 := str+str2
   str3 := fmt.Sprintf("%s %s", str, str2) // 格式化输出
   fmt.Println(str3)
}
  1. 求字符串长度

    package main
    
    import "fmt"
    
    func main() {
       var str = "hello"
       var str2 = " world"
       // str3 := str+str2
       str3 := fmt.Sprintf("%s %s", str, str2) // 格式化输出
       n := len(str3)
       fmt.Printf("len(str)=%d\n", n)
    }
  2. 字符串的切片
    package main
    
    import "fmt"
    
    func main() {
       var str = "hello"
       var str2 = " world"
       // str3 := str+str2
       str3 := fmt.Sprintf("%s %s", str, str2) // 格式化输出
       substr := str3[0:5] // 和Python操作一致
       fmt.Println(substr)
    }
  3. 字符串反转
    package main
    
    import "fmt"
    
    func reverse(str string) string {
       var result []byte
       tmp := []byte(str) // 强制转换字符数组
       length := len(str)
       for i := 0; i < length; i++ {
          result = append(result, tmp[length-i-1])
       }
       return string(result)
    }
    func main() {
       var str = "hello"
       var str2 = " world"
       str3 := str + str2
       result := reverse(str3)
       fmt.Println(result)
    }

原文地址:https://www.cnblogs.com/zhoulixiansen/p/12014323.html

时间: 2024-10-07 04:00:36

学习golang的历程——持续更新的相关文章

cocos2d-x 学习资源整理(持续更新...)

生活像一把无情刻刀,改变了我们模样,曾经我以为会亘古不变的东西,突然在一瞬间失去了信念... 如果你改变不了生活中患得患失的心情,那就试着让自己变得强大一点,因为能做到不以物喜不以己悲都是建立在强大的基础上面的. so,加油吧,少年. ================================================================ 一不小心又废话了. 学习cocos2d-x也有一段时间了,直到现在仍然认为自己是个新手(呵呵,说的好像我不是新手一样.) 现在把自己这

[Hadoop] Hadoop学习历程 [持续更新中…]

1. Hadoop FS Shell Hadoop之所以可以实现分布式计算,主要的原因之一是因为其背后的分布式文件系统(HDFS).所以,对于Hadoop的文件操作需要有一套全新的shell指令来完成,而这就是Hadoop FS Shell.它主要是用于对Hadoop平台进行文件系统的管理. 有关HDFS的介绍博客请移步:Hadoop学习笔记之Hadoop基础. 有关Hadoop FS Shell的学习文档:Hadoop FS Shell学习文档. 2. Hadoop Streaming 我们知

深度学习算法索引(持续更新)

https://zhuanlan.zhihu.com/p/26004118 机器学习最近几年发展如同野兽出笼,网上的资料铺天盖地.学习之余建立一个索引,把最有潜力(不求最全)的机器学习算法.最好的教程.贴近工业界最前沿的开源代码收录其中.个人能力有限,希望知友指正和补充. Model篇 1. Reinforcement Learning 领军人物:david silver 教程 2015年david silver的UCL Course on RL:Teaching david silver的Tu

cocos2d-x学习资源汇总(持续更新。。。)

引用地址:http://www.cnblogs.com/zilongshanren/archive/2012/02/17/2356516.html 我之前一直学习c++的,第一次接触cocos2d是oc版的,虽然很好用,但是,我还是对c++情有独钟,再加之cocos2d-x由自己人主导,更应该拥抱她,热爱她,把她发扬光大.之后,我将会全面投入cocos2d-x的怀抱,欢迎大家和我交流,一起学习. 补充一点:我选择cocos2d-x绝不是简单地支持国产这么简单,cocos2d-x真的很强大.关于游

golang 小知识-持续更新中

Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func . 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性.但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算.从这一点看,Golang 的指针基本就是一种引用

iOS 开发学习资料整理(持续更新)

"如果说我看得比别人远些,那是因为我站在巨人们的肩膀上." ---牛顿 iOS及Mac开源项目和学习资料[超级全面] http://www.kancloud.cn/digest/ios-mac-study/84557 iOS 学习资料整理 https://segmentfault.com/a/1190000002473595#articleHeader16 iOS.mac开源项目及库 https://github.com/Tim9Liu9/TimLiu-iOS Swift语言 http

C++学习之STL(持续更新)

STL 标准模板库 标准模板库(Standard Template Library,缩写:STL)是一个C++软件库,  包括5个组件,分别是:算法.容器.迭代器,函数和适配器. 一:容器之初始化: 1.直接初始化一个空的容器: 2.用一个容器去初始化另一个容器: 3.指定容器的初始大小: 4.指定容器的初始大小和初始值: 5.用一对迭代器范围去初始化容器. 示例代码如下: 1 #include <iostream> 2 #include <string> 3 #include &

暑期英语学习(词组积累)【持续更新中】

说白了,写这文章纯粹是为了下个学期六级准备的,过了一个大学一年,英语啥的都忘记的差不多了,能做到的只有先把高中英语词组捡起来,然后认真准备考试,接下来就是准备考研了,俗话说ACM+英语一起抓,考试ACM都不误(emmm,本人xjb扯淡的说法,如有雷同,纯属巧合) 下面给出我每天的英语学习笔记贴一下: Day1: abandon sth./doing sth.放弃某事/做某事 abandon onself to sth.完全屈从于(某种感情或冲动) with abandon 放肆地 Why is

通过JQuery源码学习JS使用技巧——持续更新&#183;&#183;&#183;&#183;&#183;&#183;(7月31日)

欢迎转载,请注明出处!https://gii16.github.io/javascript/2016/07/29/learnfromjquery.html 欢迎交流,可去笔者博客园中评论:http://www.cnblogs.com/Gii16/p/5721020.html 笔者的老板是做文本挖掘研究的,所以研究JS这方面可以算是笔者的一个爱好吧.因为项目压力比较重,可能更新的会比较慢,还请各位看官海涵. 博客中研究的Jquery为3.1.0版本,下载自https://jquery.com/.