不灭的焱

革命尚未成功,同志仍须努力 下载Java21

作者:AlbertWen  添加时间:2017-10-29 10:27:58  修改时间:2026-06-16 22:00:12  分类:21.Go语言编程  编辑

JSON 是一种数据格式描述语言。以 key 和 value 构成的哈系结构,类似 Javascript 中的对象,python 中的字典。通常 json 格式的 key 是字符串,其值可以是任意类型,字串,数字,数组或者对象结构。更多关于 Json 的可以访问 JSON 了解。

数据结构 map

json 源于 Javascript 的对象结构,golang 中有直接对应的数据结构 map,可是 golang 的 map 也是 key-value 结构,同时 struct 结构体也可以描述 json。当然,对于 json 的数据类型,go 也会有对象的结构所匹配。大致对应关系如下:

数据类型 JSON Golang
字串 string string
整数 number int64
浮点数 number flaot64
数组 arrary slice
对象 object struct
布尔 bool bool
空值 null nil
作者:AlbertWen  添加时间:2017-10-29 10:19:33  修改时间:2026-06-17 11:51:12  分类:21.Go语言编程  编辑

命令 go env 用于打印 Go 语言的环境信息。其中的一些信息我们在之前已经多次提及,但是却没有进行详细的说明。在本小节,我们会对这些信息进行深入介绍。我们先来看一看 go env 命令情况下都会打印出哪些 Go 语言通用环境信息。

表0-25 go env 命令可打印出的 Go 语言通用环境信息

名称 说明
CGO_ENABLED 指明cgo工具是否可用的标识。
GOARCH 程序构建环境的目标计算架构。
GOBIN 存放可执行文件的目录的绝对路径。
GOCHAR 程序构建环境的目标计算架构的单字符标识。
作者:AlbertWen  添加时间:2017-10-29 09:17:16  修改时间:2026-06-18 10:55:47  分类:21.Go语言编程  编辑

一、类型(Type)

反射(reflect)让我们能在运行期探知对象的类型信息和内存结构,这从一定程度上弥(mi)补了静态语言在动态行为上的不足。同时,反射还是实现元编程的重要手段。

和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的。反射操作所需要的全部信息都源自接口变量。接口变量除存储自身类型外,还会保存实际对象的类型数据。

func TypeOf(i interface{}) Type
func ValueOf(i interface{}) Value

这 两个 反射入口函数,会将任何传入的对象转换为接口类型。

作者:AlbertWen  添加时间:2017-10-29 21:00:06  修改时间:2026-06-18 00:46:21  分类:21.Go语言编程  编辑

注意:这些“坑”不是bug,只是自己当时没搞明白。

用到的框架为 Beego

1、字典 map 是“引用类型”,本身就是指针,作为参数传递时,直接传 map 变量名即可(不要传 map 变量指针)。

在调用方法内,如果修改了 map 变量值,外部的 map 变量值也会被改变的!

作者:AlbertWen  添加时间:2017-11-19 18:27:20  修改时间:2026-06-18 22:56:31  分类:21.Go语言编程  编辑

如何控制 for 循环一段时间超时自动退出呢?思路很简单,就是在 for 循环中使用 select 监听 channel,代码如下:

package main

import (
	"fmt"
	"time"
)

func main() {
	timeout := time.After(time.Second * 10)
	finish := make(chan bool)
	count := 1
	go func() {
		for {
			select {
			case <-timeout:
				fmt.Println("timeout")
				finish <- true
				return
			default:
				fmt.Printf("haha %d\n", count)
				count++
			}
			time.Sleep(time.Second * 1)
		}
	}()

	<-finish

	fmt.Println("Finish")
}

这里设置 for 循环 10s 超时。

作者:AlbertWen  添加时间:2017-10-29 09:14:50  修改时间:2026-06-17 18:24:42  分类:21.Go语言编程  编辑

上一篇文章 说到了 Golang 中的反射的一些基本规则,重点就是文章中最后的三点,但是这篇文章并没有说如何在反射中调用函数和方法,这就是接下来要说的。

反射中调用 函数

众所周知,Golang 中的函数是可以像普通的 int、float 等类型变量那样作为值的,例如:

package main

import "fmt"

func hello() {
	fmt.Println("Hello world!")
}

func main() {
	hl := hello
	hl()
}

prints:

hello world!

既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量是一样的,在反射中 函数 和 方法 的类型(Type)都是 reflect.Func,如果要调用函数的话,可以通过 Value 的 Call() 方法,例如:

func main() {
	hl := hello
	fv := reflect.ValueOf(hl)
	fmt.Println("fv is reflect.Func ?", fv.Kind() == reflect.Func)
	fv.Call(nil)
}

prints:

fv is reflect.Func? true
hello world!

Value 的 Call() 方法的参数是一个 Value 的 slice,对应的反射函数类型的参数,返回值也是一个 Value 的 slice,同样对应反射函数类型的返回值。通过这个例子,相信你一看就明白了:

func prints(i int) string {
	fmt.Println("i =", i)
	return strconv.Itoa(i)
}

func main() {
	fv := reflect.ValueOf(prints)
	params := make([]reflect.Value, 1)                 // 参数
	params[0] = reflect.ValueOf(20)                    // 参数设置为20
	rs := fv.Call(params)                              // rs作为结果接受函数的返回值
	fmt.Println("result:", rs[0].Interface().(string)) // 当然也可以直接是 rs[0].Interface()
}

prints:

i = 20
result: 20
作者:AlbertWen  添加时间:2017-10-29 10:23:09  修改时间:2026-06-16 19:58:27  分类:21.Go语言编程  编辑
作者:AlbertWen  添加时间:2017-11-01 14:44:31  修改时间:2026-06-18 20:53:51  分类:21.Go语言编程  编辑

有时候 go get 比较慢,可以考虑用迅雷等下载工具下载下来,然后再本地安装,

如:code.google.com/p/go.net/websocket,如何安装这些离线包?

先在你的 GOPATH 目录(如果不懂 GOPATH,请先弄懂)下,创建目录 src

mkdir sr
作者:AlbertWen  添加时间:2017-10-29 09:51:18  修改时间:2026-06-18 10:53:35  分类:21.Go语言编程  编辑

Go 精简(合并)了流控制语句,虽然某些时候不够便捷,但够用。

if...else...

条件表达式值必须是布尔类型,可省略括号,且左花括号不能另起一行。

作者:AlbertWen  添加时间:2017-10-29 20:39:37  修改时间:2026-06-17 11:34:55  分类:21.Go语言编程  编辑

用 glide 下载 goim 的依赖包时报错,提示: 

code.google.com/p/log4go 找不到,即下载失败