Go语言中文网 为您找到相关结果 199

golang中结构体的初始化方法(new方法)

自定义一个结构体 type Rect struct { x, y float64 width, height float64 } 初始化方法: rect1 := new(Rect) rect2 := &Rect{} rect3 := &Rect{0, 0, 100, 200} rect4 := &Rect{width:100, height:200} 注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符.而如果使用方法 a := Rect{} 则表示这个是一个Rect{}类型.两者是不一样的.参考代码: func main() { rect1 := &Rect{0, 0, 100, 200} rect1.x = 10 a := Rect{} a.x = ...阅读全文

博文 2015-10-14 17:00:03 徐学良

Go 方法、接口

在 Go 中,类型可以定义接收此类型的函数,即方法。每个类型都有接口,意味着对那个类型定义了方法集合。 下面定义了结构体类型 S 以及它的两个方法: type S struct { i int } func (p *S) Get() int { return p.i } func (p *S) Put(v int) { p.i = v } 方法 方法就是有接收者的函数。 可以在除了非本地类型(包括内建类型,比如 int)的任意类型上定义方法。然而可以为内建类型定义别名,然后就可以为别名定义方法。如 type Foo int // 为 int 定义别名 Foo func (self Foo) Emit() { fmt.Printf("%v", self) } 接口 接口定义为一个方法的集合。方...阅读全文

golang枚举类型 - iota用法拾遗

在c#、java等高级语言中,经常会用到枚举类型来表示状态等。在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手。 1、枚举类型定义 从百度百科查询解释如下:http://baike.baidu.com/link?url=Lrq57-YIZJ35grERvdg2kh7lfGfxvvLCVsNBMAqjBUOQX3CJUYnJp-9oZ2-rf3JGMqL3e4RbnSRQWs_5nmaI6K 枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构造数据类型,而在C语言等计算机编程语言中是一种构造数据类型。它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。 枚举可以根据Integer、Long、Short或Byte...阅读全文

GoLang之对象

GoLang之面向对象 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承、虚函数、构造函数和析构函数、隐藏的this指针等。 类方法 在Go语言中,可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法。 如下面的这个例子,定义了一个新类型Integer,它和int一样,只是为它内置的int类型增加了个新方法Less() type Integer int func (a Integer) Less(b Integer) bool { return a < b } func main() { var a Integer = 1 if a.Less(2) { fmt.Println("less then 2") } } 可以看出,Go语言在自定义类型的对象中没有C++/Java那种...阅读全文

博文 2015-05-13 03:00:05 chenny7

Go 系列教程 —— 19. 接口(二)

欢迎来到 Golang 系列教程的第 19 个教程。接口共有两个教程,这是我们第二个教程。如果你还没有阅读前面的教程,请你阅读[接口(一)](https://studygolang.com/articles/12266)。 ### 实现接口:指针接受者与值接受者 在[接口(一)](https://studygolang.com/articles/12266)上的所有示例中,我们都是使用值接受者(Value Receiver)来实现接口的。我们同样可以使用指针接受者(Pointer Receiver)来实现接口。只不过在用指针接受者实现接口时,还有一些细节需要注意。我们通过下面的代码来理解吧。 ```go package main import "fmt" type Describer int...阅读全文

博文 2018-02-01 15:44:37 heyulong

【翻译】go是面向对象语言吗?

文:http://spf13.com/post/is-go-object-oriented 前言 为了真正理解面向对象的含义,我们需要回顾一下这个概念的起源。第一个面向对象语言-simula问世于19世纪60年代。它引入了对象(object)、类(class)、继承(inheritance)、子类(subclass)、虚方法(virtual method)、协程(coroutine)等概念。然而simula最重要的贡献可能是它引入颠覆性的思想——将数据和逻辑完全分离。 你可能不熟悉simula语言,但你肯定熟悉Java, C++, C# & Smalltalk中的一种,这些语言深受simula的影响,当然这些语言又同时影响着现今几乎所有的高级语言如:Objective C, Python, ...阅读全文

博文 2015-06-27 06:00:01 elernino

关于go接口的一些说明

什么是接口 接口是golang最重要的特性之一,在Go中,接口interface其实和其他语言的接口意思没什么区别。interface理解其为一种类型的规范或者约定。一种类型是不是“实现”了一个接口呢?就看这种类型是不是实现了接口中定义的所有方法。接⼝是一个或多个方法签名的集合,任何非接口类型只要拥有与之对应的全部方法实现 (包括相同的名称、参数列表以及返回值。),就表示它"实现" 了该接口,无需显式在该类型上添加接口声明。此种方式又被称作Duck Type。 接口的实例化 接口是可被实例化的类型,而不仅仅是语言上的约束规范。当我们创建接口变量时,将会为其分配内存,并将赋值给它的对象拷贝存储。将对象赋值给接口变量时,会发生值拷贝行为。没错,接口内部存储的是指向这个复制品的指针。而且我们无法修...阅读全文

博文 2014-10-04 19:26:23 壬癸甲乙

golang笔记:unsupported driver -> Scan pair: -> *string

golang里,操作mysql数据库,使用查询语句的时候,一般的写法 rows, err := db.Query("SELECT name from table) if err != nil { return } for rows.Next() { var name string err = rows.Scan(&name) if err != nil { return } } 当查出来的字段有NULL的时候,就会报这样的错误unsupported driver -> Scan pair: -> *string 这又是由于Go语言对数据类型的严格限制。name的类型是string,所以只能接受string类型的值,而此处nil是为空的指针类型。最佳解决办法是——插入记录的时候不要...阅读全文

Notepad++配置Go语言语法高亮

前提是已经安装并配置好了Go语言环境,这里不再赘述。 1.Go语言支持包 如果在Go安装目录中misc文件夹中有notepadplus文件夹,其中有userDefineLang_Go.xml(网上有的写是userDefineLang.xml,我没有见到)这个文件,则直接使用,没有的话就从下面这个地址下载。下载到后,解压会得到两个xml,一个是userDefineLang_Go.xml,一个是go.xml。 http://notepad-plus.sourceforge.net/commun/userDefinedLang/go.zip 2.配置Notepad++ 1).打开userDefineLang_Go.xml,把文件开头和结尾的注释...阅读全文

博文 2015-06-17 23:00:28 change_from_now

Go语言中包的风格指南

# Go语言中包的风格指南 Go 语言也有自己的命名与代码组织规则。漂亮的代码,布局清晰、易读易懂,就像是设计严谨的 API 一样。拿到代码,用户首先看到和接触的就是布局、命名还有包的结构。 这篇文章不是为了给大家设立硬性的规定,而是用实践引导大家形成自己的规则。因为具体问题要具体分析,通过自己的判断才能挑选出最恰当的规则。 ## 包 所有的 Go 代码都是以包的形式组织起来的。Go 中的包就是目录或文件夹里面包括一个或者多个以 `.go` 结尾的文件。用目录或文件夹这样的方式来管理代码,与电脑管理目录或文件夹是一样一样的。 所有的 Go 代码都是放在包里的,且只能是通过包来进行访问。理解并且建立良好的包的习惯,可以帮助写出高效的代码。 * * * ## 包的组织 我们先聊聊如何组织 Go ...阅读全文

博文 2017-12-04 07:08:17 wi-cuckoo

notepad++支持go语言高亮与go语言插件

一、notepad++安装go语言插件 notepad++是十分流行的文本编辑器,而它拥有强大的功能,比如它可以支持go语言。当然这需要go语言相应的插件。 打开notepad++后,选择插件选项,在插件下选Plugin Manager-->Show Plugin Manager-->在Plugin中选择GOnpp选Install; 二、notepad++支持go语言高亮 1.在Go的安装目录下,找到misc文件夹,打开notepadplus文件夹,编辑userDefineLang.xml文件,将文件中的的注释去掉,注意是去掉注释,不是把它俩去掉。 2.将该目录(misc/notepadplus)下的go.xml复制到notepad++...阅读全文

深入Go语言 - 2 常量、变量、动态类型和静态类型

目录 [−] 常量变量变量声明简化静态类型和动态类型 本文介绍Go语言的常量和变量的语言细节。 常量 只有数值类型和字符串类型才可以作为常量。 数值类型包括 布尔类型、rune类型、各种整型、浮点类型、复数。 常量值既可以是数值类型的字面量,也可以是字符串字面量,以及常量的等价形式, 如: 常量表达式, 如 4 * 5 转换结果是常量, 如 int(10.0) 内建函数的返回值, 如unsafe.Sizeof、cap、len 复数、实数和虚数的应用 true和false赋值给bool类型的常量 内建的 iota 用变量赋值给常量是不允许的: 12var vs = "hello world"const s = vs //错误 常量的命名还是遵循前一篇文章的介绍,所有你看到一些"奇怪"的常量名不...阅读全文

博文 2017-02-08 12:53:38 smallnest

理解 Go 语言中的方法和接收者

0x01 前言 Go 语言的语法实在有些不一样,与其它面向对象语言相比,Go 的方法似乎有些晦涩。 0x02 方法的定义 在 Go 语言里,方法和函数只差了一个,那就是方法在 func 和标识符之间多了一个参数。 type user struct { name string, email string, } //这是函数的定义 func notify(email string) { fmt.Println("Email is %s", email) } //这是方法的定义 func (u user) notify(email string) { fmt.Println("Email is %d", email) } 我们可以看到,方法是在 func 和 notify 之间多了一个 user ...阅读全文

博文 2017-06-03 09:05:56 daryl

在windows/linux下搭建go开发环境

本篇博客主要是介绍在 windows 下搭建 go 开发环境,因为 linux 下相对 windows 甚至更方便一些 (really?);如果你是关心的是 linux 的安装,直接跳到 linux 下安装 go 吧。废话不多说,去 go 的官网,下载 go 的 windows 版本。有 zip 文件下载,直接解压缩使用,不用选择 msi 安装。或是你直接到 golang:windows下安装go。 说点废话。me 为嘛选择 zip 而不是 msi 呢?相对来说,me 更喜欢绿色软件,解压之后基本就可以使用了,不过有个缺点就是,us 需要自己注册环境变量(相信对于程序猿来说介太 easy 了)。msi/exe 的工作之一就是解压缩,另一些就是自动添加某些环境变量,还可能就是往注册表中写入一些...阅读全文

博文 2014-10-24 11:38:51 陆仁贾

空结构体

空结构体 这篇文章探讨了我喜欢的Go数据类型,空结构体。 空结构体是一个没有field的结构体类型。这里有几个例子,有命名和匿名形式: type Q struct{} var q struct{} 所以,如果空结构体没有成员,我们该怎么使用它? width 在深入研究空结构体本身前,我想简要讨论下width。 术语width来自于gc编译器,尽管它的词源可能追溯到几十年年。 width描述了类型实例占用的字节数目。因为一个进程的地址空间是一维的,我认为witdh比size更合适。 width一个类型的属性。因为Go程序的每个值都有一个类型,值类型定义了它的witdh,一般是8比特的倍数。 我们可以发现任何值的宽度,它的类型的width使用unsafe.Sizeof()函数: var s st...阅读全文

golang内置类型和函数

/* 内置类型 值类型: bool int(32 or 64), int8, int16, int32, int64 uint(32 or 64), uint8(byte), uint16, uint32, uint64 float32, float64 string complex64, complex128 array -- 固定长度的数组 引用类型:(指针类型) slice -- 序列数组(最常用) map -- 映射 chan -- 管道 内置函数 append -- 把东西增加到slice里面,返回修改后的slice close -- 关闭channel delete -- 从map中删除key对应的value panic -- 停止常规的goroutine recover -- ...阅读全文

博文 2014-10-04 19:27:01 Robin3D

30分钟上手GO语言--方法和接口

方法和接口 这章讲如何为类型定义方法;如何定义接口;以及如何将所有内容贯通起来。 方法:Go 没有类,但可以在结构体类型上定义方法。 package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} fmt.Println(v.Abs()) } 可以对包中的 任意 类型定义任意方法,而不仅仅是针对结构体。但是,不能对来自其他包的类型或基础类型定义方法...阅读全文

golang type关键字使用

type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。搞清楚type的使用,就容易理解go语言中的核心概念struct、interface、函数等的使用。以下我用例子代码总结描述,请特别留意代码中的注释。//1、定义结构体 //结构体定义 type person struct { name string //注意后面不能有逗号 age int } func main() { //结构体初始化 p := person{ name: "taozs", //注意后面要加逗号 age: 18, //或者下面的}提到这儿来可以省略逗号 } fmt.Println(p.name) } //初始化字段不一定要全部指定,比如下面也是可以的,name默认取长度为0的空...阅读全文

博文 2018-12-24 18:31:33 u010008759

golang中json.Number妙用

最近跟某斯调试一个API接口,接口返回数据是json格式 ,按文档描述是一个整型数据,于是定义如下 type Data struct { Api int `json:"api"` } 在入参相同的情况下,第一次调用,得到的结果是: {"api":1} 然而第二次调用,得到结果却是: {"api":"1"} 与对方开发人员沟通后发现这是一个bug,由于流程问题,没办法立即修改上线,想想还是我做兼容比较好,效果是既能解析于{"api":1},也能够解析{"api":"1"},于是我想到了json.Number,Number类型定义如下 The representation of numbers is similar to that used in most programming languag...阅读全文

博文 2018-07-17 23:34:46 wu_sphinx

Golang全面深入系列之 Error

What you are wasting today is tomorrow for those who died yesterday; what you hate now is the future you can not go back. 你所浪费的今天是昨天死去的人奢望的明天; 你所厌恶的现在是未来的你回不去的曾经。 Go errors简介 在Go的惯用法中,返回值不是整型等常用返回值类型,而是用了一个 error(interface类型)。 // The error built-in interface type is the conventional interface for // representing an error condition, with the nil val...阅读全文

博文 2018-03-19 17:33:04 90design

golang 接口 参数

conn, err = ln.Accept() go handleConnection(conn) 看到这里我曾经有个疑问,为什么不是 handleConnection(&conn) ? package main import ( "fmt" ) type Interface interface { say() string } type Object struct { } func (this *Object) say() string { return "hello" } func do(i Interface) string { return i.say() } func main() { o := Object{} fmt.Println(do(&o)) fmt.Printf("CC...阅读全文

博文 2014-10-04 19:27:01 咖啡伴侣

王垠批评 golang

对 Go 语言的综合评价 语法: 类型定义需要很多 “眼球 parse” 语法: switch 语法为了显得简单, 把case 和cond 合二为一了, 从而造成混淆 工具链: 还比较缺乏, 工具不成熟, 有bug, 没有IDE好用 工具链: package比较混乱 内存管理: GC是简单的 mark-and-sweep, 还比较原始 没有”generics” 多返回值设计没有编译器检查机制, 完全需要调用者关心, 使用起来麻烦 基于接口的OO设计使用起来非常累赘麻烦 goroutine并不是革命性的东西, 很多需要都可以添加 defer现阶段被大量滥用 库代码中string的元素是byte, 具体使用需要先转换成字可以遍历的对象才能遍历里面的字符 王垠总结: 没有python优雅, 没有j...阅读全文

博文 2017-07-12 04:06:27 程序员小张

cgo 随笔(golang)

结构体应用 //结构体定义如下 // test.h struct test { int a; int b; int c; } 在golang中的调用如下: 1 package name 2 3 4 import "C" //这个是必须要包含的,如果要调用cgo 5 6 // #cgo linux CFLAGS: -l. //这个是声明查找头文件的位置 是在本目录 7 // #include "test.h" 8 9 10 func testt() { 11 var vt C.struct_test //这个是结构体的调用方法 12 .... 13 ..... 14 } 15 16 17 1...阅读全文

博文 2014-10-04 19:25:56 sn-dnv-aps

介绍一下Json的Number

Json的使用基本没有什么难度,就拿Golang来说,直接来个encoding/json包里的func Marshal(v interface{}) ([]byte, error)和func Unmarshal(data []byte, v interface{}) error就能对Json进行编解码了。具体的文件就是采用反射的方法,可以参考我之前的文章『Golang通过反射实现结构体转成JSON数据』。 现在问题来了,如下的map需要大家是如何解析的? {"10000000000":10000000000,"111":1} 如果直接定义一个map来解析,定义成map[string]int64,我们是肯定可以解析成功的,解析的时候会将数据转换为我们需要的数据类型。那么问题来了:如果把类型定义...阅读全文

golang的template实现自定义的循环

代码写func genlist(n string) []string { num, _ := strconv.Atoi(n) ret := make([]string, num) for i := 0; i < num; i++ { ret[i] = strconv.Itoa(i) } return ret } func output(src string, des string) bool { file, err := os.Create(des) if err != nil { fmt.Println(err) return false } t := template.New("text") if err != nil { fmt.Println(err) return false } ...阅读全文

博文 2016-03-21 02:00:11 esrrhs

golang 方法内部定义子方法及调用

package main import ( "fmt" "reflect" ) func out(ch chan int) { <-ch fmt.Println(" test out func define") } func main() { //-----------------外部方法-------------------- ch := make(chan int) go out(ch) ch <- 1 //-----------------内部方法-------------------- cha := make(chan int) var c = func(cha chan int) { <-cha fmt.Println(" test iner func define") } go ...阅读全文

博文 2015-05-06 03:00:00 rojas

go 类型系统(二)

pre-declared type (预声明类型) golang 默认的有几个预声明类型:boole,num,string type. 这些预声明类型被用来构造其他的类型。 type literal(字面量类型) 由其他预声明类型组合而成(没有使用type 关键字定义),array,struct,pointer,slice,map,channel,function,interface [2]int ,[ ] int , chan int , map[string] string ,* int 注意:type literal 中的struct,interface 特指匿名的类型,没有使用type包装, 命名类型和非命名类型 named type : 一个类型通过一个标识符标示就是命类型名字(t...阅读全文

golang sort 排序

package main import ( "fmt" "sort" ) func main() { d := []int{5, 2, 6, 3, 1, 4} // unsorted sort.Sort(sort.IntSlice(d)) fmt.Println(d) // Output:[1 2 3 4 5 6] a := []float64{5.5, 2.2, 6.6, 3.3, 1.1, 4.4} sort.Sort(sort.Float64Slice(a)) fmt.Println(a) // Output:[1.1 2.2 3.3 4.4 5.5 6.6] s := []string{"PHP", "golang", "python", "C", "Objective-C"} so...阅读全文

博文 2015-06-17 20:02:20 yatere

cgo编译问题,Undefined symbols

我写了个【add.c】文件里面写着 ```c #include "add.h" #define b 9 int add(int a){ return a+b; } ``` 【add.h】里面定义了函数 int add(int a); 然后我在cgo_test.go里里面这样写到 ```go package main import( /* #include "add.h" */ "C" "fmt" ) func main() { fmt.Println(C.add(5)) } ``` 编译的时候就出现 Undefined symbols for architecture x86_64: ...阅读全文

《Go语言编程》[4.4 并发通信]代码thread.c和thread.go错误

thread.c程序pthread_create函数第三个参数为线程函数的起始地址,文中并无add函数,源代码如下: thread.c编译时会报未声明错误: 根据语境推测应该是count,替换如下: 重新编译,gcc编译时在最后加参数-lpthread,否则编译报对 pthread_create和pthread_join未定义的引用如下: 应当是行末最后加入-lpthread编译,正确编译命令: gcc -lpthread thread.c -o main thread.go程序无z变量,应当是counter: 本文出自 “松松” 博客,请务必保留此出处http://dongsong.blog.51cto.com/916653/159561...阅读全文

博文 2014-12-25 08:00:01 董松

Python类的实例属性详解

  实例属性   1.类被实例化后才会具有的属性   2.一般在_init_()方法中创建并初始化   3.直接使用即定义:self.<属性名>   4.引用方法:self.<属性名>   5.self用来表示类的实例的   例如:在类TestCss当中定义实例属性   class TestCss:   cssa = 'class-attribe'   def __init__(self):   self.a = 0   self.b = 10   def info(self):   print('a:',self.a,'b:',self.b)   if __name__ == '__main__': ...阅读全文

从例子中学习 go 语言 —— 方法、接口以及并发

本篇本来是接着上一篇的,本篇是 go 的关于方法、接口以及并发的一些例子;上一篇是关于数据结构以及指针的,上上一篇是关于基本语法以及结构的,基本类型、函数、for、if 等等。 方法: package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func main() { v := &Vertex{3, 4} fmt.Println(v.Abs()) //fmt.Println((*v).Abs()) // ok,2 } 1). 所谓的“方法”(method) —— ...阅读全文

博文 2014-10-24 11:38:51 陆仁贾

go语言 string数据类型格式

在go语言里面定义字符串如下: var ss string = "12345" 对于一个熟悉C/C++的程序员来说,马上就会想到这个string是一个什么内容,占多大空间,内存如何分配等,下面我们来分析这个问题。 go语言的string是一种数据类型,这个数据类型占用16字节空间,前8字节是一个指针,指向字符串值的地址,后八个字节是一个整数,标识字符串的长度;注意go语言的字符串内部并不以'\0'作为结尾,而是通过一个长度域来表示字符串的长度。 type mystr struct { strbuf uintptr; strlen uint64; } 上述就是string的类型定义。下面我们通过代码来验证这个问题: package main import ( "fmt" "unsafe" //...阅读全文