开篇先来个Go语言的吉祥物-金花鼠Gordon。

golang是谷歌2009年发布的开源编程语言,截止目前go的release版本已经到了1.10。go语言的开发人员都是计算机界大神一般的存在:

  • Thompson:1983年图灵奖(Turing Award)和1998年美国国家技术奖(National Medal of Technology)得主。他与Dennis Ritchie是Unix的原创者。Thompson也发明了后来衍生出C语言的B程序语言。
  • Pike:曾是贝尔实验室(Bell Labs)的Unix团队,和Plan 9操作系统计划的成员。他与Thompson共事多年,并共创出广泛使用的UTF-8字元编码。
  • Robert Griesemer:曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。
  • Russ Cox:Plan 9开发者
  • Ian Taylor:曾改善已广泛使用之开源码编译器GCC

主要的开发者:

肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx发明人,B语言作者(C语言前身),还做飞行员,后来被谷歌挖走。
    罗布.派克(Rob Pike):Unix团队和Plan 9操作系统计划的成员,与Ken老爷子共事多年,并共创出广泛使用的UTF-8 字元编码。
    罗伯特.格里泽默(Robert Griesemer):曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。
    

go语言目前可以达到c/c++80%的性能,远快于c/c++的编译速度,目前很火的开源软件docker、kubernetes、lxd等软件都是使用go语言编写的,而且2016年Go语言被评为年度编程语言,可见go的应用场景非同一般。

Go语言的特点

Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发速度和易维护性,有人形容Go语言:Go = C + Python , 说明Go语言既有C静态语言程序的运行速度,又能达到Python动态语言的快速开发。
Go语言有以下特性:

1.自动垃圾回收

C/C++最头疼的就是指针问题,一不小心就野指针了或者又越界了。在Go语言里再也不用担心,也不用考虑delete或者free,系统自动会回收。

野指针:指向内存被释放的内存或者没有访问权限的内存的指针(非法访问)。野指针指向一个不确定的地址空间,或者指向的是一个确定的地址空间的,但引用空间的结果却是不可预知的。

与空指针不同,野指针无法通过简单地判断是否为 NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

野指针

2.函数可以返回多个值

这个很神奇,大多数语言只能返回一个值,Go语言可以返回多个值。这个功能使得开发者再不用绞尽脑汁的想到底怎么返回值的设计,也不用为了传值专门定义一个结构体。

package main //必须

import "fmt"

func myfunc02() (a, b, c int) {
a, b, c = , ,
return
} func main() {
//函数调用
a, b, c := myfunc02()
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}

多个返回值

3.并发编程

Go语言天然并发,只需要关键字“go”就可以让函数并发执行,使得并发编程变得更为简单,这也是Go语言最大的优势。

golang支持多变量同时定义:

package main

import (
"fmt"
)
func main() {
//演示如何一次性声明多个变量
//方式一
var n1, n2, n3 int
fmt.Println("n1=", n1, "n2=", n2, "n3=", n3)
//方式二
var m1 , name, m2 = , "tom",
fmt.Println("m1=", m1, "name=", name, "m2=", m2)
//方式三
a1, char, a2 := , "jack",
fmt.Println("a1=", a1, "char=", char, "a2=", a2)
//soeasy!
}

数据类型的相互转换:

golang和java/c 不同 ,GO在不同的类型的变量之间赋值是需要显示转换,也就是说golang中的数据类型不能自动转换。
表达式 T(v)将值v转换为类型T
T:就是数据类型,比如 int32, int64, float32等等
v:就是需要转换的变量
package main import (
"fmt"
_"reflect"
)
func main() {
var(
i int32 =
n1 float32 = float32(i)
n2 int8 = int8(i)
n3 int64 = int64(i) )
fmt.Printf("i=%v n1=%v n2=%v n3=%v\n", i, n1, n2, n3)
// fmt.Println(reflect.TypeOf(i),
// reflect.TypeOf(n1),
// reflect.TypeOf(n2),
// reflect.TypeOf(n3))
    

   fmt.Printf("%T %T %T %T", i, n1, n2, n3)
}
            

结果:

溢出处理:
func main() {
var(
i int32 =
n1 float32 = float32(i)
n2 int8 = int8(i)
n3 int64 = int64(i) )
fmt.Printf("i=%v n1=%v n2=%v n3=%v\n", i, n1, n2, n3)
//fmt.Println(reflect.TypeOf(i), reflect.TypeOf(n1), reflect.TypeOf(n2), reflect.TypeOf(n3))
fmt.Printf("%T %T %T %T", i, n1, n2, n3)

如下:int32 转成 int8(-128 --  127),编译时不会出错,只是转换的结果是按溢出

处理,和我们开始想象的结果不一样,因此在住转换是,需要考虑范围问题!

三元运算:

在一些语言中:
var int a =
var int b =
a = a + b
a = a - b
b = a - b
官方FAQ的说明在这里:
http://golang.org/doc/faq#Does_Go_have_a_ternary_form
官方FAQ推荐的做法是用 if 代替:
if expr {
n = trueVal
} else {
n = falseVal
}
不过用 if 的问题是变量 n 有作用域问题. 我们需要在 if 之前先定义变量 n,这样才可以在 if 语句之后使用变量 n。 var n int
if expr {
n = trueVal
} else {
n = falseVal
}
println(n) 本来一个简单的 n := expr? trueVal: falseVal 就能够表达的问题,变的复杂了很多。 这和Go所追求的简单思路是有冲突的。 类似的有 max/min 等函数。因为这类函数使用频度比较高,在很多pkg的内部都定义了私有的实现。 func max(a, b int) int {
if a < b {
return b
}
return a
}

golang中的三元运算

golang支持在if语句中设置一个变量

if a :=  ; a > {
fmt.Println("IG")
}

if

字符串遍历:

package main
import(
"fmt"
)
//字符串遍历方式--传统方式
func main() {
//一般的遍历方式
var str string = "hello,world"
  //str2 := []rune(str)  把str转成 []rune(切片)
for i := ; i < len(str); i++{
fmt.Printf("%c\n", str[i])
  //  fmt.Printf("%c", str2[i])
}
//for-range遍历方式
str = "adc*ok"
for index, val := range str {
fmt.Printf("index=%d, val=%c \n", index, val)
}
//对应for-range遍历方式而言,是按照字符来遍历的,就不是按照字节来遍历的!
}

如何用for循环实现while/do...while

//golang)没有do...while/while
//while循环的实现
func main() {
var i int =
for {
if i > { ///循环条件
break //跳出循环
}
fmt.Println("i=", i)
i++ //循环迭代
}
fmt.Println(i)
}
//do...while循环的实现
func main() {
var j int = for {
fmt.Println("j=", j)
j++
if j > {
break
}
fmt.Println(i) }
}

break指定标签:

//break指定标签
lable2:
for i := ; i < ; i++{
  lable1:
for j := ; j < ; j++{
if j == {
// break //break 默认跳出最近的for循环
// break lable1
break lable2 // j = 0 j = 1
}
fmt.Println("j = ", j)
}
}
break默认跳出最近的for循环
break 后面可以有指定的标签,跳出标签的对面for循环

将数字输出为unicode码值:

package main

import (
"fmt"
)
func main() { var(
c1 =
c2 =
c3 =
c4 =
) fmt.Printf("%c", c1)
fmt.Printf("%c", c2)
fmt.Printf("%c", c3)
fmt.Printf("%c", c4)
}

结果:

栈区:

//内存四区模型
//低地址 代码区:计算机指令 数据区:{
初始化数据区
未初始化数据区
常量区
} 堆区:一个很大的空间在使用是开辟空间结束的释放 栈区:存放函数信息函数内部定义的常量
//高地址

内存四区

golang(一)的更多相关文章

  1. Golang, 以17个简短代码片段,切底弄懂 channel 基础

    (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...

  2. 说说Golang的使用心得

    13年上半年接触了Golang,对Golang十分喜爱.现在是2015年,离春节还有几天,从开始学习到现在的一年半时间里,前前后后也用Golang写了些代码,其中包括业余时间的,也有产品项目中的.一直 ...

  3. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  4. Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩

    目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...

  5. golang struct扩展函数参数命名警告

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...

  6. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  7. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  8. golang的安装

    整理了一下,网上关于golang的安装有三种方式(注明一下,我的环境为CentOS-6.x, 64bit) 方式一:yum安装(最简单) rpm -Uvh http://dl.fedoraprojec ...

  9. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  10. golang 使用 iota

    iota是golang语言的常量计数器,只能在常量的表达式中使用. iota在const关键字出现时将被重置为0(const内部的第一行之前),const中每新增一行常量声明将使iota计数一次(io ...

随机推荐

  1. Navicat自动断开连接处理方式

    问题描述 使用Navicat连接mysql后,如果一段时间不操作,那么会再次操作时会提示无响应,每次都这样确实折磨人,大大降低了工作效率! 问题解决 关闭连接→右键连接→连接属性 将上述心跳时间设置为 ...

  2. js逆向分析之acorn和escodegen的使用

    替换之前的d形如 d("77696669") 执行代码 const fs = require('fs'); const acorn = require('acorn'); cons ...

  3. Hyper-V中安装CentOS7设置静态ip并且可以连接外网

    https://blog.csdn.net/xj19940904/article/details/89165002 https://blog.csdn.net/u011598235/article/d ...

  4. 强烈建议为你的Android项目加上 largeHeap 属性

    小内存机器使用“微信”时,看视频经常崩溃(out of memory) ,小内存机器有时候明明内存还很多,却还是抛出“内存不够”,应该就是每个APP能用“堆大小”的限制. 如上图,Android项目的 ...

  5. 类中嵌套定义指向自身的引用(C、C++、C#)或指针(C、C++)

    在定义类的时候,类中可以嵌套定义指向自身的引用(C.C++.C#)或指针(C.C++).详见代码: Node类: using System; using System.Collections.Gene ...

  6. SonarQube7.4安装和使用

    声明 本文转自:https://www.jianshu.com/p/dd4a4bc59fc3?from=singlemessage 正文 近期比较关注代码的检测,之前由于用的findbugs,因此没有 ...

  7. Centos 7.x卸载ibus黑屏修复及fcitx搜狗拼音安装方法

    ibus黑屏修复 百度出来的fcitx安装方法,都要卸载ibus,如果没有注意同时卸载掉的依赖包的话,gnome桌面中的一些关键库也没被卸载. 修复方法很简单,重新安装Gnome sudo yum - ...

  8. Set JAVA_HOME in windows cmd(在windows 命令行中修改JAVA_HOME)

    set JAVA_HOME=jrepathset PATH=%JAVA_HOME%\bin;%PATH%注意这里没有引号.这样就不需要在我的电脑属性中修改java_home了,以及重启命令行了.对于程 ...

  9. android ------ AndroidX的 Tablayout(com.google.android.material.tabs.TabLayout) 的使用

    前面呢,有写过TabLayout的博客,最近开发用到了AndroidX来解决前面的问题,不要工具类设置下划线的问题了,来总结一下 Android--------TabLayout实现新闻客户端顶部导航 ...

  10. PowerMock框架讲解及使用

    为什么要使用PowerMock 现如今比较流行的Mock工具如jMock .EasyMock .Mockito等都有一个共同的缺点:不能mock静态.final.私有方法等.而PowerMock能够完 ...