`
tcspecial
  • 浏览: 913849 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

golang

阅读更多

    Go作为新兴语言,很容易上手,天生支持并发,为多核CPU而生;接近C的执行效率;静态语言;支持垃圾回收。

 

一. 安装

下载go并设置环境变量

set GOROOT=D:\go          #sdk目录

set GOPATH=D:\gowork   #工作目录

set PATH=%GOROOT%\bin;%PATH%

 

二. Hello world

package main  // 包名
import "fmt"  // 导入Println函数,java/python也是用import关键字

func main() {   // { 必须与() 在同一行,否则会编译出错
  fmt.Println("hello world")  // 与java类似的println()
  fmt.Println(os.Args)  // 与C不同的是,命令行参数储存在os.Args中
}

 

编译:

$ go build -o hello.exe hello.go   #编译产生可执行文件

$ go run hello.go   #该命令会进行编译,链接,运行,没有产生中间文件和可执行文件,直接显示结果

注:Linux下go程序用静态方式链接,无.DYNAMIC段。

 

三. 开发工具

IDE工具:eclipse安装goclipse插件,LiteIDE,gogland等。

 

四. 基础语法

 

4.1 基础

package main   // 包名
import (
    "fmt"    
    "sub"   // 导入变量,需设置$GOPATH指定工程
)

// 变量定义
var a int
a = 100     // 变量赋值
b := 100    // := 操作符自动推导类型,声明并给变量赋值

// 指针
var p *int   // 变量声明,类型后置
var a int = 20
p = &a       // 取址,与C语言一致
fmt.Printf("addr:%#04x\n", p)

var brr [5]int	// 变量定义不使用会报错:brr declared and not used
var arr = [5]int{1, 2, 3, 4, 5}	// 数组
newarr := arr[:]   // [:]切片,引用arr数组
// 遍历数组
for i:=0; i<5; i++ {
  fmt.Printf("val:%d -- %d\n", i, arr[i]);
}

// 调用模块方法
sub.Substract(10, 20)   // 方法名大写作用域为public,小写为private无法外部调用

// 使用关键字go便能启动线程
go hello() 

// 匿名函数
b := func(x int,y int)(int,int) {
  return x+1,y+2	
}

b(2, 3)  // 打印3,5
 

4.2 结构体与反射

a. 结构体指针

 

// 定义结构体,go中无class关键字
type Person1 struct {
	Age int
	Name string
}

// 定义结构体指针
p := new(Person1)
p.Age = 20			// .操作,非c ->
p.Name = "kettas"
fmt.Printf("Person struct: %v\n", *p)   // 输出:Person struct: {20 kettas}
 

 

b. 结构体标签

结构体字段可添加标签,方便序列化显示。

 

import "encoding/json"

type Person2 struct {
	Age int  `bson:"_id" json:"age"`
	Name string `bson:"_name" json:"name"`
}

// 结构体标签
var p1 Person1 = Person1{18, "kettas"}
var p2 Person2 = Person2{20, "sun"}

b, _ := json.Marshal(p1);
fmt.Println("Person1: ", string(b));	// 输出:Person1:  {"Age":18,"Name":"kettas"}
b, _ = json.Marshal(p2);
fmt.Println("Person2: ", string(b));	// 输出:Person2:  {"age":20,"name":"sun"}
 

 

添加标签的字段编码会将字段转化成小写。struct 属性首字母大写解决外部调用的问题,标签解决与外部通过json交换数据时序列化问题。

 

c. 反射

go很容易实现反射

 

import "reflect"
// 反射测试
t := reflect.TypeOf(p2)
fmt.Printf("Type:%s Kind:%s\n", t.Name(), t.Kind())

// 遍历结构体属性
for i:=0; i<t.NumField(); i++ {
	field := t.Field(i)
	tag := field.Tag.Get("json")  

	fmt.Printf("%d %v(%v) tag:%v\n", i+1, field.Name,field.Type.Name(), tag)
}
  

 

// 输出

Type:Person2 Kind:struct

1 Age(int) tag:age

2 Name(string) tag:name

 

 

4.3 接口

/// http 服务器

// 定义接口
type Phone interface {
   call() int
}
// 为了实现接口,需先定义一个struct
type Hello struct {

}

// Hello成员方法ServerHTTP,实现http的 ServeHTTP()接口
func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello!")
}

func httpServ() {
	var h Hello
	http.ListenAndServe("localhost:4000", h)
}

 

4.3 管道

// 数组求和 
func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    // 计算结果发送到 channel c
    c <- sum
}

// 管道测试
func channeltest() {
	a := []int{1, 2, 7, 8, 10, 5}

	c := make(chan int)  // 建立无缓冲管道c

	go sum(a[:len(a)/2],c)   // go关键字启动goroutine,计算前半段10
	go sum(a[len(a)/2:],c)   // 计算后半段23
	x,y := <-c,<-c    // 堵塞接收管道c值,并赋值给x,y

	fmt.Println(x, y, x+y)  // 输出: 23 10 33
}

 

 

4.4 foreach语法

// go
for i,v := range a {}  // 可省略i,k,用_代替

// java
int a[] = {1,2,3,4};
for(int i : a){ }

// c++11, QT的foreach宏
for(auto i : a){ }
// python
for i in a:
    print i

 

 

 

 

 

分享到:
评论
3 楼 devilyard 2015-02-12  
tcspecial 写道
devilyard 写道
借地请教下个问题:
在执行运行命令的时候:
go run hello.go
会报以下这个错误:
go build command-line-arguments: D:\Program Files\go\pkg\tool\windows_amd64\6g.exe: open NUL: The system cannot find the file specified.

不知要怎么去解决?

上述错误提示没找到hello.go这个文件,切换到当前目录运行或加上绝对路径运行 go run e:/tools/hello.go 试试


试过在go目录下,在hello.go文件目录下,用go文件绝对路径,结果都是这样的错误
2 楼 tcspecial 2015-02-11  
devilyard 写道
借地请教下个问题:
在执行运行命令的时候:
go run hello.go
会报以下这个错误:
go build command-line-arguments: D:\Program Files\go\pkg\tool\windows_amd64\6g.exe: open NUL: The system cannot find the file specified.

不知要怎么去解决?

上述错误提示没找到hello.go这个文件,切换到当前目录运行或加上绝对路径运行 go run e:/tools/hello.go 试试
1 楼 devilyard 2015-02-09  
借地请教下个问题:
在执行运行命令的时候:
go run hello.go
会报以下这个错误:
go build command-line-arguments: D:\Program Files\go\pkg\tool\windows_amd64\6g.exe: open NUL: The system cannot find the file specified.

不知要怎么去解决?

相关推荐

    循环鼠标自动点击功能- Golang实现

    Golang,作为一种现代且高效的编程语言,因其强大的系统级编程能力和并发特性而受到广泛欢迎。在本文中,我们将深入探讨如何利用Golang实现这个功能,并了解相关的核心知识点。 首先,我们需要了解的是Golang的图形...

    golang环境配置及对接s3对象存储demo手册及源代码

    在本文中,我们将深入探讨如何配置Golang环境以及如何使用Golang对接Amazon S3对象存储。首先,让我们从安装Golang环境开始。 1. **安装Go环境** - **Windows**:在Windows操作系统上,你可以从Go的官方网站下载...

    golang语言,window系统下安装go语言包安装包

    golang语言,window系统下安装go语言包安装包 在 Windows 系统下安装 Go 语言包,可以按照以下步骤进行: 下载 Go 语言包 在官网 https://golang.org/dl/ 中下载适合你系统的Go语言包,选择 .msi 安装包下载即可。 ...

    golang.org/x包

    在Golang生态系统中,`golang.org/x`是一个非常重要的包集合,它包含了大量由Go官方维护和贡献的扩展库。这些包覆盖了各种功能,从网络编程到文本处理,为Go开发者提供了丰富的工具和解决方案。`golang.org/x`包系列...

    Pycharm Golang插件 jar

    标题中的"Pycharm Golang插件 jar"指的是在PyCharm这款流行的Python集成开发环境中安装Golang编程语言的扩展插件。PyCharm是由JetBrains公司开发的一款强大的IDE,它支持多种编程语言,包括Python、Go等。由于Golang...

    golang实现高性能IM单聊系统,UDP分发

    Golang,由于其并发模型、内存管理以及高效的网络库,成为了构建此类系统的热门选择。本篇将深入探讨如何利用Golang实现一个高性能的IM单聊系统,特别关注UDP(用户数据报协议)在其中的作用和分发策略。 首先,...

    Golang如何调用Python代码详解

    Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 go 中的 cgo 模块...

    web无插件播放rtsp流和配套golang 的rtsp转码服务

    Golang程序(可能就是goRtsp.exe)作为一个中间层,它接收RTSP流,对视频流进行处理(例如,转码、切片),然后提供一个Web友好的格式,如HLS,使Web前端可以轻松地通过AJAX或Fetch API请求并播放这些流。...

    golang.org/x

    `golang.org/x` 是 Go 语言生态系统中的一个特殊仓库,包含了由 Go 语言官方维护但并未包含在标准库中的各种模块和工具。这个仓库包含了众多实用的第三方组件,如网络编程库、数据库驱动、文本处理工具等。由于 `...

    golang中文手册_golang中文手册_goapiCHM_golang中文手册.chm_

    Go语言,又称Golang,是由Google开发的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它设计的目标是提高开发者的生产效率,同时保持系统级编程的性能。Go语言的设计受到了C、 Pascal、 Miranda和...

    golang使用bass库播放mp3文件

    在Golang中,如果你想要实现音频播放功能,特别是在处理MP3文件时,可以利用外部库,比如BASS库。BASS是一个广泛使用的音频处理库,它提供了强大的音频播放、流处理和格式转换功能。在Golang中使用BASS库通常需要...

    zinx —— golang —— MMO游戏服务器开发对应客户端

    《Zinx:Golang构建MMO游戏服务器及客户端解析》 在现代网络游戏开发中,后端服务器扮演着至关重要的角色,它们负责处理玩家交互、游戏逻辑、数据存储等一系列任务。Zinx是一个用Golang编写的轻量级网络框架,特别...

    钉钉企业应用Demo(golang版)

    【钉钉企业应用Demo(golang版)】是一个官方提供的示例项目,旨在帮助开发者了解如何使用Golang语言来构建钉钉企业微应用。这个Demo包含了完整的源代码,为二次开发提供了便利,使得开发者能够快速上手,理解并利用...

    用Golang语言实现LoRa数据传输,并对收集信息进行处理

    在本项目中,我们将探讨如何使用Golang(Go语言)来实现LoRa数据的发送与接收,并对收集到的数据进行处理。 首先,理解Golang的基础是必要的。Golang是一种静态类型、编译型、并发型、垃圾回收的编程语言,以其简洁...

    golang1.8 sdk安装包 windows

    Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C-like的编程语言。Go语言的设计目标是提高开发者的生产效率,同时保持程序运行的高效率和可移植性。在Windows平台上安装Go...

    Golang实现的HTTP客户端下载限速功能包.rar

    最近在学习Golang语言,中间遇到一个前辈指点,有一个学习原则:Learning By Doing。跟我之前学习Java的经验高度契合。在前一段时间学习洼坑中挣扎了好几天,差点就忘记这个重要的成功经验。 那么那什么来做练习呢...

    GOLANG语言实现SOCKET通讯粘包问题解决示例

    在GOLANG中,解决这个问题需要对网络编程原理和GOLANG的网络库有深入理解。本文将详细介绍如何使用GOLANG来解决SOCKET通信中的粘包问题。 首先,理解粘包产生的原因。TCP协议是基于流的,没有明确的数据边界。它会...

    国密加密 sm4 sm2 java python golang

    国密加密解密 sm4 sm2 的java python golang实现,java和python,golang的有一定区别,需要修改点东西才可以实现。 SM4Key = ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 16)) ...

    golang 中文离线文档 go文档中文

    Go语言,又称Golang,是Google在2009年发布的一种开源编程语言,它旨在提高开发者的生产力和代码的可维护性。Go语言的设计灵感来源于C语言,但同时引入了垃圾回收、类型安全和并发编程等现代特性,使其成为构建高效...

Global site tag (gtag.js) - Google Analytics