Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【译】golang 可变参数函数终极指南

【译】golang 可变参数函数终极指南

作者头像
goodspeed
发布于 2020-12-22 02:54:31
发布于 2020-12-22 02:54:31
3.5K00
代码可运行
举报
文章被收录于专栏:厉害了程序员厉害了程序员
运行总次数:0
代码可运行

使用常用模式学习关于go语言可变参数函数的一切

Ultimate Guide to Go Variadic Functions 原文地址 https://blog.learngoprogramming.com/golang-variadic-funcs-how-to-patterns-369408f19085

什么是可变参数函数?

可变参数函数是指传入参数是可变数量(0到更多)的函数。在输入的变量类型前面的省略号(三点)前缀即构成一个有效的变量。

2

声明一个可变参数名为“ names”,类型为string 的可变参数函数

一个简单的可变参数函数

这个 func 以字符串的形式返回传递的参数,字符串之间用空格分隔。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func toFullname(names ...string) string {
  return strings.Join(names, " ")
}

你可以传入零个或多个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
toFullname("carl", "sagan")// output: "carl sagan"
toFullname("carl")// output: "carl"
toFullname()// output: ""

什么时候使用可变参数函数?

  • 省略创建仅作为函数参数创建临时 slice 变量
  • 当输入参数的长度未知时
  • 表达你增加可读性的意图

例子:

看看 Go Stdlibfmt. Println 函数,就会明白它是如何使自己变得易于使用的。

它使用可变参数函数接受可选的输入参数数目。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Println(a ...interface{})

如果它不是一个可变参数函数,它看起来会是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Println(params []interface{})

你需要传递一个 slice 才能使用它ーー verbose,是的! :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fmt.Println([]interface{}{"hello", "world"})

相比而言,在可变参数函数形式中,它的使用是简单的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fmt.Println("hello", "world")
fmt.Println("hello")
fmt.Println()

在这之后的部分,将会介绍一些关于 可变参数函数 的细节和常用模式的例子。

切片与可变参数函数

可变参数在函数中会被转换为“新的”切片。可变参数实际上是 slice 类型的参数的语法糖。

3

不传入参数

如果不向其传递任何值,就相当于向可变参数函数传递了 nil 切片。

4

所有非空切片都有内建数组,而 nil 片则没有。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func toFullname(names ...string) []string {
  return names
}

// names 内建数组为: nil

但是,当你向可变参数函数添加参数时,它将创建一个与你传入参数相关联的数组,而不再是一个空切片。

go语言内置函数append 将参数追加到现有的slice,并返回。append 也是一个可变参数函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func toFullname(names ...string) []string {
  return append(names, "hey", "what's up?")
}

toFullname()

// output: [hey what's up?]

如何传递一个切片?

通过将可变参数运算符... 加在现有切片后,可以将其传递给可变参数运算符。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names := []string{"carl", "sagan")}

toFullname(names...)// output: "carl sagan"

这等同于以下调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
toFullname("carl", "sagan")

但是,有一点不同: ,在函数中将直接使用传入的切片而不是创建新的切片。关于这一点,请参阅以下内容。

5

像下面这样,你也可以将数组作为可变参数函数的参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names := [2]string{"carl", "sagan"}
toFullname(names[:]...)

Passed slice’s spooky action at a distance

标题不知道怎么翻译...

假设你将一个 slice 作为参数传给一个可变参数函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dennis := []string{"dennis", "ritchie"}
toFullname(dennis...)

再假设你修改了函数中变量参数的第一项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func toFullname(names ...string) string {
  names[0] = "guy"
  return strings.Join(names, " ")
}

修改它也会影响原始的切片。“ dennis”切片现在变成了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[]string{"guy", "ritchie"}

而不是原始值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[]string{"dennis", "ritchie"}

因为传入的 slice 与 func 内部的 slice 共享相同的底层数组,所以在 func 内部改变 slice 的值也会影响传入的 slice:

6

如果你直接传递参数(不使用切片) ,就不会发生这种情况。

动态传递多个切片

假设你想在 slice 传递给 func 之前,在 slice 前面添加“ mr. ”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names := []string{"carl", "sagan"}

首先append 函数会创建一个新的切片,然后将names展开, 然后将值依次添加到新创建的切片上,然后再将展开的结果传给 toFullname 函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
toFullname(append([]string{"mr."}, names...)...)

// output: "mr. carl sagan"

这和下面的代码一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
names = append([]string{"mr."}, "carl", "sagan")
toFullname(names...)

// or with this:
toFullname([]string{"mr.", "carl", "sagan"}...)

// or with this—except passing an existing slice:
toFullname("mr.", "carl", "sagan")

返回传入的切片

不能使用可变参数作为返回结果类型,但是可以将其作为片返回。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func f(nums ...int) []int {
  nums[1] = 10
  return nums
}

当你将一个 slice 作为参数传入 f 时,它将返回一个相同的新 slice。传入和返回的切片是相关联的。两个中任意一个改变都会影响到另一个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nums  := []int{23, 45, 67}
nums2 := f(nums...)

这里,nums 和 nums2有相同的元素,因为它们都指向相同的底层数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nums  = []int{10, 45, 67}
nums2 = []int{10, 45, 67}

? 这段代码 包含关于 slice 基础数组的详细说明

扩展操作符反模式

如果你有一个 funcs,它们唯一的用途就是接受可变数量的参数,那么最好使用可变参数函数代替使用 slice。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Don't do this
toFullname([]string{"rob", "pike"}...)

// Do this
toFullname("rob", "pike")

运行代码

使用可变参数的长度

你可以使用可变参数的长度来改变函数的行为。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func ToIP(parts ...byte) string {
  parts = append(parts, make([]byte, 4-len(parts))...)  
  
  return fmt.Sprintf("%d.%d.%d.%d", 
    parts[0], parts[1], parts[2], parts[3])
}

ToIP func 将“ parts”作为可变参数,并使用 parts param 的长度返回默认值为0的字符串形式的 IP 地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ToIP(255)   // 255.0.0.0
ToIP(10, 1) // 10.1.0.0
ToIP(127, 0, 0, 1) // 127.0.0.1

运行代码

✪ 变量函数的签名

尽管可变参数函数是一种语法糖,但它的签名类型标识与接受切片的函数是不同的。

举个例子看一下字符串切片和 ...字符串的区别是什么?

一个可变参数函数的签名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func PrintVariadic(msgs ...string)// signature: func(msgs ...string)

非可变参数函数的签名:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func PrintSlice(msgs []string)// signature: func([]string)

它们的类型标识不一样,我们把它们赋值给变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
variadic := PrintVariadic   // variadic is a func(...string)
slicey := PrintSlice       // slice is a func([]string)

因此,其中一个不能替代另一个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slicey = variadic// error: type mismatch

运行代码

混合变量和非可变参数

你可以通过把非可变参数放在可变参数之前,将非可变参数与可变参数混合。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func toFullname(id int, names ...string) string {
  return fmt.Sprintf("#%02d: %s", id, strings.Join(names, " "))
}

toFullname(1, "carl", "sagan")// output: "#01: carl sagan"

但是,你不能将非可变参数放到可变参数之后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func toFullname(id int, names ...string, age int) string {}// error

运行代码

接受变量类型的参数

例如,Go Stdlib 的 Printf 函数,使用空接口类型接受任何类型的输入参数。你还可以使用空接口接受任意类型和任意数量的参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Printf(format string, a ...interface{}) (n int, err error) {
    /* this is a pass-through with a... */  
    return Fprintf(os.Stdout, format, a...)
}

fmt.Printf("%d %s %f", 1, "string", 3.14)    // output: "1 string 3.14"

为什么 Printf 只接受一个变量参数?

查看 Printf 的签名时,会发现它接受一个名为 format 的字符串和一个可变参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func Printf(format string, a ...interface{})

这是因为format是必需的参数。Printf 强制您提供它,否则代码将无法编译。

如果它通过一个可变参数接收所有参数,那么调用方可能没有提供必要的格式化程序参数,或者从可读性角度来看,它不会像这个参数那么明确。它清楚地标明了 Printf 需要什么

此外,调用时不传入变量参数“a”,它将防止 Printf 在 函数中创建一个不必要的切片,一个值为 nil 切片。This may not be a clear win for Printf but it can be for you in your own code

你也可以在自己的代码中使用相同的模式。

注意空接口类型

interface{}类型也称为空接口类型,这意味着它绕过了自身的 Go 静态类型语义检查。不必要地使用它会给你带来弊大于利的后果。

例如,它可能强制你使用reflection,这是一个运行时特性(instead of fast and safe — compile-time)。你可能需要自己查找类型错误,而不是依赖于编译器帮你找到它们。

在使用空接口之前要仔细考虑,依靠显式类型和接口来实现所需的行为。

将切片传递给具有空接口的可变参数

你不能将一个普通的切片传递给一个具有空接口类型的可变参数。具体原因请阅读这里。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hellos := []string{"hi", "hello", "merhaba"}

You expect this to work, but it doesn’t:

你可能期望这能生效,但事实并非如此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fmt.Println(hellos...)

因为,hello 是一个字符串,而不是一个空接口切片。可变参数或切片只能属于一种类型。

首先需要将 hellos slice 转换为一个空接口 slice:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var ihellos []interface{} = make([]interface{}, len(hello))for i, hello := range hellos {
  ihellos[i] = hello
}

Now, the expansion operator will work:

现在,扩展运算符将开始生效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fmt.Println(ihellos...)
// output: [hi hello merhaba]

运行代码

函数式编程方面

你还可以使用可变参数函数接受可变数目的函数。让我们声明一个新的 formatter func 类型。格式化程序 func 获取并返回一个字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type formatter func(s string) string

让我们声明一个可变参数函数,它接受一个字符串和数量可选的可格式化的类型,以便使用一些pipeline来格式化字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func format(s string, fmtrs ...formatter) string {
  for _, fmtr := range fmtrs {
    s = fmtr(s)
  }  return s
}

format(" alan turing ", trim, last, strings.ToUpper)// output: TURING

运行代码

您还可以使用channels、structs等来代替这种链式模式的函数。看* 这里 或者 这里 查看示例.

使用结果为slice的函数作为可变参数

让我们重复使用上面的“format func”来创建一个可重用的格式化管道构建器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func build(f string) []formatter {
  switch f {
    case "lastUpper":
      return []formatter{trim, last, strings.ToUpper}
    case "trimUpper":
      return []formatter{trim, strings.ToUpper}
    // ...etc
    default:
      return identityFormatter
  }
}

然后使用 expand 运算符运行它,最后将结果提供给格式 func:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
format(" alan turing ", build("lastUpper")...)// output: TURING

可变参数选项模式

You may have already been familiar with this pattern from other OOP langs and this has been re-popularized again in Go by Rob Pike here back in 2014. It’s like the visitor pattern.

你可能已经熟悉这种来自其他 OOP 语言的模式,这种模式在2014年 Rob Pike 的 Go 中再次流行起来。这就像是访客模式。

这个例子对你来说可能有点难。如果有不理解的请及时提问<作者不在,查看原文链接提问吧?>。

让我们创建一个 Logger,可以使用可选模式在运行时更改详细程度和前缀:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Logger struct {
  verbosity
  prefix string
}

使用一个可变的选项参数来改变logger的行为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (lo *Logger) SetOptions(opts ...option) {
  for _, applyOptTo := range opts {
    applyOptTo(lo)
  }
}

我们创建一些返回配置方法的函数,它们在一个闭包中改变 Logger 的操作行为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func HighVerbosity() option {
  return func(lo *Logger) {
    lo.verbosity = High
  }
}

func Prefix(s string) option {
  return func(lo *Logger) {
    lo.prefix = s
  }
}

现在,让我们用默认选项创建一个新的 Logger:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logger := &Logger{}

然后通过变量参数向记录器提供选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logger.SetOptions(
  HighVerbosity(), 
  Prefix("ZOMBIE CONTROL"),
)

现在让我们检查一下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
logger.Critical("zombie outbreak!")
// [ZOMBIE CONTROL] CRITICAL: zombie outbreak!

logger.Info("1 second passed")
// [ZOMBIE CONTROL] INFO: 1 second passed

运行代码

✪ 无穷无尽的精神食粮!

  • 在 Go 2中,有一些可变函数的行为的计划*这里, here 这里,及这里.
  • 你可以在 Go 语言标准文档里找到更正式的可变参数函数指南,这里, 这里, 这里 及这里.
  • 使用来自 c 的可变函数.
  • 你可以找到很多语言的可变参数函数声明这里.自由探索吧

好了,就到这了。谢谢你们的阅读。

参考链接

  • [1] Ultimate Guide to Go Variadic Functions 原文地址: https://blog.learngoprogramming.com/golang-variadic-funcs-how-to-patterns-369408f19085
  • [2] 类型标识: https://golang.org/ref/spec#Type_identity
  • [3] Go Stdlib 的 Printf: https://golang.org/src/fmt/print.go#L189
  • [4] reflection: https://blog.golang.org/laws-of-reflection
  • [5] 请阅读这里: https://golang.org/doc/faq#convert_slice_of_interface
  • [6] MultiReader: https://golang.org/pkg/io/#MultiReader
  • [7] text/template/parse: https://golang.org/src/text/template/parse/parse.go?s=1642:1753#L41
  • [8] visitor pattern: https://en.wikipedia.org/wiki/Visitor_pattern
  • `[9] 模式: https://commandcenter.blogspot.com.tr/2014/01/self-referential-functions-and-design.html
  • `[10]访客模式: https://en.wikipedia.org/wiki/Visitor_pattern
  • [11]https://github.com/golang/go/issues/15209
  • [12]https://github.com/golang/go/issues/18605: https://github.com/golang/go/issues/18605
  • `[13]https://github.com/golang/go/issues/19218*: https://github.com/golang/go/issues/19218
  • [14] https://golang.org/ref/spec#Passing_arguments_to_..._parameters
  • [15] https://golang.org/ref/spec#Appending_and_copying_slices
  • [16] https://golang.org/ref/spec#Type_identity
  • [17] 使用来自 c 的可变函数: https://sunzenshen.github.io/tutorials/2015/05/09/cgotchas-intro.html
  • [18] Variadic_function: https://rosettacode.org/wiki/Variadic_function
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 四月 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用驱动器X:中的光盘之前需要将其格式化,是否需要将其格式化?
移动硬盘、U盘或是硬盘分区打不开提示 '使用驱动器X:中的光盘之前需要将其格式化,是否需要将其格式化',盘里的数据非常重要怎么办?如何解决?数据还能恢复吗?如何修复?今天小编一一给你解答。遇到分区不打开的情况不要慌张,按照本文的方法操作即可妥善安处理该问题。
用户7704932
2020/09/17
3.4K1
如何删除U盘system volume information_u盘单独文件夹加密
情景:U盘中毒,U盘内的文件夹名称变成.exe后缀,且多出一个名为System Volume Information的文件夹,对U盘进行格式化后,所有文件消失,当拔出U盘,再次插入电脑时,发现System Volume Information文件夹再次出现。
全栈程序员站长
2022/10/02
5.2K1
电脑蓝屏错误代码0x000000ED_蓝屏代码0x000000ed
电脑蓝屏的原因很多,显示的电脑蓝屏也不一样,对应的修复电脑蓝屏的方法也不同。最近就有网友反映自己的电脑蓝屏代码0x000000ed怎么办,该怎么修复电脑蓝屏呢?今天小编就教下大家电脑蓝屏代码0x000000ed的解决方法。
全栈程序员站长
2022/11/09
8400
U盘损坏打不开,提示需【格式化】的解决办法【亲测有效】
解决方法: 在左下角开始菜单栏中搜索或是使用Win+R快捷键打开“运行”窗口,在窗口中输入cmd打开命令提示符窗口,在窗口输入“chkdsk I:/F”回车,此处I:代表的是U盘的盘符,大家可以根据自己电脑中的具体盘符修改。等待修复完成之后U盘就可以使用了。
宝耶需努力
2022/12/13
2.3K0
U盘损坏打不开,提示需【格式化】的解决办法【亲测有效】
图片介质受写入保护_写入保护
最近使用U盘,突然不能正常使用了,在U盘内新建文件夹,提示“介质受写入保护”无法创建文件,赶紧网上查找解决办法。查找的结果比解释比较全面的就是:
全栈程序员站长
2022/11/17
6.4K0
图片介质受写入保护_写入保护
U盘安装window系统[通俗易懂]
3. 进入老毛桃选择界面,选择生成PE系统。推荐win8,之前在一个戴尔电脑上使用win7 PE失败。
全栈程序员站长
2022/09/19
3.9K0
如何格式化 U 盘为 NTFS 格式?
是山河呀
2025/04/04
1.1K0
计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]
电脑蓝屏代码现象是我们在使用电脑中最常见的一种启动问题,令小白用户很头痛 。比如,我们在启动电脑的时候,它并没有正常地启动,屏幕反而一片蓝色,出现了一串奇怪的代码:0x000000ed,怎么办?下面,小编给大伙演示电脑蓝屏代码0x000000ed的修复流程。
全栈程序员站长
2022/11/10
4.4K0
计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]
U盘被分成了4个盘要怎么合并
2、然后在命令提示窗口下输入“diskpart“之后按回车“Enter",进入diskpart交互环境(注意“引号”不要输入,后面关于输入的命令都不含“”)。
天天Lotay
2023/10/15
9390
U盘被分成了4个盘要怎么合并
U盘格式化工具合集:6个免费的U盘格式化工具
在日常使用中,U盘可能会因为文件系统不兼容、数据损坏或使用需求发生改变而需要进行格式化。一个合适的格式化工具不仅可以清理存储空间,还能解决部分存储问题。本文为大家精选了6款免费的U盘格式化工具,并详细介绍它们的功能、使用方法、优缺点,帮助你轻松完成U盘格式化操作。
用户7704932
2024/12/30
1.9K0
U盘格式化工具合集:6个免费的U盘格式化工具
Windows无法完成格式化怎么办?5种解决方法
我们平时使用电脑的时候,经常会遇到需要格式化磁盘的情况,比如格式化硬盘、U盘、SD卡等存储设备。不论是出于什么原因进行格式化,我们有时候会遇到“Windows无法完成格式化”的错误提示,这样我们就无法将磁盘格式化。相信很多人都遇到过类似的问题,并且对这个问题感到困惑和无助。本期内容将针对这个问题,分析症状、可能的原因并给出多种解决方法,帮助大家顺利解决无法格式化问题。
用户7704932
2024/04/30
1.5K0
Windows无法完成格式化怎么办?5种解决方法
计算机主机后面板接口名称,i/o背板接口是计算机主机与什么连接的插座结合?…
usb不被电脑识别,如果是系统或系统自带的驱动的原因,可以按下面方法修复一下。 1、开机按f8进入安全模式后在退出,选重启或关机在开机,就可以进入正常模式(修复注册表)。 2、如果故障依旧,请你用系统自带的系统还原,还原到你没有出现这次故障的时候修复(如果正常模式恢复失败,请开机按f8进入到安全模式中使用系统还原)。 3、如果故障依旧,使用系统盘修复,打开命令提示符输入sfc /scannow 回车(sfc和/之间有一个空格),插入原装系统盘修复系统,系统会自动对比修复的。 4、如果故障依旧,在bios中设置光驱为第一启动设备插入系统安装盘按r键选择“修复安装”即可。 5、如果故障依旧,建议重装操作系统。 u盘插入电脑,电脑提示“无法识别的设备”故障诊断方法如下。 第1步:如果u盘插入电脑,电脑提示“无法识别的设备”,说明u盘的供电电路正常。接着检查u盘的usb接口电路故障。 第2步:如果u盘的usb接口电路正常,则可能是时钟电路有故障(u盘的时钟频率和电脑不能同步所致)。接着检测时钟电路中的晶振和谐振电容。 第3步:如果时钟电路正常,则是主控芯片工作不良。检测主控芯片的供电,如果供电正常,则是主控芯片损坏,更换即可。 另外还有一种原因,就是usb接口供电不足,可能是usb接口连接的外设太多造成供电不足。建议使用带电的usbhub或者使用usb转ps/2的转接头。还有可能windowsxp默认开启了节电模式,致使usb接口供电不足,使usb接口间歇性失灵。右击我的电脑/属性/硬件/设备管理器,双击“通用串行总线控制器”会到好几个“usb root hub”双击任意一个,打开属性对话框,切换到“电源管理”选项卡,去除“允许计算机关闭这个设备以节约电源”前的勾选,点击确定返回,依次将每个usb roothub的属性都修改完后重新启动电脑。usb设备就能恢复稳定运行了,频率尽量设低一些。 如果是有盘符而没有显示出来的,解决方法:右击我的电脑/管理/存储/磁盘管理,然后右击“可移动磁盘”图标”单击快捷菜单中的“更改驱动器和路径”选项,并在随后的界面中单击“添加”按钮,接下来选中“指派驱动器号”,同时从该选项旁边的下拉列表中选择合适的盘符,在单击确定即可。最后打开我的电脑,就能看到移动硬盘的盘符了。
全栈程序员站长
2022/07/12
7710
bt3硬盘安装_SD卡比U盘音质好
在U盘/SD卡上安装BT3 教程(激活成功教程无线路由信号密码必备) 其实网上关于BT3的教程很多,如果大家根据下面的教程安装不成功的话,可以再去百度一下其它的教程。 前几天写过一个帖子是关于如何用BT3激活成功教程路由信号的(点我查看),为了引起关注,放在了Win区。在那个帖子里我是将Bt3安装在了硬盘的D分区上,当时自己也是想安装到U盘上的,结果U盘太烂太老太慢,没有安装成功。 这次重新找了一个1G的SD卡,成功在1000H的机器上将Bt3安装在了SD卡上,以下是我的分享。 注:1000H的网卡是Ralink RT2790,可以在BT3上驱动起来(需要单独下载驱动模块),也可以使用spoonwep监听,但是不支持注入,故无法激活成功教程。偶目前只有1000H这一款机器,所以只在这款机器上介绍下如何安装BT3. 硬件准备:SD卡或者U盘一个,容量1G以上,笔记本或者台式机一个。 软件准备: 1. BT3光盘版或者U盘版的ISO镜像(迅雷很容易搜索到的,如果下面的链接无法下载,自己再用迅雷找一个),正常应该七八百M的样子:http://ftp.heanet.ie/mirrors/backtrack/bt3-final.iso 2. Flashboot绿色无毒加强版(网上很难找的,通常都报病毒,虽然是误报,但是用的不舒服,我这个不报病毒):在http://ddduck3000.ys168.com中的Flashboot目录里,下载那个Flashboot绿色无毒加强版。 3. Syslinux易饭修改版: 制作过程: 1. 运行Flashboot绿色无毒加强版,依次按照如下设置后,点击“Next”: “磁盘的创建类型”选择“将可引导的光盘创建一个副本到闪存盘上”; “光盘或者镜像文件的来源”选择“从本机或局域网载入镜像文件”,并点击“浏览”按钮设置ISO镜像的路径。 “选择输出类型”页面设置好磁盘驱动器,即你的U盘的盘符。 “目标USB磁盘的格式化类型”中先去掉“保留磁盘数据”前面的对号,然后选中“USB-ZIP”启动模式。 最后点击“完成”按钮就开始制作BT3可启动U盘,完成后会提示“Done”。 2. Flshboot制作完毕后,一定要进入U盘目录将里面的bt3文件夹更名为大写的BT3(这一点非常重要). 3. 利用syslinux在U盘建立linux引导。 解压下载的syslinux压缩包,用记事本打开里面的setup.bat(方法是在setup.bat上单击右键,选择用记事本打开),在syslinux后边添加空格和你的U盘盘符(别忘了冒号),例如你的U盘在E盘,那么添加完成后应该是这样的内容: syslinux E: 然后保存并关闭 。双击运行setup.bat(不会有任何提示)即完成。 最后到你的U盘下查看一下ldlinux.sys这个文件是否是11k,如果是即表示成功;如果是9K那就需要你检查下哪儿出错了。 下载 (24.08 KB) 2009-4-13 15:04 4. 重新启动机器,在BIOS中设置为从U盘启动;或者直接开机不停的按“Esc”键,直至出现启动设备选择菜单,选择从U盘设备启动。
全栈程序员站长
2022/11/10
1.3K0
U盘复制不了单个大于4G以上文件 无需格式化解决
由于FAT32文件系统只支持单文件4G以下,要放入单个容量超4G以上的文件需要用到NTFS文件系统,而很多U盘出厂厂家默认就是用FAT32的格式来的,所以很多朋友复制大的文件去U盘时经常遇到,U盘还有
Rookie
2018/07/02
7310
通过优启通制作U盘启动安装Windows系统「建议收藏」
通过优启通制作U盘启动安装Windows系统 (一)制作启动项,拷贝镜像(EASY U软件) 通过EASYU(优启通),制作启动盘,启动盘制作成功之后,在优启通主界面,模拟测试,选BIOS测试,若能进入,将win7的GHO镜像文件放入U盘.
全栈程序员站长
2022/09/07
7.9K0
通过优启通制作U盘启动安装Windows系统「建议收藏」
U盘无法格式化怎么办?
U盘是我们日常工作和生活中经常使用的便携数据存储设备,它可以轻松地存储和传输文件,是工作和学习的好帮手。然而,有时候我们会遇到U盘无法格式化的情况,很多人可能会对此问题感到手足无措。本期内容将为大家详细解析U盘无法格式化的原因及修复方法,希望能够帮助大家解决这个问题。
用户7704932
2024/06/13
3530
U盘无法格式化怎么办?
哪个u盘格式win和mac都能用 mac上插u盘怎么没反应
由于工作原因,很多人的u盘要在Mac系统和Windows系统之间共同使用,应该有很多用户遇到过u盘在Windows系统可以正常使用,但是u盘插入Mac电脑就遇到各种各样的问题,例如:插入没反应、无法写入等。遇到这种问题你是怎么解决的呢?本文就为大家讲解哪个u盘格式win和mac都能用,并为大家解释mac上插入u盘怎么没反应的内容。
用户9208731
2023/03/02
5.2K0
哪个u盘格式win和mac都能用 mac上插u盘怎么没反应
u盘多个分区合并起来教程
今天作死,弄u盘启动盘什么的,后来工具出错导致u盘莫名其妙少了2G,后来我查了下u盘的分区,居然有2G多被分出去了,于是想找个工具合并下分区,然而,悲剧的发现很多工具与我电脑不兼容,直到看到了这个方法。
泽泽社长
2023/04/17
1.7K0
u盘多个分区合并起来教程
惠普电脑如何设置u盘启动_惠普笔记本电脑怎么用u盘重装系统
惠普笔记本现在算是比较普遍,很多用户都会想给自己的惠普笔记本重装系统,那么惠普怎么重装系统呢?下面介绍一下惠普笔记本u盘系统安装步骤。
全栈程序员站长
2022/09/21
3.7K0
U盘替代光盘USB启动PE安装Xp系统的101%成功经验
  彻底抛弃光驱,U盘、光盘启动PE安装Windows Xp 101% 成功经验。
zhaoJian.Net
2023/02/24
2.7K0
推荐阅读
相关推荐
使用驱动器X:中的光盘之前需要将其格式化,是否需要将其格式化?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验