文档章节

golang 知识点

陈好
 陈好
发布于 2013/05/29 15:50
字数 1111
阅读 304
收藏 1
点赞 0
评论 0

1.//.(type),比如 username.(string)

&:类型断言,是interface{}转string

2..//判断网页中checkbox是否被选中

&:为checkbox添加value属性,后台判断r.FormValue(checkbox的name属性) != "",表示被选中

3.//直接输出HTML

string类型go的template处理时会自动做escape处理,用template.HTML类型就不会了

values := map[string]template.HTML{"html": template.HTML("<br/>")}

4.//slice赋值

var a = []string{
	"1",
	"2",
}

func Do() (c []string) {
       b := a
       log.Print(len(b), cap(b))//2,2   len = cap 了,append后将创建新的底层数组
       b = append(b, "3")
       log.Print(len(b), cap(b))
       log.Print(b, a)
       return b
}

func Do1() (c []string) {
	b := a //这是引用,b,a指向同一个底层array
	log.Print(b, a)
	b[1] = "3" //a同时变化
	log.Print(b, a)
	return b
}
//slice赋值
func Do2() (c []string) {
	c = make([]string, 2) //要先声明否则下面赋值时会越界
	copy(c, a)
	log.Print(c, a)
	c[1] = "2"
	log.Print(c, a)
	return c
}

slice具体使用可参考http://blog.golang.org/go-slices-usage-and-internals

//select问题

问题1:

messages := make(chan string)
signals := make(chan bool)
select {
case msg := <-messages:
    fmt.Println("received message", msg)
default:
    fmt.Println("no message received")
}
msg := "hi"
select {
case messages <- msg:
    fmt.Println("sent message", msg)
default:
    fmt.Println("no message sent")
}
select {
case msg := <-messages:
    fmt.Println("received message", msg)
case sig := <-signals:
    fmt.Println("received signal", sig)
default:
    fmt.Println("no activity")
}
不是应该输出:
no message received
sent messagehi
received messagehi
怎么会是:
no message received
no message sent
no activity

原因:

默认通道是 无缓冲 的,这意味着只有在对应的接收(<- chan)通道准备好接收时,才允许进行发送(chan <-),即非缓冲通道,没有接收者会阻塞.你可能会问第一个select不是给第二个select提供接受者了吗?其实:

第一个 select 里面的 case msg := <-messages 虽然尝试执行,但是由于当时 messages 里面没有数据,所以最后执行的是 default,也就是<- 操作就没有执行,messages 又没有 buffer,所以第二个 select 执行的时候已经没有 goroutine 在接受 messages 里面的数据了,自然没法 send 数据。

第一个 select 可以来理解为:

if messages has data to be read {
    msg := <- messages
    // execute code after the case statement
} else {
    // default
}
当然,上面的代码第一行和第二行是原子的执行的。如果messages当时没有数据,又可以不 block,那么就相当于messages什么也没变化。

ps:

channel的receiver和sender需在两个不同的goroutine里,否则会应为阻塞,出现deadlock.

问题2:

ch := make(chan int, 1)
for {
    select {
    case ch <- 0:
    case ch <- 1:
    }
    i := <-ch
    fmt.Println("value=", i)
}
程序怎么会交替随机输出0和1呢?

原因是golang select机制(https://golang.org/ref/spec#Select_statements):

检查每个case语句
如果有任意一个chan是send or recv read,那么就执行该block
如果多个case是ready的,那么随机找1个并执行该block
如果都没有ready,那么就block and wait
如果有default block,而且其他的case都没有ready,就执行该default block

问答3:

package main
import "fmt"

func main() {
    jobs := make(chan int, 5)
    done := make(chan bool)

    go func() {
        for {  
            j, more := <-jobs
            if more {
                fmt.Println("received job", j)
            } else {
                fmt.Println("received all jobs")
                done <- true
                return
            }
        }
    }()

    for j := 1; j <= 3; j++ {
        jobs <- j
        fmt.Println("sent job", j)
    }
    close(jobs)
    fmt.Println("sent all jobs")

    <-done
}

关闭的channel仍可读取?channel特性:一个已经被关闭的 channel 永远都不会阻塞,但不能再向这个 channel 发送数据,不过仍然可以尝试从 channel 中获取值,直至读完剩余数据,而后才开始返回对应channel类型的零值.

参考:绝妙的 channel#http://blog.csdn.net/kjfcpua/article/details/18263839

//timer

<-timer.C 是直到这个定时器Stop()之前,将一直阻塞,除非timer时间到期接收到了新的数据(Time),即timer过期.

//syscall.Exec 参数疑问

syscall.Exec(binary, args, env)中的args其实只用到了args[1:],即args[0]会被忽略

//url encode

url.QueryEscape("我爱golang")

//无缓冲channel,先要有读否则写阻塞

    N:=time.Duration(0) //尝试修改N的值,看结果
    messages := make(chan string)


    go func() { messages <- "ping" 
println(1)}()

    time.Sleep(N*time.Second)
    msg := <-messages
    fmt.Println(msg)

获取上传文件大小:

下面的大小文件是针对存放数据的缓冲区而言.


// 获取文件大小的接口,for 小文件保存在内存中
type Size interface {
    Size() int64
}
// 获取文件信息的接口,for 大文件,在虚拟内存中
type Stat interface {
    Stat() (os.FileInfo, error)
}
if statInterface, ok := file.(Stat); ok {
    fileInfo, _ := statInterface.Stat()
    fmt.Fprintf(w, "上传文件的大小为: %d", fileInfo.Size())
}
if sizeInterface, ok := file.(Size); ok {
    fmt.Fprintf(w, "上传文件的大小为: %d", sizeInterface.Size())
}

//new

new(T)会为T类型分配内存,其值为零值,并且返回它的地址;想同时初始化可用&T.


© 著作权归作者所有

共有 人打赏支持
陈好

陈好

粉丝 12
博文 123
码字总数 32990
作品 0
杭州
程序员
golang 高效字符串拼接

golang 高效字符串拼接 It event poll2016-03-28545 阅读 golang字符串 虽然方便,但是使用+=操作符并不是在一个循环中往字符串末尾追加字符串最有效的方式。 一个有效的方式是准备好一个字符...

It event poll ⋅ 2016/03/28 ⋅ 0

Golang seek,tell

Golang seek,tell It event poll2016-03-28465 阅读 goseek 习惯了php中的seek和tell,转到golang时突然发现只有Seek发现,tell方法不见了。google了一下,发现了tell的实现方法: File.See...

It event poll ⋅ 2016/03/28 ⋅ 0

[每日一题]对比Java中的String、StringBuffer、StringBuilder

今天来个简单的题目,轻松一下:) 相信很多人对这个问题都不陌生,只要是个Java程序员,肯定就用过这几个类:1、String是个不可变对象,这就意味着每次字符串拼接都是创建了新的实例2、Str...

UlricQin ⋅ 2014/09/25 ⋅ 0

《Go编程基础》视频教程

借用 Asta谢(谢大)在《Go Web编程》一书中的话,出本套教程并不代表我自身的能力有多强,而是我愿意将自己在学习过程中积累到的知识分享给大家,并结合自己遇到的一些坑爹经历来讲解如何处...

无闻 ⋅ 2013/03/25 ⋅ 18

博客阅读整理一

(部分文章是系列文章,可在原文博客查找) Java ClassLoader, JavaAgent, Aspectj Weaving一站式扫盲帖:主要总结了ClassLoader、java代理、反射相关的知识点 jdbc实现篇-源码:介绍了jdbc的源...

oO脾气不坏Oo ⋅ 2015/10/17 ⋅ 0

Node.js与Golang使用感受与小结【一】

Node.js与Golang使用感受与小结 目录 一、互联网的基石TCP/IP协议 二、HTTP服务器编写与编程语言无关 三、构建HTTP服务器需要掌握的知识点 四、HTTP协议基础 五、Node.js简介 六、是前端选择...

念念之间 ⋅ 2013/05/22 ⋅ 8

访问Linux服务器集群工具--TeleportTool

Teleport是通过SSH或HTTPS远程访问Linux服务器集群的工具。不同于传统的基于密钥的访问,Teleport使团队能够很容易地采取以下做法: 通过使用群集的证书颁发机构(CA)可避免在第一次使用时发...

匿名 ⋅ 2016/03/25 ⋅ 0

未整理的一些知识点

字节 上传文件大小限制 字节换算兆 字节(byte) 到 兆(M)的 换算 1的20次方为一兆(M) 所以一般看到写限制大小如 那么表示的就是32兆 cgo 编译 cgo 需要一些gcc 来进行编译 go 支持交叉编译, ...

solate ⋅ 2016/08/28 ⋅ 0

『Go 语言学习专栏』-- 第五期

大家好,我叫谢伟,是一名程序员。 我正在着手扎实学习 golang , 这个专栏是我的输出整理文章。 希望能带有心人一起学习 golang , 力求从入门到中级程序员水平。 我们已经研究了: Golang 环...

谢小路 ⋅ 05/11 ⋅ 0

Golang资料集

该资源的github地址:Qix 《Platform-native GUI library for Go》 介绍:跨平台的golang GUI库,支持Windows(xp以上),Unix,Mac OS X(Mac OS X 10.7以上) 《Gopm 快速入门》 介绍:Gopm(Go 包管...

ty4z2008 ⋅ 2016/03/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 31分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 51分钟前 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部